程子的博客

想得到从未得到的东西,就要去做从未做过的事

aaaaa
  menu
46 文章
23633 浏览
2 当前访客
ღゝ◡╹)ノ❤️

Spring boot 配置 SSL

JAVA 本地生成证书

1. 需要 java 环境

2. wincmd 命令

keytool -genkey -alias epod-21st -storetype PKCS12 -keyalg RSA -keystore ./server.keystore -validity 3000
  keytool: 工具是Java JDK自带的证书工具
  -genkey: 要生成一个证书(版权、身份识别的安全证书)
  -alias:  证书别名
  -storetype: 秘钥库类型 PKCS12 或 JKS
  -keyalg: 表示加密类型,RSA表示需要加密,以防止别人盗取
  -validity: 表示有效时间, 3000 表示 3000天
  -keystore: 表示要生成的证书名称
输入密钥库口令:
    再次输入新口令:
    您的名字与姓氏是什么?
      [Unknown]:  Cheng
    您的组织单位名称是什么?
      [Unknown]:  epod
    您的组织名称是什么?
      [Unknown]:  epod
    您所在的城市或区域名称是什么?
      [Unknown]:  BeiJing
    您所在的省/市/自治区名称是什么?
      [Unknown]:  ChaoYang
    该单位的双字母国家/地区代码是什么?
      [Unknown]:  CN
    CN=Cheng, OU=epod, O=epod, L=BeiJing, ST=ChaoYang, C=CN是否正确?

3. 证书配置

  • 证书放到spring bootresources 目录下
server:
  port: 443
  http:
    port: 8080
  http2:
    enabled: true
  ssl:
    enabled: true
    #证书的路径.
    key-store: classpath:ssl/server.keystore
    #证书别名
    key-alias: epod-21st
    #密钥库的密码
    key-store-password: epod21st
    #密钥库内该证书的加密密码
    key-password: epod21st
    #秘钥库类型
    key-store-type: PKCS12

4. undertow 服务器 配置 http 转发 https

package com.epod.config;

import io.undertow.Undertow;
import io.undertow.UndertowOptions;
import io.undertow.servlet.api.*;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.web.embedded.undertow.UndertowServletWebServerFactory;
import org.springframework.boot.web.servlet.server.ServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * 说明: ssl 配置
 *
 * @author :chengzi
 * Create :2020/9/24 9:33
 */
@Configuration
public class SslConfig {

    /**
     * http服务端口
     */
    @Value("${server.http.port}")
    private Integer httpPort;

    /**
     * https服务端口
     */
    @Value("${server.port}")
    private Integer httpsPort;

    /**
     * undertow 服务器 配置 http 转发 https
     */
    @Bean
    public ServletWebServerFactory undertowFactory() {
        UndertowServletWebServerFactory undertowFactory = new UndertowServletWebServerFactory();
        undertowFactory.addBuilderCustomizers((Undertow.Builder builder) -> {
            builder.addHttpListener(httpPort, "0.0.0.0");
            // 开启HTTP2
            builder.setServerOption(UndertowOptions.ENABLE_HTTP2, true);
        });
        undertowFactory.addDeploymentInfoCustomizers(deploymentInfo -> {
        // 开启HTTP自动跳转至HTTPS
            deploymentInfo.addSecurityConstraint(new SecurityConstraint()
                    .addWebResourceCollection(new WebResourceCollection().addUrlPattern("/*"))
                    .setTransportGuaranteeType(TransportGuaranteeType.CONFIDENTIAL)
                    .setEmptyRoleSemantic(SecurityInfo.EmptyRoleSemantic.PERMIT))
                    .setConfidentialPortManager(exchange -> httpsPort);
        });
        return undertowFactory;
    }

}

5. 异常 Caused by: java.io.IOException: DerInputStream.getLength(): lengthTag=111, too big.

解决方式: 在 maven<plugins></plugins>添加配置

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-resources-plugin</artifactId>
    <configuration>
        <encoding>UTF-8</encoding>
        <!-- 过滤后缀为pem、pfx的证书文件 -->
        <nonFilteredFileExtensions>
            <nonFilteredFileExtension>keystore</nonFilteredFileExtension>
        </nonFilteredFileExtensions>
    </configuration>
</plugin>

6. 其他

  • 此种配置的证书可以简单实用, 浏览器会报不安全提醒
  • 证书可以在阿里云或腾讯云进行免费申请, 然后把 下载jks 或者pfx 两种格式的一种.
  • 替换上述证书, 替换上述密码, 选择正确的密钥库类型即可

标题:Spring boot 配置 SSL
作者:chengzime
地址:https://chengzime.com.cn/articles/2020/09/25/1601019635585.html