Я пытаюсь отправить запрос на существующий веб-сервис. Этот веб-сервис не управляется мной. Политика безопасности этого веб-сервиса требует, чтобы я отправил свою полную цепочку сертификатов в мой запрос 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 с типом value X509PKIPathv1 и keyReferenceType, который является Direct?
- Существуют ли другие реализации xws-security, которые предлагают это? Или я должен смотреть на совершенно другой подход, как Wss4j?
Я рассмотрел переписывание BinarySecurityToken, но это, вероятно, также предполагает переписывание подписи SignatureProcessor X509 в DSIG.