Spring Boot 开启 HTTPS

操作系统:Windows 10 x64

java version “1.8.0_221”

获取证书

获取 SSL 证书主要有两种,一种是自己通过工具生成,另外一种是通过 SSL 证书服务商获取。

以下介绍使用 JDK 自带的 keytool 工具来生成 SSL 证书。

在命令行中输入命令 keytool -help 查看我们的 JDK 是否带有 keytool 工具。

若输出如下信息,则证明此 JDK 版本带有 keytool 工具。

密钥和证书管理工具

命令:

 -certreq            生成证书请求
 -changealias        更改条目的别名
 -delete             删除条目
 -exportcert         导出证书
 -genkeypair         生成密钥对
 -genseckey          生成密钥
 -gencert            根据证书请求生成证书
 -importcert         导入证书或证书链
 -importpass         导入口令
 -importkeystore     从其他密钥库导入一个或所有条目
 -keypasswd          更改条目的密钥口令
 -list               列出密钥库中的条目
 -printcert          打印证书内容
 -printcertreq       打印证书请求的内容
 -printcrl           打印 CRL 文件的内容
 -storepasswd        更改密钥库的存储口令

使用 "keytool -command_name -help" 获取 command_name 的用法

查看 -genkeypair (生成密钥对)的帮助信息,输入命令 keytool -genkeypair -help,输出:

keytool -genkeypair [OPTION]...

生成密钥对

选项:

 -alias <alias>                  要处理的条目的别名
 -keyalg <keyalg>                密钥算法名称
 -keysize <keysize>              密钥位大小
 -sigalg <sigalg>                签名算法名称
 -destalias <destalias>          目标别名
 -dname <dname>                  唯一判别名
 -startdate <startdate>          证书有效期开始日期/时间
 -ext <value>                    X.509 扩展
 -validity <valDays>             有效天数
 -keypass <arg>                  密钥口令
 -keystore <keystore>            密钥库名称
 -storepass <arg>                密钥库口令
 -storetype <storetype>          密钥库类型
 -providername <providername>    提供方名称
 -providerclass <providerclass>  提供方类名
 -providerarg <arg>              提供方参数
 -providerpath <pathlist>        提供方类路径
 -v                              详细输出
 -protected                      通过受保护的机制的口令

使用 "keytool -help" 获取所有可用命令

使用 keytool -genkeypair 命令生成证书,输入:

keytool -genkeypair -alias tomcat -storetype PKCS12 -keyalg RSA -keysize 2048 -keystore demo.p12 -validity 100
输入密钥库口令:123456(此处输入的密码是不可见的)
再次输入新口令:
您的名字与姓氏是什么?
  [Unknown]:  1
您的组织单位名称是什么?
  [Unknown]:  2
您的组织名称是什么?
  [Unknown]:  3
您所在的城市或区域名称是什么?
  [Unknown]:  4
您所在的省/市/自治区名称是什么?
  [Unknown]:  5
该单位的双字母国家/地区代码是什么?
  [Unknown]:  6
CN=1, OU=2, O=3, L=4, ST=5, C=6是否正确?
  [否]:  Y

执行完成之后,可以在系统当前用户目录找到一个 demo.p12 文件。

使用 keytool -list 命令查看我们证书内容。

keytool -list -v -keystore demo.p12
输入密钥库口令:
密钥库类型: PKCS12
密钥库提供方: SUN

您的密钥库包含 1 个条目

别名: tomcat
创建日期: 2020-1-19
条目类型: PrivateKeyEntry
证书链长度: 1
证书[1]:
所有者: CN=1, OU=2, O=3, L=4, ST=5, C=6
发布者: CN=1, OU=2, O=3, L=4, ST=5, C=6
序列号: 26819942
有效期为 Sun Jan 19 16:30:11 CST 2020 至 Tue Apr 28 16:30:11 CST 2020
证书指纹:
         MD5:  C1:D2:AC:44:77:D9:04:77:4C:B7:92:24:5F:62:F2:4B
         SHA1: BE:CB:15:BA:C4:75:FE:02:F4:A3:23:73:9B:CF:11:3D:E5:11:EC:C9
         SHA256: 05:23:B1:AC:FA:6A:53:1F:60:70:C1:3C:7A:7A:D5:58:33:09:75:D5:7D:5C:5C:56:5B:4E:DA:8B:B2:C1:22:5C
签名算法名称: SHA256withRSA
主体公共密钥算法: 2048 位 RSA 密钥
版本: 3

扩展:

#1: ObjectId: 2.5.29.14 Criticality=false
SubjectKeyIdentifier [
KeyIdentifier [
0000: 8B 7E 9C 5C 11 CC 63 43   E7 31 D1 CC 11 FF E1 62  ...\..cC.1.....b
0010: 73 83 A5 92                                        s...
]
]



*******************************************
*******************************************

在 Spring Boot 中开启 HTTPS

将证书文件复制到项目的 src/main/resources 目录下,然后修改 application.yml 文件,添加 HTTPS 支持。

server:
  port: 8443
  ssl:
    protocol: TLS
    key-store-type: PKCS12
    key-store: classpath:keystore.p12
    key-store-password: 123456
    key-alias: tomcat

新建一个控制器,用于测试。

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class IndexController {

    @GetMapping({"/", "index"})
    public String index() {
        return "hello";
    }
}

启动项目,可以看到控制台输出:

o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port(s): 8443 (https) with context path ''

访问 https://localhost:8443/,警告面临潜在的安全风险。
在这里插入图片描述

这是因为对于应该安全的网站(以“https://”开始的 URL),Firefox 会验证其证书的有效性。如果证书的有效性无法确认,Firefox 将停止连接并提示错误信息“警告:有风险”页面。

不管了,接受风险并继续!
在这里插入图片描述
在这里插入图片描述

HTTP 自动重定向到 HTTPS

用户可能继续使用 HTTP 来访问你的网站,这个时候我们需要添加 HTTP 自动重定向到 HTTPS 的功能。

配置很简单,如下:

import org.apache.catalina.Context;
import org.apache.catalina.connector.Connector;
import org.apache.tomcat.util.descriptor.web.SecurityCollection;
import org.apache.tomcat.util.descriptor.web.SecurityConstraint;
import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class ConnectorConfig {

    @Bean
    public 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(getHttpConnector());
        return factory;
    }

    private Connector getHttpConnector() {
        Connector connector = new Connector("org.apache.coyote.http11.Http11NioProtocol");
        connector.setScheme("http");
        connector.setPort(8080);
        connector.setSecure(false);
        connector.setRedirectPort(8443);
        return connector;
    }
}

重启,控制台输出:

o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port(s): 8443 (https) 8080 (http) with context path ''

现在访问 http://localhost:8080/http://localhost:8080/index 将被重定向至 https://localhost:8443/https://localhost:8443/index

项目结构

在这里插入图片描述

发布了36 篇原创文章 · 获赞 0 · 访问量 1853

猜你喜欢

转载自blog.csdn.net/qq_29761395/article/details/104046044