Https服务配置-基于jdk工具自签名证书

第一步:生成自签名证书:

利用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)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值