说明
能够使用到https服务,一般是web服务器或者网关服务器。
步骤1 生成证书文件
此处用的是自签名证书。
JDK中keytool是一个证书管理工具,可以生成自签名证书。(找不到keytool命令的先去配置java环境)
keytool -genkey -alias worktool -keyalg RSA -keystore ssl.keystore
输入密钥库口令:(Pass0rd)
再次输入新口令:
您的名字与姓氏是什么?
[Unknown]: net
您的组织单位名称是什么?
[Unknown]: net
您的组织名称是什么?
[Unknown]: net
您所在的城市或区域名称是什么?
[Unknown]: WUHAN
您所在的省/市/自治区名称是什么?
[Unknown]: HUBEI
该单位的双字母国家/地区代码是什么?
[Unknown]: CN
CN=wd, OU=wd, O=wd, L=SHANGHAI, ST=SHANGHAI, C=CN是否正确?
[否]: y
生成p12证书的方法
keytool支持交互的方式提供证书信息。要生成一个p12证书,必须了解这样几个参数:
-genkeypair 生成证书
-keystore 生成证书的路径和文件名
-storetype 生成的证书类型,使用pkcs12指定p12格式证书
-validity 有效期的天数,用一个足够大的值跳转到2034年
下面是一个例子:
keytool -genkeypair -keystore ssl.p12 -storetype pkcs12 -validity 365
输入密钥库口令:(Pass0rd)
再次输入新口令:
您的名字与姓氏是什么?
[Unknown]: net
您的组织单位名称是什么?
[Unknown]: net
您的组织名称是什么?
[Unknown]: net
您所在的城市或区域名称是什么?
[Unknown]: WUHAN
您所在的省/市/自治区名称是什么?
[Unknown]: HUBEI
该单位的双字母国家/地区代码是什么?
[Unknown]: CN
CN=wd, OU=wd, O=wd, L=SHANGHAI, ST=SHANGHAI, C=CN是否正确?
[否]: y
还是用上面的方法验证一下证书的有效期:
keytool -list -keystore ssl.p12 -storetype pkcs12 -v
输入密钥库口令:
密钥库类型: PKCS12
密钥库提供方: SunJSSE
您的密钥库包含 1 个条目
别名: mykey
创建日期: 2012-9-27
条目类型: PrivateKeyEntry
证书链长度: 1
证书[1]:
所有者: CN=.net, OU=.net, O=.net, L=WUHAN, ST=HUBEI, C=CN
发布者: CN=.net, OU=.net, O=.net, L=WUHAN, ST=HUBEI, C=CN
序列号: 1faa29fb
有效期开始日期: Thu Sep 27 18:23:31 CST 2012, 截止日期: Thu Oct 12 18:23:31 CST 2034
证书指纹:
MD5: F8:00:9C:3B:7B:4F:F2:9D:A3:B6:3F:E9:78:2D:9A:46
SHA1: 10:21:FF:B3:DE:3F:D4:0D:44:F7:D1:07:6A:3F:09:D8:36:B9:D1:21
SHA256: AB:8A:09:5B:69:1F:95:A5:94:F7:60:F6:D0:81:8A:1D:23:42:94:3C:96:D3:04:AD:C9:59:05:14:2E:B6:6D:79
签名算法名称: SHA1withDSA
版本: 3
步骤2 先设置配置文件 application.yml
server:
port: 9001
# session:
# timeout: 6000
system:
ssl:
# 是否开启https
enable: true
# https的端口
port: 9443
# 证书文件
key-store: ssl.keystore
# 生成的密钥
key-store-password: Pass0Rd
# 证书类型
keyStoreType: JKS
# 证书文件存放位置
key-store-path: /usr/local/bin
# 是否http自动跳转https
redirect_https: true
步骤3 通过注册Bean的方式配置ssl
@ConditionalOnExpression(value = "${system.ssl.enable:false}")
@Configuration
@Slf4j
public class CustomServerSSLConfiguration {
@Value("${server.port}")
private Integer serverPort;
@Value("${system.ssl.port}")
private Integer tomcatSSLPort;
@Value("${system.ssl.key-store}")
private String tomcatSSLKeyStore;
@Value("${system.ssl.key-store-password}")
private String keystorePassword;
@Value("${system.ssl.keyStoreType}")
private String keystoreType;
@Value("${system.ssl.key-store-path}")
private String keystorePath;
@Value("${system.ssl.redirect_https}")
private Boolean redirectHttps;
/**
* 1.5.x以下版本配置
* @param
* @return
* @throws
*/
@Bean
public EmbeddedServletContainerFactory servletContainer() {
TomcatEmbeddedServletContainerFactory tomcat = new TomcatEmbeddedServletContainerFactory();
tomcat.addAdditionalTomcatConnectors(createSslConnector()); // 添加https
return tomcat;
}
// 配置https
private Connector createSslConnector() {
Connector connector = new Connector("org.apache.coyote.http11.Http11NioProtocol");
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// BufferedReader bre = null;
// OutputStreamWriter pw = null;// 定义一个流
try {
File file = new ClassPathResource(tomcatSSLKeyStore).getFile();
// log.info("keystore文件路径={},文件名={}", file.getAbsolutePath(),tomcatSSLKeyStore);
connector.setPort(tomcatSSLPort);
connector.setSecure(true);
connector.setScheme("https");
protocol.setSSLEnabled(true);
// protocol.setSSLProtocol("TLS");
protocol.setKeystoreFile(file.getAbsolutePath());
protocol.setKeystoreType(keystoreType);
protocol.setKeystorePass(keystorePassword);
protocol.setKeyPass(keystorePassword);
return connector;
} catch (IOException ex) {
try {
ClassLoader classloader = Thread.currentThread().getContextClassLoader();
InputStream stream = classloader.getResourceAsStream(tomcatSSLKeyStore);
File file = new File(keystorePath);
if (!file.exists()){
// log.info("===================文件不存在,进行创建");
file.mkdirs();
}
File file1 = new File(keystorePath+"/"+tomcatSSLKeyStore);
if (!file1.exists()){
// log.info("===================文件不存在,创建文件");
file1.createNewFile();
}
// bre = new BufferedReader(new InputStreamReader(stream, "UTF-8"));
// pw = new OutputStreamWriter(new FileOutputStream(tomcatSSLKeyStore);
FileOutputStream fos = new FileOutputStream(file1);
byte[] b = new byte[1024];
while ((stream.read(b)) != -1) {
fos.write(b);
}
stream.close();
fos.close();
// log.info("keystore文件路径={},文件名={}", file1.getAbsolutePath(),tomcatSSLKeyStore);
connector.setPort(tomcatSSLPort);
connector.setSecure(true);
connector.setScheme("https");
protocol.setSSLEnabled(true);
// protocol.setSSLProtocol("TLS");
protocol.setKeystoreFile(file1.getAbsolutePath());
protocol.setKeystoreType(keystoreType);
protocol.setKeystorePass(keystorePassword);
protocol.setKeyPass(keystorePassword);
return connector;
}catch (IOException ex1){
log.error("ssl.keystore文件不存在,请放入项目的src/main/resources下面。");
}
}
return null;
}
}
更多,请关注:
springboot 技术实践总结
网友评论