李磊的笔记本

纸上得来终觉浅,绝知此事要躬行。

0%

SpingBoot2 配置HTTPS,并实现HTTP访问自动转HTTPS访问

SSL证书生成

生产环境是向证书供应商进行购买,在使用工具转换
我们着使用java自带的工具进行生成,可以使用keytool –help查看具体用法

jks证书(java专用)

1
2
keytool -genkeypair -alias tomcat -keyalg RSA -keysize 2048 -keystore keystore.jks -validity 3650  #生成证书
keytool -list -v -keystore keystore.jks # 查看生成的信息

PKCS12

1
2
keytool -genkeypair -alias tomcat -keyalg RSA -keysize 2048 -storetype PKCS12 -keystore keystore.p12 -validity 3650 #生成证书
keytool -list -v -storetype pkcs12 -keystore keystore.p12 #查看生成的信息

生成证书都会要求你输入密码,注意,请记住这个密码,后面springboot配置要用到。

JKS迁移成PKCS12证书

1
keytool -importkeystore -srckeystore keystore.jks -destkeystore keystore.p12 -deststoretype pkcs12

证书供应商提供的证书

1
keytool -import -alias tomcat -file myCertificate.crt -keystore keystore.p12 -storepass password

Spring Boot 启用https

配置文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#访问的端口
server.port=8443
#自定义配置用于开启http端口访问
http.port=8080

#默认就是true 不用配置
server.ssl.enabled=true
#这用到生成证书时的密码
server.ssl.key-password=111111
#证书地址 如果是在jar里面 使用classpath:keystore.jks
server.ssl.key-store=./keystore.jks
#证书alias 别名
server.ssl.key-alias=tomcat
#证书格式 还有 PKCS12
server.ssl.key-store-type=jks

启动服务器 访问https 的 8488端口 应该就能访问了

http重定向到https

spring boot 2.x 版本代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
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.beans.factory.annotation.Value;
import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory;
import org.springframework.boot.web.servlet.server.ServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
/*配置http自动转为https*/
public class ConnectorConfig {

@Bean
public ServletWebServerFactory servletWebServerFactory() {
TomcatServletWebServerFactory factory = new TomcatServletWebServerFactory() {
@Override
protected void postProcessContext(Context context) {
SecurityConstraint securityConstraint = new SecurityConstraint();
securityConstraint.setUserConstraint("CONFIDENTIAL");//机密的
SecurityCollection securityCollection = new SecurityCollection();
securityCollection.addPattern("/*");
securityConstraint.addCollection(securityCollection);
context.addConstraint(securityConstraint);
}
};
factory.addAdditionalTomcatConnectors(httpConnector());
return factory;
}

//https端口
@Value("${server.port}")
private int httpsPort;

//http端口
@Value("${http.port}")
private int httpPort = 8080;

@Bean
public Connector httpConnector() {
Connector connector = new Connector("org.apache.coyote.http11.Http11NioProtocol");
connector.setScheme("http");
connector.setPort(httpPort);
connector.setSecure(false);
connector.setRedirectPort(httpsPort);
return connector;
}
}

访问8080端口 会自动跳转到 https 的端口

其他(非必要操作)

获取分发给客户端的证书

1
keytool -export -keystore keystore.jks -alias tomcat -file myCertificate.crt

jdk导入证书 方便java程序访问https访问时进行证书的验证

1
2
keytool -importcert -file myCertificate.crt -alias tomcat -keystore $JDK_HOME/jre/lib/security/cacerts

思考❓

浏览器怎么和证书进行关联?通过别名么? 别名设置成域名?