我有一个问题
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"/>
表示类路径,您可以使用其他形式来引用战争本身以外的资源,这使您可以更改证书而根本不用接触战争。