点击数:0

没事写写项目demo,想弄个HTTPS来试试,正式的证书需要到各大云服务器厂商那里申请,感觉没必要,百度了一下可以用java来生成,用来测试什么的是够了,在这里记录一下使用方法。

1.生成

进入到 %JAVVA_HOME%\bin 目录下,执行如下命令生成一个数字证书:

keytool -genkey -alias tomcathttps -keyalg RSA -keysize 2048  -keystore D:\java1.p12 -validity 365

命令含义如下:

  • genkey 表示要创建一个新的密钥。

  • alias 表示 keystore 的别名。

  • keyalg 表示使用的加密算法是 RSA ,一种非对称加密算法。

  • keysize 表示密钥的长度。

  • keystore 表示生成的密钥存放位置。

  • validity 表示密钥的有效时间,单位为天。

密码随意填一个6位数,能记住就好,其他也是随便填写,最后填‘是’或‘y’等等都行

命令执行完成后 ,我们在 D 盘目录下会看到一个名为 javaboy.p12 的文件。

2.引入

将上面生成的 java1.p12 拷贝到 Spring Boot 项目的 resources 目录下。然后在 application.properties 中添加如下配置:

server.ssl.key-store=classpath:java1.p12
server.ssl.key-alias=tomcathttps
server.ssl.key-store-password=123456

其中:

  • key-store表示密钥文件名。
  • key-alias表示密钥别名。
  • key-store-password就是在cmd命令执行过程中输入的密码。

此时使用http访问项目会报错,应改用HTTPS来访问。

3.转发

Spring Boot 不支持同时启动 HTTP 和 HTTPS ,为了解决这个问题,我们这里可以配置一个请求转发,当用户发起 HTTP 调用时,自动转发到 HTTPS 上。

@Configuration
public class TomcatConfig {
    @Bean
    TomcatServletWebServerFactory tomcatServletWebServerFactory() {
        TomcatServletWebServerFactory factory = new TomcatServletWebServerFactory(){
            @Override
            protected void postProcessContext(Context context) {
                SecurityConstraint constraint = new SecurityConstraint();
                constraint.setUserConstraint("CONFIDENTIAL");
                SecurityCollection collection = new SecurityCollection();
                collection.addPattern("/*");
                constraint.addCollection(collection);
                context.addConstraint(constraint);
            }
        };
        factory.addAdditionalTomcatConnectors(createTomcatConnector());
        return factory;
    }
    private Connector createTomcatConnector() {
        Connector connector = new
                Connector("org.apache.coyote.http11.Http11NioProtocol");
        connector.setScheme("http");
        connector.setPort(8081);
        connector.setSecure(false);
        connector.setRedirectPort(8080);
        return connector;
    }
}

在这里,我们配置了 Http 的请求端口为 8081,所有来自 8081 的请求,将被自动重定向到 8080 这个 https 的端口上。

如此之后,我们再去访问 http 请求,就会自动重定向到 https。

4.结语

实际项目中还是申请正式的HTTPS证书比较好,java生成的证书很多浏览器(例如谷歌)都会默认为不安全,用起来很麻烦。另外http重定向一般也都是使用Nginx等来配置,本文记录仅供测试。


心之所向,素履前往 ;生之逆旅,一苇以航 .