我可以指导您完成所有必需的步骤,但存在差距。请查看我的答案,以便我可以为您提供正确的配置链接
双向 SSL 是带有客户端证书身份验证的 TLS 连接。它与签署肥皂请求不同(证书用于在 TLS 中对客户端进行身份验证一次(请参阅双向 SSL 说明 https://stackoverflow.com/questions/10725572/two-way-ssl-clarification),并签署肥皂是在肥皂主体上进行数字签名并将其包含在肥皂头中)
你需要很多东西(请检查)
管理 TLS 连接的服务器。您已选择 tomcat。没问题,但我认为将 apache 与反向代理放在一起更简单
SSL 证书,最好由受信任的实体颁发。如果没有,您可以生成自己的证书,但在后续步骤中需要额外配置
用于配置客户端信任库的 SSL 证书(x509 证书)的公钥
要在 TLS 连接中进行身份验证的客户端证书
openssl 软件用于生成证书
我还推荐使用这个应用程序(http://portecle.sourceforge.net/)到 http://portecle.sourceforge.net/)to修改 JKS 密钥库而不是地狱
配置服务器
1)生成SSL证书(server.crt和server.key)
如果有,请转到2)。如果没有,请遵循http://www.akadia.com/services/ssh_test_certificate.html http://www.akadia.com/services/ssh_test_certificate.html
openssl genrsa -des3 -out server.key 1024
openssl req -new -key server.key -out server.csr
cp server.key server.key.org
openssl rsa -in server.key.org -out server.key
openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt
您将获得 server.crt 和 server.key
2)转换为PKCS12(server.pfx)配置会更简单
如果已经给您提供了证书,也会给您一个CACert。
openssl pkcs12 -export -out server.pfx -inkey server.key -in server.crt -certfile CACert.crt
3)生成客户端证书(client.p12)(摘自https://gist.github.com/mtigas/952344 https://gist.github.com/mtigas/952344)
创建证书颁发机构根
openssl genrsa -des3 -out ca.key 4096
openssl req -new -x509 -days 365 -key ca.key -out ca.crt
Create the Client Key and CSR
openssl genrsa -des3 -out client.key 4096
openssl req -new -key client.key -out client.csr
# self-signed
openssl x509 -req -days 365 -in client.csr -CA ca.crt -CAkey ca.key -set_serial 01 -out client.crt
Convert Client Key to PKCS
openssl pkcs12 -export -clcerts -in client.crt -inkey client.key -out client.p12
4)配置服务器信任库(truststore.jks)
Open portecle
New KeyStore -> JKS
Import trusted certificate. Import client.crt and ca.crt
Save as truststore.jks
5)使用客户端身份验证配置tomcat SSL
https://tomcat.apache.org/tomcat-7.0-doc/config/http.html#SSL_Support https://tomcat.apache.org/tomcat-7.0-doc/config/http.html#SSL_Support类似于 Prashant Thorat 答案
<Connector
port="443"
protocol="org.apache.coyote.http11.Http11NioProtocol"
connectionTimeout="20000"
redirectPort="8443"
scheme="https"
secure="true"
SSLEnabled="true"
sslProtocol="TLS"
keystoreFile="server.pfx"
keystorePass="thepassword"
keystoreType="PKCS12"
truststoreFile="truststore.jks"
truststorePass="thepassword"
truststoreType="JKS"
clientAuth="true">
配置客户端
1)创建客户端信任库(client-truststore.jks)打开 portecle,创建一个新的 JKS 并将服务器证书 (server.crt) 包含为受信任的 (
2)创建客户端密钥库(client-keystore.jks)打开 portecle,创建一个新的 JKS 并导入密钥/对。使用 client.p12 或 client.crt 和 client.key。还导入 ca.crt
3)配置弹簧我从来没有做过WS spring,但是用过CXF。这是同一个概念
您不需要签署 SOAP,只需要带有客户端身份验证的 TLS 连接,因此无需进行肥皂配置
按照本教程操作https://secinto.wordpress.com/2013/01/21/spring-and-webservices-how-to-use-ssltls-client-authentication/ https://secinto.wordpress.com/2013/01/21/spring-and-webservices-how-to-use-ssltls-client-authentication/
关键是
private void setupTLSSpring() throws Exception {
ProtocolSocketFactory authSSLProtocolSocketFactory = new AuthSSLProtocolSocketFactory(new URL(
"file:%PATH_TO_KEYSTORE%/client-keystore.jks"), PASSWORD, new URL(
"file:%PATH_TO_TRUSTSTORE%/client-truststore.jks"), PASSWORD);
Protocol.registerProtocol("https", new Protocol("https", authSSLProtocolSocketFactory, 8410));
}
EDITED
如果你使用银行API,可能银行会向服务器提供受信任的SSL证书和客户端证书进行身份验证¿不是这样的吗?
在这种情况下忘记'配置服务器' section
在“配置客户端”步骤 1 中,从服务器 SSL 证书中提取公钥并导入到 client-truststore.jks 中。
如果某些步骤不适合您所需的配置,请详细说明