Spring Boot 和nginx用openssl自签证书配置https访问

1,147 阅读3分钟

环境说明:

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,并安装。

微信图片_20220526122148.png

spring boot 配置https

首先在linux下用openssl将证书格式转换为spring boot需要的pkcs12证书,注意这里需要设置密码
(windows下的openssl不支持-clcerts参数,导致提取出的证书导入后spring boot项目无法正常启动)

image.png

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) image.png

在启动类中加入如下代码,配置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访问已配置完毕,可以启动项目看看效果了。

image.png

image.png

可以看到页面和接口都可以用https正常访问了