如何使用SSL配置Spring RestTemplate(在Spring@MVC中)
我想用SSL配置我的Spring@MVC存根应用程序的Spring restemplate,以便与部署在Tomcat服务器(Spring 3,Tomcat 7)上的REST基础https应用程序通信。到目前为止,我已经完成了我的工作。现在我不知道如何使用这些生成的证书和Spring RestTemplate,谁能有一些想法请帮助我。谢谢到目前为止,我所做的事情 //Spring安全xml配置如何使用SSL配置Spring RestTemplate(在Spring@MVC中),spring,spring-security,resttemplate,Spring,Spring Security,Resttemplate,我想用SSL配置我的Spring@MVC存根应用程序的Spring restemplate,以便与部署在Tomcat服务器(Spring 3,Tomcat 7)上的REST基础https应用程序通信。到目前为止,我已经完成了我的工作。现在我不知道如何使用这些生成的证书和Spring RestTemplate,谁能有一些想法请帮助我。谢谢到目前为止,我所做的事情 //Spring安全xml配置 <http> <intercept-url pattern="/logi
<http>
<intercept-url pattern="/login" access="IS_AUTHENTICATED_ANONYMOUSLY" requires-channel="https"/>
<http-basic/></http>
ResponseEntity<User> rECreateUser = restTemplate.postForEntity("https://127.0.0.1:8443/skeleton-1.0/login", user, User.class);
//使用Tomcat启用SSL的配置
<Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol" maxThreads="200"
scheme="https" secure="true" SSLEnabled="true"
keystoreFile="C:\Users\Channa\.keystore" keystorePass="changeit"
clientAuth="false" sslProtocol="TLS"/>
用于生成密钥、证书等
//生成客户端和服务器密钥:
F:\jdk1.6.0\u 23\bin>keytool-genkey-keystore-keystore\u client-alias clientKey-dname“CN=localhost,OU=Dev,O=MyBusiness,L=Colombo,S=Westen,C=SL”F:\jdk1.6.0\u 23\bin>keytool-genkey-keystore-keystore\u server-alias serverKey-dname“CN=localhost,OU=Dev,O=MyBusiness,L=Colombo,S=Westen,C=SL” //生成客户端和服务器证书: F:\jdk1.6.0\u 23\bin>keytool-export-alias clientKey-rfc-keystore keystore\u client>client.cert F:\jdk1.6.0\u 23\bin>keytool-export-alias serverKey-rfc-keystore keystore\u server>server.cert //将证书导入到相应的信任库: F:\jdk1.6.0\u 23\bin>keytool-import-alias clientCert-file client.cert-keystore truststore\u server F:\jdk1.6.0\u 23\bin>keytool-import-alias-serverCert-file-server.cert-keystore-truststore\u客户端 //Spring RestTemplate配置
//要访问的Https URL
<http>
<intercept-url pattern="/login" access="IS_AUTHENTICATED_ANONYMOUSLY" requires-channel="https"/>
<http-basic/></http>
ResponseEntity<User> rECreateUser = restTemplate.postForEntity("https://127.0.0.1:8443/skeleton-1.0/login", user, User.class);
ResponseEntity rECreateUser=restTemplate.postForEntity(“https://127.0.0.1:8443/skeleton-1.0/登录”,用户,用户类);
//当前我遇到的异常:
org.springframework.web.client.ResourceAccessException:I/O错误:sun.security.validator.ValidatorException:PKIX路径生成失败:sun.security.provider.certpath.SunCertPathBuilderException:无法找到请求目标的有效证书路径;嵌套异常为javax.net.ssl.SSLHandshakeException:sun.security.validator.ValidatorException:PKIX路径生成失败:sun.security.provider.certpath.SunCertPathBuilderException:找不到请求目标的有效证书路径这是因为您调用的服务的ssl证书没有受信任的用户签名证书颁发机构。解决方法是将证书导入JRE的证书信任存储(cacerts)
keytool -import -keystore jdk1.8.0_77/jre/lib/security/cacerts -file ~/test.cer -alias test
您可以使用HttpComponentClientHttpRequestFactory从配置RestTemplate,它肯定支持SSL
参考:弹簧靴的变型:
implementation 'org.apache.httpcomponents:httpclient:4.5'
@Bean
私有RestTemplate RestTemplate(){
SSLContext SSLContext=buildSslContext();
SSLConnectionSocketFactory socketFactory=新的SSLConnectionSocketFactory(sslContext);
HttpClient HttpClient=HttpClients.custom()
.setSSLSocketFactory(socketFactory)
.build();
HttpComponents客户端HttpRequestFactory工厂=新的HttpComponents客户端HttpRequestFactory(httpClient);
返回新的REST模板(工厂);
}
私有SSLContext buildSslContext(){
试一试{
char[]keyStorePassword=sslProperties.getKeyStorePassword();
返回新的SSLContextBuilder()
.loadKeyMaterial(
KeyStore.getInstance(新文件(sslProperties.getKeyStore()),keyStorePassword),
密钥密码
).build();
}捕获(例外情况除外){
抛出新的IllegalStateException(“无法实例化SSL上下文”,ex);
}最后{
setKeyStorePassword(null);
sslProperties.setTrustStorePassword(空);
}
}
或者,您可以使用是否可以在应用程序服务器级别维护客户端证书,而无需在java级别进行配置?您可以将证书导入自定义信任存储文件,然后按此处所述进行指定:或者您可以尝试此处所述的方法