#java #spring #web-services #cxf #ws-security
#java #spring #веб-сервисы #cxf #ws-безопасность
Вопрос:
Я написал службу ws-security, которая пока работает очень хорошо. У меня есть только одна проблема. Мой сервис может быть пользователем только с одного клиента … это из-за service-config.xml где мне нужно указать явного пользователя, для которого я хочу зашифровать исходящее сообщение. Мои компоненты для службы выглядят следующим образом
<bean id="TimestampSignEncrypt_Request" class="org.apache.cxf.ws.security.wss4j.WSS4JInInterceptor">
<constructor-arg>
<map>
<!-- Use this action order for local clients -->
<entry key="action" value="Timestamp Signature Encrypt"/>
<!-- Use this action spec for WCF clients
<entry key="action" value="Signature Encrypt Timestamp"/>
-->
<entry key="signaturePropFile"
value="de/narz/apacheCXFTest/helloWorld/keyManagement/config/alice.properties"/>
<entry key="decryptionPropFile"
value="de/narz/apacheCXFTest/helloWorld/keyManagement/config/bob.properties"/>
<entry key="passwordCallbackClass"
value="de.narz.apacheCXFTest.helloWorld.passwordHandling.PasswordCallbackHandler"/>
</map>
</constructor-arg>
</bean>
<!--
WSS4JOutInterceptor for encoding and signing the SOAP response.
There are some attacks that exploit the "cbc" mode of a Symmetric Encryption Algorithm. WSS4J has support for
"gcm" mode algorithms as well. This can be specified via WSHandlerConstants.ENC_SYM_ALGO
("encryptionSymAlgorithm"), for example to "http://www.w3.org/2009/xmlenc11#aes128-gcm".
-->
<bean id="TimestampSignEncrypt_Response" class="org.apache.cxf.ws.security.wss4j.WSS4JOutInterceptor">
<constructor-arg>
<map>
<entry key="action" value="Timestamp Signature Encrypt"/>
<entry key="user" value="bob"/>
<entry key="signaturePropFile"
value="de/narz/apacheCXFTest/helloWorld/keyManagement/config/bob.properties"/>
<entry key="encryptionPropFile"
value="de/narz/apacheCXFTest/helloWorld/keyManagement/config/alice.properties"/>
<entry key="signatureKeyIdentifier" value="DirectReference"/>
<entry key="encryptionUser" value="Alice"/>
<entry key="passwordCallbackClass"
value="de.narz.apacheCXFTest.helloWorld.passwordHandling.PasswordCallbackHandler"/>
<entry key="signatureParts"
value="{Element}{http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd}Timestamp;{Element}{http://schemas.xmlsoap.org/soap/envelope/}Body"/>
<entry key="encryptionParts"
value="{Element}{http://www.w3.org/2000/09/xmldsig#}Signature;{Content}{http://schemas.xmlsoap.org/soap/envelope/}Body"/>
<entry key="encryptionSymAlgorithm"
value="http://www.w3.org/2001/04/xmlenc#tripledes-cbc"/>
</map>
</constructor-arg>
</bean>
что я могу сделать, чтобы заставить службу самостоятельно определять клиентскую алису? Таким образом, мой клиент alice — единственный, который может взаимодействовать с сервером. Я хочу сохранить несколько клиентских ключей в моем хранилище ключей, и служба сама определит, какой ключ использовать.
было бы здорово, если бы кто-нибудь мог мне помочь. спасибо
Ответ №1:
Вместо указания «encryptionUser» вместо «Alice» в вашем сервисе, вы можете вместо этого указать «encryptionUser» вместо «useReqSigCert». Это специальное значение, которое указывает CXF / WSS4J использовать сертификат подписи клиента для шифрования.
Colm.