生成证书文件
#如果没有需要安装OpenSSL
yum -y install openssl openssl-devel
# 生成密钥,采用的是des3算法
openssl genrsa -des3 -out server.key 2048
# 根据密钥签发申请文件CSR
openssl req -new -key server.key -out server.csr
#这一步主要是去除密钥的密码,便于后续部署
openssl rsa -in server.key -out server.key
#生成自签名根证书并设置证书的有效期,crt是发给客户端的证书
openssl x509 -req -days 3650 -in server.csr -signkey server.key -out server.crt
#有的需要pem的证书,对证书做的转换
openssl x509 -in server.crt -out server.pem -outform PEM
参数说明:
req: 配置参数-x509指定使用 X.509证书签名请求管理(certificate signing request (CSR))."X.509" 是一个公钥代表that SSL and TLS adheres to for its key and certificate management.
-nodes: 告诉OpenSSL生产证书时忽略密码环节.(因为我们需要Nginx自动读取这个文件,而不是以用户交互的形式)。
-days 36500: 证书有效期,100年
-newkey rsa: 2048: 同时产生一个新证书和一个新的SSL key(加密强度为RSA 2048)
-keyout: SSL输出文件名
-out: 证书生成文件名
修改nginx配置
server {
listen 8080 ssl; #端口增加SSL支持
server_name _;
charset utf-8;
# ssl on;
ssl_certificate /usr/local/nginx/cert/server.crt;# 证书文件
ssl_certificate_key /usr/local/nginx/cert/server.key; #私钥文件
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
# access_log ./logs/access_stream.log main;
# error_log ./logs/error_stream.log;
location / {
root html;
index index.html index.htm;
try_files $uri $uri/ /index.html; # 防止Vue路由模式为history模式时刷新页面丢失
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
启动报错:nginx未开启SSL模块
root@linx:/usr/local/nginx/sbin# ./nginx
nginx: [emerg] the "ssl" parameter requires ngx_http_ssl_module in /usr/local/nginx/conf/nginx.conf:36
查看版本信息
root@linx:/opt/nginx-1.24.0# /usr/local/nginx/sbin/nginx -V
nginx version: nginx/1.24.0
built by gcc 4.9.2 (Linx 4.9.2-10-linx1)
configure arguments:
需要重新编译nginx
./configure --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module
编译完成后只make 不 install 安装
停掉nginx
/usr/local/nginx/sbin/nginx -s stop
复制新编译的nginx程序替换原有
cp ./objs/nginx /usr/local/nginx/sbin/
查看版本信息,增加ssl模块的版本信息
root@linx:~# /usr/local/nginx/sbin/nginx -V
nginx version: nginx/1.24.0
built by gcc 4.9.2 (Linx 4.9.2-10-linx1)
built with OpenSSL 1.0.1t 3 May 2016
TLS SNI support enabled
configure arguments: --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module
nginx的SSL性能调优
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers ECDHE-RSA-AES256-SHA384:AES256-SHA256:RC4:HIGH:!MD5:!aNULL:!eNULL:!NULL:!DH:!EDH:!AESGCM;
ssl_prefer_server_ciphers on;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
http转https
server {
listen 80;
server_name 192.168.152.3;
return 301 https://$server_name$request_uri;
}
访问400
需要在地址前面加 https://
证书不可信,生成证书时候增加 ext.in
extendedKeyUsage = serverAuth, clientAuth
basicConstraints = CA:FALSE
keyUsage = nonRepudiation,digitalSignature,keyEncipherment
subjectAltName = @alt_names
[alt_names]
IP.1=172.1.0.1
DNS.1=www.test.com
openssl x509 -req -days 3650 -in server.csr -signkey server.key -out server.crt -extfile ext.ini
然后重新使用Openssl重新生成证书,然后导出crt证书,在windows下加入到信任的根证书下面,再次访问浏览器,浏览器访问不会报错,上述配置说明该证书是IP或者域名所有的。
安装证书参考:JDK制作自签名证书,实现双向认证,解决谷歌浏览器证书无效问题,亲测有效_keytool生成自签名证书浏览器不信任怎么办-CSDN博客
其他参考:
内网nginx配置SSL_nginx 内网 ssl-CSDN博客
SpringBoot项目配置https访问单项认证谷歌有效证书_springboot写双向认证客户端认证-CSDN博客