Я пытаюсь отправить запрос существующему веб-сервису. Этот веб-сервис не регулируется мной. Политика безопасности этого веб-сервиса требует, чтобы я отправил полную цепочку сертификатов в моем запросе SOAP. Моя цепочка сертификатов содержит 3 сертификата. Нет никаких проблем с настройкой цепочки сертификатов, так как я могу проверить ее действительность (и сделал это).
Конфигурация безопасности для этой настройки (= отправка полной цепочки сертификатов в запросе):
<xwss:Sign id="signature">
<xwss:X509Token
certificateAlias="alias"
keyReferenceType="Direct"
valueType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-x509-token-profile-1.0#X509PKIPathv1" />
</xwss:Sign>
Я пытаюсь добиться этого с помощью Spring-WS. Spring-WS использует spring-ws-security для обеспечения безопасности. Spring-ws-security делегирует xws-security.
<dependency>
<groupId>org.springframework.ws</groupId>
<artifactId>spring-ws-security</artifactId>
<version>2.1.0.RELEASE</version>
<exclusions>
<exclusion>
<groupId>org.apache.ws.security</groupId>
<artifactId>wss4j</artifactId>
</exclusion>
<exclusion>
<groupId>com.sun.xml.wsit</groupId>
<artifactId>xws-security</artifactId>
</exclusion>
</exclusions>
</dependency>
Xws-security поставляется в двух вариантах:
<dependency>
<groupId>com.sun.xml.wsit</groupId>
<artifactId>xws-security</artifactId>
<version>1.3.1</version>
</dependency>
а также
<dependency>
<groupId>com.sun.xml.wss</groupId>
<artifactId>xws-security</artifactId>
<version>3.0</version>
</dependency>
Первый используется Spring WS Security. Второй — наследие.
Применение моей конфигурации XWSS в xws-security выполняется в классе BinarySecurityToken. BinarySecurityToken имеет поле с именем
valueType
В JavaDoc valueType говорится, что он поддерживает X509PKIPathv1 (среди прочего). Однако это не так, как заявил этот сеттер:
protected void setValueType(String valueType) {
if (!(MessageConstants.X509v3_NS.equals(valueType)||MessageConstants.X509v1_NS.equals(valueType))) {
log.log(Level.SEVERE,"WSS0342.valtype.invalid");
throw new RuntimeException("Unsupported value type: " + valueType);
}
this.valueType = valueType;
}
Класс MessageConstants не имеет (даже) статического для X509PKIPathv1. Когда я запускаю свой код, я получаю ожидаемый результат:
Unsupported value type: http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-x509-token-profile-1.0#X509PKIPathv1
Мне удалось просмотреть исходный код устаревшего com.sun.xml.wss.xws-security:3.0
. Несмотря на мои усилия, я не нашел исходный код com.sun.xml.wsit.xws-security-1.3.1
. Однако я считаю, что код тот же. Я попробовал обе библиотеки, и обе дают мне одно и то же исключение. Я попробовал это, используя spring-ws-security по умолчанию и используя явные объявления зависимостей для обеих библиотек (по одному).
Мои вопросы:
- Кто-нибудь смог использовать xws-security для создания подписи X509 с типом значения X509PKIPathv1 и типом keyReferenceType, который является прямым?
- Существуют ли другие реализации xws-security, которые предлагают это? Или мне следует взглянуть на совершенно другой подход, такой как Wss4j?
Я рассматривал возможность перезаписи BinarySecurityToken, но это, вероятно, также подразумевало бы переписывание подписи X509 SignatureProcessor в DSIG.