0%

springBoot开启https

文章字数:483,阅读全文大约需要1分钟

开启https可以有效防止中间人攻击。原理是使用非对称加密,连接双方加密的信息只能用对方的秘钥解密。CA颁发的证书还能够保证服务器证书不是被伪造的。

自己生成证书

这种证书可以保证加密连接,但是黑客可以自己生成一个和我们域名一样的证书,并使用DNS劫持,将域名绑定到自己的ip上。使用CA颁发的证书可以解决这种问题。

  1. 使用jdk自带的命令生成证书
  • keytool -genkeypair -alias tomcat -keyalg RSA -keystore E:\tomcat.key完整命令
  • -alias tomcat别名为tomcat
  • -keyalg RSA使用RSA非对称加密
  • -keystore E:\tomcat.key生成后保存位置
  1. 其它命令
    1
    2
    3
    4
    5
    6
    7
    keytool -genkey -alias tomcat  -storetype PKCS12 -keyalg RSA -keysize 2048  -keystore keystore.p12 -validity 3650

    1.-storetype 指定密钥仓库类型
    2.-keyalg 生证书的算法名称,RSA是一种非对称加密算法
    3.-keysize 证书大小
    4.-keystore 生成的证书文件的存储路径
    5.-validity 证书的有效期
  1. 配置application.properties
    1
    2
    3
    4
    5
    6
    7
    # 路径
    # server.ssl.key-store: classpath:tomcat.key
    server.ssl.key-store=tomcat.key
    server.ssl.keyStoreType=JKS
    server.ssl.key-alias=tomcat
    # 生成的时候输入的
    server.ssl.key-store-password=password123

使用CA的证书

  1. 阿里云腾讯云之类的都有,购买证书后下载。
  2. 下载后解压,复制Tomcat文件夹中的.jks文件到资源目录,和配置文件同级
  3. 查看证书相关信息keytool -list -keystore server.p12
  4. 配置
1
2
3
4
5
6
server.port: 8092
server.ssl.key-store= classpath:server.jks
# 密码在文件夹中的txt中
server.ssl.key-store-password=你的密码
# .jks证书的类型,还有一个是PKCS12,需要用crt生成
server.ssl.keyStoreType = JKS

配置Http转发到Https

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
@Bean
public EmbeddedServletContainerFactory servletContainer() {
TomcatEmbeddedServletContainerFactory tomcat = new TomcatEmbeddedServletContainerFactory() {
@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);
}
};
tomcat.addAdditionalTomcatConnectors(httpConnector());
return tomcat;
}

@Bean
public Connector httpConnector() {
Connector connector = new Connector("org.apache.coyote.http11.Http11NioProtocol");
connector.setScheme("http");
//Connector监听的http的端口号
connector.setPort(8080);
connector.setSecure(false);
//监听到http的端口号后转向到的https的端口号
connector.setRedirectPort(8092);
return connector;
}