本地电脑基于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.exeicon-default.png?t=O83Ahttps://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.zipicon-default.png?t=O83Ahttps://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-adminlocation /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 successfulE:\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、结语

以上配置和验证写完了,有不明白或者不够细致的地方可以在评论区留言。

原创不易,希望各位客官点赞+评论+收藏,一键三连! 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/432353.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

了解云计算工作负载保护的重要性,确保数据和应用程序安全

云计算de小白 云计算技术的快速发展使数据和应用程序安全成为一种关键需求&#xff0c;而不仅仅是一种偏好。随着越来越多的客户公司将业务迁移到云端&#xff0c;保护他们的云工作负载&#xff08;指所有部署的应用程序和服务&#xff09;变得越来越重要。云工作负载保护&…

性能指标前言:`DOMContentLoaded`和`load`

前言&#xff1a;DOMContentLoaded和load 最初&#xff0c;评价前端页面加载性能有两个指标&#xff1a;DOMContentLoaded和load事件&#xff0c;分别代表 DOM 树构造完成和首屏资源加载完成。 DOM 文档加载步骤&#xff1a; 解析 html 结构加载外部脚本和样式表文件解析并执…

生活英语口语柯桥学英语“再确认一下“ 说成 “double confirm“?这是错误的!

在追求英语表达的过程中&#xff0c;我们常常会遇到一些看似合理实则错误的表达习惯。今天&#xff0c;我们就来聊聊一个常见的误区——“再确认一下”被误译为“double confirm”。 “再次确认”不是double confirm 首先&#xff0c;我们需要明确&#xff0c;“double confi…

线性基定义性质及例题

线性基的定义 以上是官方给出的线性基的定义&#xff0c;但是需要一定的线性代数的基础&#xff0c;其实线性基很好理解&#xff0c;我们用下面一个例子去讲解 假设有3个数&#xff0c;1,2,3&#xff0c;我们这三个数互相异或总共有八种可能&#xff0c;我们能否找到一组数去…

HelpLook VS GitBook,在线文档管理工具对比

在线文档管理工具在当今时代非常重要。随着数字化时代的到来&#xff0c;人们越来越依赖于电子文档来存储、共享和管理信息。无论是与团队合作还是与客户分享&#xff0c;人们都可以轻松地共享文档链接或通过设置权限来控制访问。在线文档管理工具的出现大大提高了工作效率和协…

探索GPU算力在大模型和高性能计算中的无限潜能

在当今科技领域&#xff0c;大模型和高性能计算正以惊人的速度发展。大模型如语言模型、图像识别模型等&#xff0c;规模越来越大&#xff0c;精度越来越高&#xff0c;能够处理复杂的任务和生成逼真的结果。高性能计算则凭借强大的计算能力&#xff0c;推动着科学研究、工程设…

PMP与CMMI:两种管理方法的对比

PMP与CMMI&#xff1a;两种管理方法的对比 PMP&#xff1a;专注于项目管理CMMI&#xff1a;组织过程改进的框架总结&#xff1a;互补而非替代 在现代企业管理中&#xff0c;项目管理和组织能力成熟度模型集成&#xff08;CMMI&#xff09;是两个经常被提及的概念。虽然它们都是…

Java项目实战II基于Java+Spring Boot+MySQL的汽车销售网站(文档+源码+数据库)

目录 一、前言 二、技术介绍 三、系统实现 四、文档参考 五、核心代码 六、源码获取 全栈码农以及毕业设计实战开发&#xff0c;CSDN平台Java领域新星创作者&#xff0c;专注于大学生项目实战开发、讲解和毕业答疑辅导。获取源码联系方式请查看文末 一、前言 在数字化时…

Clion使用vcpkg管理C/C++包

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、Clion安装vcpkg二、使用步骤1.切换到清单模式2.开始安装包 三、测试代码总结 前言 Linux上的库基本都可以通过apt或yum等包管理工具来在线安装包&#xff…

力扣 简单 876.链表的中间结点

文章目录 题目介绍题解 题目介绍 题解 法一&#xff1a; class Solution {public ListNode middleNode(ListNode head) {ListNode cur head;int n 0;while (cur ! null) {n;cur cur.next;}ListNode curr head;for (int i 0; i < n / 2; i) {curr curr.next;}return …

Unity对象池的高级写法 (Plus优化版)

唐老师关于对物体分类的OOD的写法确实十分好&#xff0c;代码也耦合度也低&#xff0c;但是我有个简单的写法同样能实现一样的效果&#xff0c;所以我就充分发挥了一下主观能动性 相较于基本功能&#xff0c;这一版做出了如下改动 1.限制了对象池最大数量&#xff0c;多出来的…

【hot100-java】【括号生成】

R9-回溯篇 枚举填左括号 class Solution {private int n;private char[] path;private final List<String> retnew ArrayList<>();public List<String> generateParenthesis(int n) {this.nn;//所有括号长度都是n*2pathnew char [n*2];dfs(0,0);return ret;…

求10 个整数中最大值

我们需要10个整数之中求出10个整数之中的最大值所以我们先要将10个整数先放置到一个容器之中&#xff0c;我们初期就使用数组的形式存放10个数组即设置数组arr[10]&#xff0c;我们要将10个数组之中的数字输出出来&#xff0c;我们这里使用的是遍历循环输出数组。我们这里是使用…

Redis 字符串类型的典型应用场景

目录 1. 缓存功能 2. 计数功能 3. 共享会话&#xff08;Session&#xff09; 4. 手机验证码 前言 这里将详细介绍 Redis 字符串类型在实际开发中的几个典型应用场景&#xff0c;并提供相应的伪代码示例。 1. 缓存功能 场景描述 在许多Web应用中&#xff0c;数据通常需要…

这6个aigc软件,性价比之王

随着人工智能技术的迅猛发展&#xff0c;越来越多的应用程序开始集成AIGC&#xff08;人工智能生成内容&#xff09;功能&#xff0c;提升用户体验。本文将介绍六款实用的AIGC软件下载&#xff0c;帮助您在各个领域提高工作效率&#xff0c;释放创造力。 1、即时 AI 作为国内…

Acwing Floyd算法

Acwing Floyd算法 Floyd-Warshall 算法&#xff0c;用于解决图中任意两点之间的最短路径问题。Floyd-Warshall 是一种 多源最短路径算法&#xff0c;可以处理带正权或负权的边&#xff0c;但要求图中不能有负权回路。 通过三层循环对每个顶点作为中转点 k 进行更新。通过检查…

企业为什么要上项目管理系统?项目管理的六大核心要素

随着企业规模的不断扩大和项目数量的增多&#xff0c;传统的手工管理方式已经无法满足企业在项目管理方面的需求。项目管理系统能够帮助企业实现项目信息的集中管理&#xff0c;将所有相关的项目信息&#xff08;如任务、进度、预算、人员等&#xff09;集中存储在一个平台上&a…

【STM32】 TCP/IP通信协议(1)

一、前言 TCP/IP是干啥的&#xff1f;它跟SPI、IIC、CAN有什么区别&#xff1f;它如何实现stm32的通讯&#xff1f;如何去配置&#xff1f;为了搞懂这些问题&#xff0c;查询资料可解决如下疑问&#xff1a; 1.为什么要用以太网通信? 以太网(Ethernet) 是指遵守 IEEE 802.3 …

中国式报表制作困难?!那是因为你没选对报表工具!

一、报表工具介绍 在信息化时代&#xff0c;数据是企业决策的核心驱动力。报表工具作为数据处理与分析的重要手段&#xff0c;广泛应用于财务、销售、运营等各个领域&#xff0c;成为企业洞察市场、优化管理、提升效率的关键工具。传统上&#xff0c;报表制作依赖于复杂的编程…