我有一个问题
SSLHandshakeException talking to a https Web service using Spring WebServiceTemplate

borodark回答

“无需将密钥导入密钥库。”

如果我们不提供密钥库,那么Httpclient将使用什么来发送SSL握手的客户端证书?

我需要在商务伙伴上调用Web服务-

a)使用公钥证书X使用SSL进行身份验证

b)使用公钥证书Y加密和签名SOAP消息

我想我需要将证书Y指定为以下内容:

<bean class="org.springframework.ws.soap.security.wss4j.Wss4jSecurityInterceptor">
    <property name="securementActions" value="Signature"/>
    <property name="securementSignatureKeyIdentifier" value="DirectReference"/>
    <property name="securementUsername" value="mycert"/>
    <property name="securementPassword" value="certpass"/>
    <property name="securementSignatureCrypto">
      <bean class="org.springframework.ws.soap.security.wss4j.support.CryptoFactoryBean">
        <property name="keyStorePassword" value="123456"/>
        <property name="keyStoreLocation" value="classpath:/keystore.jks"/>
      </bean>
    </property>
</bean>


我不确定如何/在何处为SSL握手指定证书X。我认为它是HttpClient,但在borodark发布的XML中看不到它。

请帮忙 !

最佳答案

在配置密钥库的xml文件中,您应该具有以下内容:

            <beans>
               <bean id="keyStoreHandler" class="org.springframework.ws.soap.security.xwss.callback.KeyStoreCallbackHandler">
               <property name="keyStore" ref="keyStore"/>
               <property name="privateKeyPassword" value="changeit"/>
           </bean>

           <bean id="keyStore" class="org.springframework.ws.soap.security.support.KeyStoreFactoryBean">
               <property name="location" value="classpath:keystore.jks"/>
               <property name="password" value="changeit"/>
           </bean>
       </beans>


提示是

     <property name="location" value="classpath:keystore.jks"/>


现在,您可以在密钥库中使用某个别名来进行ssl握手(这就是您在此处配置的别名),此外,安全策略还可以利用同一文件,但可以再次在securitypolicy文件中使用您可以指定其他别名..这样就可以解决问题。
考虑一下

    <property name="location" value="classpath:keystore.jks"/>


表示类路径,您可以使用其他形式来引用战争本身以外的资源,这使您可以更改证书而根本不用接触战争。

10-07 12:40