环境说明:
Spring Boot :2.2.13
nginx version: nginx/1.16.1
OpenSSL 1.0.2k-fips 26 Jan 2017
nginx部分引用自文章:blog.csdn.net/yangdengqi/…
nginx配置https访问
概念
key:私钥
csr:证书申请文件,生成证书时要把这个提交给权威的证书颁发机构,颁发机构审核通过之后,再根据这些申请信息生成相应的证书。
crt:证书
一般流程
1.创建服务器私钥
2.生成证书请求文件并发送给证书颁发机构(自签代替)获取证书
3.部署
实现
生成(待部署服务器上的)证书
1.创建服务器私钥
openssl genrsa -out server.key 2048 #rsa算法 2048长度
#openssl genrsa -des3 -out server.key 2048 #-des3可选,为server.key设置密码,后续用到此文件时要输入密码
2.生成证书请求文件
openssl req -new -key server.key -out server.csr
3.发送给CA获取证书获取签名
此步骤由自制根证书签名代替,步骤如下:
自制CA根证书并模拟颁发证书
1.创建根证书私钥
openssl genrsa -out ca.key 2048
2.创建根证书
openssl req -new -x509 -sha256 -days 365 -key ca.key -out ca.crt
#填写信息的时候CN项(Common Name (e.g. server FQDN or YOUR name))填写本机的hostname即可
#它代表颁发者
#其实上述命令可拆分成两条命令理解
#1.生成证书请求
#openssl req -new -key ca.key -out ca.csr
#2.自签署
#openssl x509 -req -sha256 -days 365 -in ca.csr -signkey ca.key -out ca.crt
3.模拟根证书签名颁发证书
将待部署服务器上生成的请求文件(csr)拿过来
openssl x509 -req -sha256 -days 365 -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out server.crt
特别注意:上述命令生成的证书使用后,浏览器还是会报错:NET::ERR_CERT_COMMON_NAME_INVALID
解决办法:创建文本文件ext.conf,内容如下:
basicConstraints = CA:FALSE
keyUsage = nonRepudiation, digitalSignature, keyEncipherment
subjectAltName = @alt_names
[alt_names]
IP.1 = 192.168.110.160
#如果是域名
#DNS.1=www.test.com
openssl x509 -req -sha256 -days 365 -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out server.crt -extfile ext.conf
生成的server.crt即为服务器所需的证书
部署
1.服务器部署
# HTTPS server
安装好nginx,修改配置/etc/nginx/nginx.conf
# HTTPS server
#
server {
listen 443 ssl;
server_name localhost;
ssl_certificate /userdata/caTest/server/server.crt;
ssl_certificate_key /userdata/caTest/server/server.key;
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
location / {
root html;
index index.html index.htm;
}
}
nginx重载配置或重启服务,服务器部署完成。
2.客户端
下载ca.crt,并安装。
spring boot 配置https
首先在linux下用openssl将证书格式转换为spring boot需要的pkcs12证书,注意这里需要设置密码
(windows下的openssl不支持-clcerts参数,导致提取出的证书导入后spring boot项目无法正常启动)
openssl pkcs12 -export -clcerts -in server.crt -inkey server.key -out server.p12
将导出的证书放入项目并完成配置:
server.port:https访问端口
server.ssl.key-store: 证书文件路径
server.ssl.key-store-password: 转换pkcs12证书时输入的密码
server.ssl.key-store-type: 证书格式(这里配置为pkcs12)
在启动类中加入如下代码,配置https重定向,其中8081是http访问端口,8243是https访问端口
//https配置
@Bean
public ServletWebServerFactory servletContainer() {
TomcatServletWebServerFactory tomcat = new TomcatServletWebServerFactory();
tomcat.addAdditionalTomcatConnectors(createHTTPConnector());
return tomcat;
}
private Connector createHTTPConnector() {
Connector connector = new Connector("org.apache.coyote.http11.Http11NioProtocol");
connector.setScheme("http");
connector.setSecure(false);
connector.setPort(8081);
connector.setRedirectPort(8243);
return connector;
}
至此spring boot的https访问已配置完毕,可以启动项目看看效果了。
可以看到页面和接口都可以用https正常访问了