本地电脑基于nginx的https单向认证和双向认证(自制证书+nginx配置)保姆级
目录
1、背景
2、运行环境
3、工具下载
3.1、OpenSSL下载
3.2、nginx下载
4、制作https证书:
4.1、CA与自签名:
4.2、制作CA根证书(公钥)
4.3、制作服务端证书:
4.4、制作客户端证书:
4.5、制作PFX证书
5、进行https认证配置:
5.1、单向认证
5.1.1、nginx.conf配置
5.1.2、验证配置文件
5.1.3、域名指向配置
5.1.3、浏览器客户端验证
5.2、双向配置
5.2.1、nginx.conf配置
5.2.2、验证配置文件
5.2.3、浏览器客户端验证-1
5.2.4、浏览器客户端配置
5.2.4、浏览器客户端验证-2
1、背景
公司有个项目需要做相关的https接口的检测,需要用到客户端证书认证,也就是需要客户端发起请求的时候携带客户端证书的那种,中间也看了一些网上材料说的不是很全,特地编写此文记录并帮助有需要的朋友,同时基于此基础上再POSTMAN工具上做了上传证书和接口验证。
2、运行环境
本次环境为win10+jdk1.8;准备使用openssl3.3.2制作证书、nginx1.27.1代理和证书配置,以下会介绍openssl3.3.2和nginx1.27.1的下载
3、工具下载
3.1、OpenSSL下载
https://slproweb.com/products/Win32OpenSSL.html
下载地址:https://slproweb.com/download/Win64OpenSSL-3_3_2.exehttps://slproweb.com/download/Win64OpenSSL-3_3_2.exe
选择Win64 OpenSSL v3.3.2
安装成功后将openssl的bin文件夹目录配置到系统环境变量Path中,目的是为了后续使用openssl的命令在cmd窗口的任何路径都可以使用;系统变量Path配置如下所示:
在cmd窗口中使用命令openssl -v,出现openssl的版本信息即表示安装成功。
E:\software\nginx-1.27.1>openssl -v
OpenSSL 3.3.2 3 Sep 2024 (Library: OpenSSL 3.3.2 3 Sep 2024)
3.2、nginx下载
https://nginx.org/en/download.html
下载地址:https://nginx.org/download/nginx-1.27.1.ziphttps://nginx.org/download/nginx-1.27.1.zip
安装成功后的路径在E:\software\nginx-1.27.1,鼠标双击nginx.exe即可启动nginx,可在谷歌浏览器访问http://localhost/出现如下界面表示成功:
4、制作https证书:
nginx安装目录E:\software\nginx-1.27.1\conf下新建证书文件夹SSL,进入该文件夹SSL开始制作证书
4.1、CA与自签名:
制作CA私钥
openssl genrsa -out ca.key 2048
4.2、制作CA根证书(公钥)
openssl req -new -x509 -days 3650 -key ca.key -out ca.crt
制作证书的时候需要填写相关信息,以下信息可以参考下填写
EMAILADDRESS=11@qq.com, CN=root, OU=rz, O=rz, L=changsha, ST=hunan, C=zh
4.3、制作服务端证书:
制作服务端私钥
openssl genrsa -out server.pem 1024
openssl rsa -in server.pem -out server.key
生成签发请求
openssl req -new -key server.pem -out server.csr
用CA签发
openssl x509 -req -sha256 -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -days 3650 -out server.crt
制作证书的时候需要填写相关信息,以下信息可以参考下填写,其中CN是填写的HTTPS需访问域名apitest.local.cn,这个并不是一个外部购买域名,是本地虚拟的,等全部证书配置完后会把此域名配置到hosts文件进行本地映射。
EMAILADDRESS=11@qq.com, CN=apitest.local.cn, OU=rz, O=rz, L=changsha, ST=hunan, C=zh
4.4、制作客户端证书:
制作客户端私钥
openssl genrsa -out client.pem 1024
openssl rsa -in client.pem -out client.key
生成签发请求
openssl req -new -key client.pem -out client.csr
用CA签发
openssl x509 -req -sha256 -in client.csr -CA ca.crt -CAkey ca.key -CAcreateserial -days 3650 -out client.crt
制作证书的时候需要填写相关信息,以下信息可以参考下填写,其中CN是填写的HTTPS需访问域名apitest.local.cn(此CN与服务器证书保持一致),这个并不是一个外部购买域名,是本地虚拟的,等全部证书配置完后会把此域名配置到hosts文件进行本地映射。
EMAILADDRESS=11@qq.com, CN=apitest.local.cn, OU=rz, O=rz, L=changsha, ST=hunan, C=zh
4.5、制作PFX证书
windows上安装的证书需要pfx格式,也叫p12格式,生成方式如下:
openssl pkcs12 -export -inkey client.key -in client.crt -out client.pfx
执行以上命令的时候需要输入一个密码,可简单设置自己容易记住的,后续导入证书到浏览器会用到此密码。
5、进行https认证配置:
先将本地nginx.conf文件做以下复制备份
5.1、单向认证
5.1.1、nginx.conf配置
单向认证只需在服务端Nginx的配置文件nginx.conf里面做配置即可:
# HTTPS server
#
server {
listen 443 ssl;
listen [::]:443 ssl;
server_name apitest.local.cn;
#单向认证
#配置服务端证书,所有证书文件建议放在Nginx文件夹下,避免SELINUX导致的证书文件读取错误
ssl_certificate SSL/server.crt;
#配置服务端秘钥
ssl_certificate_key SSL/server.key;
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 10m;
#ssl_ciphers HIGH:!aNULL:!MD5;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4; #加密算法
#安全链接可选的加密协议
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
location / {
root html;
index index.html index.htm;
}
location /ubase-admin {
proxy_pass http://127.0.0.1:8088;
proxy_set_header Host $Host:$server_port;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header REMOTE-HOST $remote_addr;
add_header X-Cache $upstream_cache_status;
proxy_set_header X-Host $host:$server_port;
proxy_set_header X-Scheme $scheme;
proxy_connect_timeout 30s;
proxy_read_timeout 86400s;
proxy_send_timeout 30s;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
# HTTP反向代理相关配置结束 <<<
access_log /temp-ubase-admin.log;
error_log /temp-ubase.error.log;
}
5.1.2、验证配置文件
配置Nginx,测试Nginx配置文件是否有语法错误命令nginx -t:
验证配置文件失败示例:
以下表示找不到相应的文件,可能是路径配置错误了
E:\software\nginx-1.27.1>nginx -t
nginx: [emerg] cannot load certificate "E:\software\nginx-1.27.1/conf/SSL2/server.crt": BIO_new_file() failed (SSL: error:80000003:system library::No such process:calling fopen(E:\software\nginx-1.27.1/conf/SSL2/server.crt, r) error:10000080:BIO routines::no such file)
nginx: configuration file E:\software\nginx-1.27.1/conf/nginx.conf test failed
重新加载Nginx配置文件,然后以优雅的方式重启Nginx:nginx -s reload
验证配置文件成功示例:
E:\software\nginx-1.27.1>nginx -t
nginx: the configuration file E:\software\nginx-1.27.1/conf/nginx.conf syntax is ok
nginx: configuration file E:\software\nginx-1.27.1/conf/nginx.conf test is successful
5.1.3、域名指向配置
先在window hosts文件后追加以下代码,一般hosts文件在
C:\Windows\System32\drivers\etc
127.0.0.1 apitest.local.cn
追加完后保存文件即可。
5.1.3、浏览器客户端验证
在客户端谷歌浏览器进行验证,在谷歌浏览器url地址栏中输入:https://apitest.local.cn/ubase-admin/captchaImage,按enter进行访问弹出不安全连接的警告,点击忽略继续访问,成功访问到资源即单向配置成功了。
以上访问地址中apitest.local.cn域名就是证书中配置的CN值,同时在hosts文件中做了配置指向本地服务器,其中的/ubase-admin是nginx.conf配置的代码服务路径,指向本地启动的一个测试应用服务其中有一个GET API接口captchalmage,出现以下截图示例表示单向认证成功了。
5.2、双向配置
5.2.1、nginx.conf配置
在单向配置的基础之上只需将根认证证书(公钥配置在nginx里面),并打开https双向认证的设置:ssl_verify_client on
# HTTPS server
#
server {
listen 443 ssl;
listen [::]:443 ssl;
server_name apitest.local.cn;
#单向认证
#配置服务端证书,所有证书文件建议放在Nginx文件夹下,避免SELINUX导致的证书文件读取错误
ssl_certificate SSL/server.crt;
#配置服务端秘钥
ssl_certificate_key SSL/server.key;
#双向认证
#开启客户端证书校验
ssl_verify_client on;
#配置客户端证书用于验证客户端合法性
ssl_client_certificate SSL/ca.crt;
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 10m;
#ssl_ciphers HIGH:!aNULL:!MD5;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4; #加密算法
#安全链接可选的加密协议
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
location / {
root html;
index index.html index.htm;
}
# 本地测试应用服务ubase-admin
location /ubase-admin {
proxy_pass http://127.0.0.1:8088;
proxy_set_header Host $Host:$server_port;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header REMOTE-HOST $remote_addr;
add_header X-Cache $upstream_cache_status;
proxy_set_header X-Host $host:$server_port;
proxy_set_header X-Scheme $scheme;
proxy_connect_timeout 30s;
proxy_read_timeout 86400s;
proxy_send_timeout 30s;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
# HTTP反向代理相关配置结束 <<<
access_log /temp-ubase-admin.log;
error_log /temp-ubase.error.log;
}
5.2.2、验证配置文件
重新配置Nginx,测试Nginx配置文件是否有语法错误:nginx -t,重新加载Nginx配置文件,然后以优雅的方式重启Nginx:nginx -s reload
E:\software\nginx-1.27.1>nginx -t
nginx: the configuration file E:\software\nginx-1.27.1/conf/nginx.conf syntax is ok
nginx: configuration file E:\software\nginx-1.27.1/conf/nginx.conf test is successful
E:\software\nginx-1.27.1>nginx -s reload
5.2.3、浏览器客户端验证-1
在验证之前先参考5.1.3、域名指向配置
在客户端谷歌浏览器进行验证,在浏览器url地址栏中输入:https://apitest.local.cn/ubase-admin/captchaImage,按enter进行访问会弹出以下拦截提示:
5.2.4、浏览器客户端配置
因为是双向认证,在发起客户端是需要做相关配置的,所以我们需要将之前做的客户端证书导入到谷歌浏览器中才能访问。
打开谷歌浏览器(版本 123.0.6312.106(正式版本) 64 位),找到:设置->隐私设置和安全性->安全->管理证书:
点击安全,然后再点击管理证书
点击导入,再点击下一步。
选择之前做的client.pfx证书
5.2.4、浏览器客户端验证-2
然后将准备好的证书client.pfx导入到浏览器中,导入成功后关闭浏览器然后再重启(一定要重启谷歌浏览器),重新访问刚才的的https://apitest.local.cn/ubase-admin/captchaImage,就会提示:
浏览器会自动弹出此证书选择框提示,点击你选中你刚才导入的证书然后就可以正常访问了
6、结语
以上配置和验证写完了,有不明白或者不够细致的地方可以在评论区留言。
原创不易,希望各位客官点赞+评论+收藏,一键三连!