Служба CXF выдает WSSecurityException: сертификаты для расшифровки не найдены (KeyId)

Я работаю с приложением CXF-STS, следуя примеру из http://web-gmazza.rhcloud.com/blog/entry/cxf-sts-tutorial. Я могу сгенерировать утверждение SAML, но оно терпит неудачу, когда попадает к поставщику услуг.

У меня есть PasswordCallback at Service как,

@Override
    public void handle(Callback[] callbacks) throws IOException,
            UnsupportedCallbackException {
        for (int index = 0; index < callbacks.length; index++) {
            WSPasswordCallback pc = (WSPasswordCallback)callbacks[index];
            int usage = pc.getUsage();
            if (usage == WSPasswordCallback.DECRYPT || usage == WSPasswordCallback.SIGNATURE) {
                String pass = (String) passwords.get(pc.getIdentifier());
                if (pass != null) {
                    pc.setPassword(pass);
                    return;
                }
            }
        }

Тип WSPasswordCallback найден как SECRETKEY или что-то еще, кроме not WSPasswordCallback.DECRYPT or WSPasswordCallback.SIGNATURE

Идентификатор при отладке в приведенном выше коде отображается как _0bfaf221-9588-4033-b3fa-db9ecbd478fe или какой-либо случайный текст. У поставщика услуг у меня есть симметричная привязка с типом ключа - SymmetricKey как

<sp:SymmetricBinding>
               <wsp:Policy>
                  <sp:ProtectionToken>
                     <wsp:Policy>
                        <sp:IssuedToken sp:IncludeToken="http://docs.oasis-open.org/ws-sx/ws-securitypolicy/200702/IncludeToken/AlwaysToRecipient">
                           <sp:RequestSecurityTokenTemplate>
                              <t:TokenType>http://docs.oasis-open.org/wss/oasis-wss-saml-token-profile-1.1#SAMLV1.1</t:TokenType>
                              <t:KeyType>http://docs.oasis-open.org/ws-sx/ws-trust/200512/SymmetricKey</t:KeyType>
                              <t:KeySize>256</t:KeySize>
                           </sp:RequestSecurityTokenTemplate>
                           <wsp:Policy>
                              <sp:RequireInternalReference/>
                           </wsp:Policy>
                           <sp:Issuer>
                              <wsaw:Address>http://localhost:8080/StsService/services/STS</wsaw:Address>
                              <wsaw:Metadata>
                                 <wsx:Metadata>
                                    <wsx:MetadataSection>
                                       <wsx:MetadataReference>
                                          <wsaw:Address>http://localhost:8080/StsService/services/STS/mex</wsaw:Address>
                                       </wsx:MetadataReference>
                                    </wsx:MetadataSection>

На стороне STS я предоставляю открытый ключ поставщика услуг для шифрования как

<bean id="utSTSProperties"
         class="org.apache.cxf.sts.StaticSTSProperties">
        <property name="signaturePropertiesFile" value="springconfig/keystore.properties"/>
        <property name="signatureUsername" value="${stskeyalias}"/>
        <property name="callbackHandlerClass" value="com.security.sts.security.StsPasswordCallbackHandler"/>
        <property name="encryptionUsername" value="${serverkeyalias}" />
        <property name="encryptionPropertiesFile" value="springconfig/keystore.properties" />
        <property name="issuer" value="cieron"/>
    </bean>

Последующие предложения по адресу http://mail-archives.apache.org/mod_mbox/cxf-users/201112.mbox/%3CCAB8XdGABkphcJXTbtVpDfBZ3KcymtZYX-Rmv0H8QiuwYNHP5OQ@mail.gmail.com%3E и http://coheigea.blogspot.in/2011/05/ws-trust-sample-in-talend-service.html

Я не уверен, как симметричный ключ доступен для поставщика услуг, поскольку он зашифрован.

Я проверил все связанные файлы, и все кажется целым. У меня есть мой пример на https://github.com/sampleref/CXFSecurity для справки. Я сталкиваюсь с ошибкой при запуске клиента с отображением журналов поставщика услуг

at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
    at java.lang.Thread.run(Thread.java:722)
Caused by: org.apache.wss4j.common.ext.WSSecurityException: No certificates were found for decryption (KeyId)
    at org.apache.wss4j.dom.processor.EncryptedKeyProcessor.getCertificatesFromEncryptedKey(EncryptedKeyProcessor.java:372)
    at org.apache.wss4j.dom.processor.EncryptedKeyProcessor.handleToken(EncryptedKeyProcessor.java:137)
    at org.apache.wss4j.dom.saml.WSSSAMLKeyInfoProcessor.processSAMLKeyInfo(WSSSAMLKeyInfoProcessor.java:80)
    at org.apache.wss4j.common.saml.SAMLUtil.getCredentialFromKeyInfo(SAMLUtil.java:225)
    at org.apache.wss4j.common.saml.SAMLUtil.getCredentialFromSubject(SAMLUtil.java:152)
    at org.apache.wss4j.common.saml.SamlAssertionWrapper.parseSubject(SamlAssertionWrapper.java:672)
    at org.apache.wss4j.dom.processor.SAMLTokenProcessor.handleSAMLToken(SAMLTokenProcessor.java:193)
    at org.apache.wss4j.dom.processor.SAMLTokenProcessor.handleToken(SAMLTokenProcessor.java:79)
    at org.apache.wss4j.dom.WSSecurityEngine.processSecurityHeader(WSSecurityEngine.java:427)
    at org.apache.cxf.ws.security.wss4j.WSS4JInInterceptor.handleMessage(WSS4JInInterceptor.java:257)

Сертификаты не найдены. Пожалуйста, дайте несколько предложений

Спасибо


person Chakri    schedule 16.07.2014    source источник


Ответы (1)


Похоже, что ваши хранилища ключей STS + Service содержат разные ключи...

СТС:

serverkeyalias, 13 июля 2014 г., trustCertEntry, отпечаток сертификата (SHA1): 45:4E:EB:4C:35:89:17:E6:A4:0E:94:FB:61:9B:81:83:FB: А0:82:В1

Сервер:

serverkeyalias, 12 июля 2014 г., PrivateKeyEntry, отпечаток сертификата (SHA1): B8:E6:BA:A5:07:24:69:B3:5E:08:2F:A3:CE:97:D8:2E:E2: Е1:31:F8

Колм.

person Colm O hEigeartaigh    schedule 18.07.2014
comment
Спасибо, Колм, за выявление ошибки и предложения. Наконец-то я смог настроить полный поток WSC-›STS-›WSC-›WSP. - person Chakri; 18.07.2014