操作系统: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