# springboot配置https
HTTP与 HTTPS区别
首先,来简单了解一下 HTTP 与 HTTPS 吧。
超文本传输协议 HTTP 协议被用于在 Web 浏览器和网站服务器之间传递数据。HTTP 协议是以明文方式发送数据,不提供任何方式的数据加密,如果攻击者截取了 Web 浏览器和网站服务器之间的传输报文,就可以直接读懂其中的信息,因此 HTTP 协议不适合传输一些敏感信息,比如信用卡号、密码等信息。
为了解决 HTTP 协议的这一缺陷,需要使用另一种传输协议:安全套接字层超文本传输协议,也就是 HTTPS 协议。为了数据传输的安全,HTTPS 在HTTP 的基础上加入了 SSL 协议,SSL 依靠证书来验证服务器的身份,并为浏览器和服务器之间的通信进行加密(具体加密原理这里不赘述)。
两者的区别主要为以下四点:
1、https 协议需要到申请 ssl 证书,现在,免费的ssl证书申请机构不少,个人网站使用完全没问题(文末列出几个提供免费证书的网站);
2、http 是超文本传输协议,信息是明文传输,https 则是具有安全性的 ssl 加密传输协议;
3、http 和 https 使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443;
4、http 的连接很简单,是无状态的;HTTPS 协议是由 SSL+HTTP 协议构建的可进行加密传输、身份认证的网络协议,比 http 协议安全。
目前,很多网站都开始启用 HTTPS 协议进行数据传输,这也是保证数据传输安全的一种方式。那么,当我们搭建自己的网站的时候应该怎么启用 HTTPS 呢?下面将介绍如何在 SpringBoot 项目中添加 HTTPS 支持。
KeyTool 生成自签发证书文件
命令:
keytool -genkey -alias test123 -storetype PKCS12 -keyalg RSA -keysize 2048 -keystore MyKeyStore.p12 -validity 36500
关键参数说明:
storetype 指定密钥仓库类型
keyalg 生证书的算法名称,RSA是一种非对称加密算法
keysize 证书大小
keystore 生成的证书文件的存储路径(可指定相对路径或绝对路径)
validity 证书的有效期(天 为单位)
注意:
然后一路操作,输入相应的设置, 最后在确认是否正确的时候,检查输入的值是否正确,是就输入y 进行确认。
控制台输入以下命令查看密钥库中的信息
keytool -list -v -keystore MyKeyStore.p12 -storepass chengblog
输入 y 确认设置之后,keytool 工具在设置路径下生成 MyKeyStore.p12 文件,当填写文件名称,会在存储在相对路径下,也就是控制台定位到的目录下。将该文件拷贝到项目根目录下resources的ssl内。
在 application.properties 配置文件中添加以下配置项:
#证书格式转换
转换1,ca.p12转client.jks
keytool -importkeystore -srckeystore ca.p12 -srcstoretype PKCS12 -deststoretype JKS -destkeystore client.jks
过程:
输入目标密钥库口令(新jks口令):
再次输入新口令:
输入源密钥库口令:(p12文件口令)
已成功导入别名 1 的条目。
已完成导入命令: 1 个条目成功导入, 0 个条目失败或取消
转换2,client.jks转ca_client.p12
keytool -importkeystore -srckeystore client.jks -srcstoretype JKS -deststoretype PKCS12 -destkeystore ca_client.p12
过程:
输入目标密钥库口令(新p12口令):
再次输入新口令:
输入源密钥库口令(原client.jks设置口令):
输入 <1> 的密钥口令(生成client.jks的原p12口令):
已成功导入别名 1 的条目。
已完成导入命令: 1 个条目成功导入, 0 个条目失败或取消
springboot配置https:
0.生成证书:
keytool -genkey -alias tomcat -storetype PKCS12 -keyalg RSA -keysize 2048 -keystore KeyStore.p12 -validity 36500
存放目录:resources/ssl/KeyStore.p12
1.配置文件:
#http端口
server.port=9960
#https端口
server.https.port=9962
# 指定签名文件,对应生成的密钥库文件
server.ssl.key-store=classpath:ssl/keystore.p12
# 指定签名密码,设置的密钥库指令
server.ssl.key-store-password=test123
# 指定密钥仓库类型,PKCS12
server.ssl.key-store-type=PKCS12
# 指定别名,生成密钥库的时候进行了设定
server.ssl.keyAlias=test123
2.更改pom文件,添加如下
3.添加HttpsConfig.java
package com.ab.dh.analysis.config;
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.context.embedded.ConfigurableEmbeddedServletContainer;
import org.springframework.boot.context.embedded.EmbeddedServletContainerCustomizer;
import org.springframework.boot.context.embedded.EmbeddedServletContainerFactory;
import org.springframework.boot.context.embedded.Ssl;
import org.springframework.boot.context.embedded.tomcat.TomcatEmbeddedServletContainerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class HttpsConfig{
/**
* httpPort Server的http端口号
* httpsPort Server的https端口号
* keyStorePassword Keystore的密码
* keyStorePath KeyStore的所在路径
*/
@Value("${server.port}")
private int httpPort;
@Value("${server.https.port}")
private int httpsPort;
@Value("${server.ssl.key-store-password}")
private String keyStorePassword;
@Value("${server.ssl.key-store}")
private String keyStorePath;
@Bean
public EmbeddedServletContainerCustomizer containerCustomizer() {
return new EmbeddedServletContainerCustomizer() {
@Override
public void customize(ConfigurableEmbeddedServletContainer container) {
Ssl ssl = new Ssl();
// Server.jks或者server.p12都是中包含服务器私钥和证书
ssl.setKeyStore(keyStorePath);
ssl.setKeyStorePassword(keyStorePassword);
container.setSsl(ssl);
container.setPort(httpsPort);
}
};
}
@Bean
public EmbeddedServletContainerFactory servletContainerFactory() {
TomcatEmbeddedServletContainerFactory factory = new TomcatEmbeddedServletContainerFactory() {
@Override
protected void postProcessContext(Context context) {
SecurityConstraint securityConstraint = new SecurityConstraint();
securityConstraint.setUserConstraint("CONFIDENTIAL");
SecurityCollection collection = new SecurityCollection();
collection.addPattern("/*");
securityConstraint.addCollection(collection);
context.addConstraint(securityConstraint);
}
};
factory.addAdditionalTomcatConnectors(createHttpConnector());
return factory;
}
/**
* 通过http端口访问直接跳转到https端口访问
* @return connector
*/
private Connector createHttpConnector() {
Connector connector = new Connector("org.apache.coyote.http11.Http11NioProtocol");
connector.setScheme("http");
connector.setSecure(false);
connector.setPort(httpPort);
connector.setRedirectPort(httpsPort);
return connector;
}
}