Я пытаюсь отправить запрос на существующий веб-сервис. Этот веб-сервис не управляется мной. Политика безопасности этого веб-сервиса требует, чтобы я отправил свою полную цепочку сертификатов в мой запрос 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.