如何使用SSL配置Spring RestTemplate(在Spring@MVC中)

如何使用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

我想用SSL配置我的Spring@MVC存根应用程序的Spring restemplate,以便与部署在Tomcat服务器(Spring 3,Tomcat 7)上的REST基础https应用程序通信。到目前为止,我已经完成了我的工作。现在我不知道如何使用这些生成的证书Spring RestTemplate,谁能有一些想法请帮助我。谢谢到目前为止,我所做的事情

//Spring安全xml配置

   <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)

  • 通过在浏览器中打开URL下载证书,然后单击锁 浏览器地址栏中的图标
  • 一旦有了.cer文件,请执行以下命令

    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'    
    
  • 提供RESTTemplatebean:

  • @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(空);
    }
    }
    
  • 在application.properties或application.yaml文件中提供所需的SSL属性:
  • 就这样。现在您可以看到您的Tomcat是从8080(或另一个端口)(https)开始的。
    或者,您可以使用

    是否可以在应用程序服务器级别维护客户端证书,而无需在java级别进行配置?您可以将证书导入自定义信任存储文件,然后按此处所述进行指定:或者您可以尝试此处所述的方法