文章目录
- 第一步:生成自签名证书:
- 参数说明:
- 证书说明:
- 第二步:配置证书
- 第三步:通过https访问接口
- 第四步:同时支持Https和Http访问(非必须)
- 在SpringBoot中访问Https接口:
- 第一步:在Spring容器中注入RestTemplate
- 第二步:使用
第一步:生成自签名证书:
利用jdk自带的keytool工具生成证书文件
keytool -genkey -alias docprj -storetype PKCS12 -keyalg RSA -keysize 2048 -keystore test.p12 -validity 365
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MYp6b8rD-1571791109325)(F:\BIM在现场\笔记\读书笔记\image\https\java自签名选项.png)]
参数说明:
• keytool -genkey -alias 别名
-storetype 仓库类型 -keyalg 算法 -keysize 长度
-keystore 文件名(可以自定义) -validity 有效期
说明
• 仓库类型,JKS、JCEKS、PKCS12 等
• 算法,RSA、DSA 等
• 长度,例如 2048
证书说明:
一般在阿里云等申请的免费证书包含.pem和.key文件,分别是证书和私钥,用java工具生成的证书实际上将两者打包在了一起。
第二步:配置证书
将上面生成的 test.p12拷贝到Resource目录,并在application.properties中配置如下内容:端口根据情况可以自行配置。
server.port=8089
server.ssl.key-store=classpath:test.p12
server.ssl.key-store-type=PKCS12
server.ssl.key-store-password=123456
第三步:通过https访问接口
浏览器会提示不安全,点击高级继续,就可以通过https访问。然并卵,这个只是自己在测试环境自己玩玩。要实现真正可信任的https,需要申请CA签名的证书。在我另几篇文章中有详细描述。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eWcGrdax-1571791109327)(F:\BIM在现场\笔记\读书笔记\image\https\自签名访问https.png)]
第四步:同时支持Https和Http访问(非必须)
如果你有没有同时提供http和https的场景,可以忽略此步。
做法很简单:只需要在容器中注入另一个连接器,选择一个http访问的端口,不要和https端口重合即可。
@Bean
public ServletWebServerFactory servletContainer() {
TomcatServletWebServerFactory tomcat = new TomcatServletWebServerFactory();
tomcat.addAdditionalTomcatConnectors(createStandardConnector()); // 添加http
return tomcat;
}
// 配置http
private Connector createStandardConnector() {
Connector connector = new Connector("org.apache.coyote.http11.Http11NioProtocol");
connector.setPort(8088);
return connector;
}
虽然可以这样做,但是强烈建议不要这样做,尽量全部采用https。
在SpringBoot中访问Https接口:
上述我们实现了https服务端的配置,并在浏览器中访问,实际开发有一些场景,我们需要在SpringBoot项目中调用别的第三方服务接口,如果要在应用中访问其他服务的https服务,如何实现?
很简单,我们还是采用RestTemplate这个工具类,只是额外做一些https的配置。
第一步:在Spring容器中注入RestTemplate
RestTemplate这里引用了requestFactory,去初始化支持https的客户端。
@Bean
public HttpComponentsClientHttpRequestFactory requestFactory() {
SSLContext sslContext = null;
try {
sslContext = SSLContextBuilder.create()
// 会校验证书
.loadTrustMaterial(keyStore.getURL(), keyPass.toCharArray())
// 放过所有证书校验
// .loadTrustMaterial(null, (certificate, authType) -> true)
.build();
} catch(Exception e) {
log.error("Exception occurred while creating SSLContext.", e);
}
CloseableHttpClient httpClient = HttpClients.custom()
.evictIdleConnections(30, TimeUnit.SECONDS)
.setMaxConnTotal(200)
.setMaxConnPerRoute(20)
.disableAutomaticRetries()
.setKeepAliveStrategy(new CustomConnectionKeepAliveStrategy())
.setSSLContext(sslContext)
.setSSLHostnameVerifier(NoopHostnameVerifier.INSTANCE)
.build();
HttpComponentsClientHttpRequestFactory requestFactory =
new HttpComponentsClientHttpRequestFactory(httpClient);
return requestFactory;
}
@Bean
public RestTemplate restTemplate(RestTemplateBuilder builder) {
return builder
.setConnectTimeout(Duration.ofMillis(100))
.setReadTimeout(Duration.ofMillis(500))
.requestFactory(this::requestFactory)
.build();
}
第二步:使用
restTemplate.getForObject(url + "https://localhost:8089/student/{id}", Student.class, id)