本地电脑基于nginx的https单向认证和双向认证(自制证书+nginx配置)保姆级

news2024/11/18 0:24:23

目录

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-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、结语

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

openEuler 20.03,22.03,24.03一键部署Oracle23ai rpm

Oracle23ai前言 Oracle Database 23ai Free 让您可以充分体验 Oracle Database 的能力,世界各地的企业都依赖它来处理关键任务工作负载。 Oracle Database Free 的资源限制为 2 个 CPU(前台进程)、2 GB 的 RAM 和 12 GB 的磁盘用户数据。该软件包不仅易于使用,还可轻松下载…

智慧体育馆可视化:实时监控与智能管理

利用图扑可视化技术实现对体育馆的实时监控和数据分析&#xff0c;提升运营效率、观众体验和安全管理水平&#xff0c;打造智能化场馆环境。

Tomcat may not be running

一、问题背景 tomcat7运行在JDK1.7上&#xff0c;可启动tomcat&#xff0c;但是停止时报错误&#xff0c;如下&#xff1a; 二、适用条件 JDK1.7/JDK1.8 tomcat7 三、解决方法 1、查找java路径 which java 2、修改文件 找到/usr/lib/jvm/jdk1.7.0_80/jre/lib/security/j…

专业学习|《随机过程》学习笔记(二)(定义、分类及相关过程)

一、随机过程 &#xff08;一&#xff09;随机过程定义 &#xff08;1&#xff09;基本概念 随机过程是随机变量的延伸。 &#xff08;2&#xff09;描述随机过程的方法 &#xff08;3&#xff09;随机过程的分类和举例 &#xff08;4&#xff09;随机过程的数字特征 随机过…

【Python实操】淘宝商品详情数据采集返回并实现可视化处理

开发工具 Python版本&#xff1a;3.6.4 相关模块&#xff1a; DecryptLogin模块&#xff1b; pyecharts模块&#xff1b; 以及一些Python自带的模块。 环境搭建 安装Python并添加到环境变量&#xff0c;pip安装需要的相关模块即可。 数据爬取 既然说了是模拟登录相关的爬…

3519嵌入式如何通过ssh 或者telnet连接嵌入式设备

需求 PC电脑连接嵌入式设备&#xff0c;已经能够连接串口&#xff0c;想要额外连接嵌入式设备&#xff0c;查看终端信息。 尝试了两种方法&#xff1a;1.通过SSH登录(失败) 2.通过telnet登录(成功) 问题描述 1.SSH登录 3519通过网线和串口线连接PC windows&#xff0c;并在…

日本科学家利用AI技术在秘鲁纳斯卡沙漠地区找到303幅古代地画

据法新社24日报道&#xff0c;日本科学家利用 人工智能&#xff08; AI&#xff09;技术在秘鲁纳斯卡沙漠地区新发现了303幅古代地画。相关研究成果已于23日发表在《美国国家科学院院刊》上。 日本山形大学考古学家酒井正人23日在秘鲁首都利马宣布了这一新发现&#xff0c;他表…

JavaScript中的函数function

function 可以将一个函数赋给一个变量&#xff0c;直接调用 或者常规的有变量名的函数 break:打断循环 continue:打断当前循环&#xff0c;进行下一轮 debugger:调试程序自动断点 "use strict":严格模式 var hasStrictMode(function(){"use strict";r…

langchain 记忆力(memory),让语言大模型拥有记忆

1&#xff0c;简介 存储对话历史中的信息的能力称之为’记忆‘&#xff0c;这种工具可以单独使用&#xff0c;也可以无缝的集成到一条链中,记忆的存储长度是程序执行到结束&#xff0c;执行一次的所有记忆。 记忆的主要应用场景就是聊天机器人&#xff0c;聊天机器人的一个关键…

Golang | Leetcode Golang题解之第429题N叉树的层序遍历

题目&#xff1a; 题解&#xff1a; func levelOrder(root *Node) (ans [][]int) {if root nil {return}q : []*Node{root}for q ! nil {level : []int{}tmp : qq nilfor _, node : range tmp {level append(level, node.Val)q append(q, node.Children...)}ans append(a…

误删回收站的文件怎么恢复正常,不小心删除回收站的文件怎么找回

现如今&#xff0c;电脑在工作中承担着很重要的角色&#xff0c;里面往往存储着很多重要的工作资料文件&#xff0c;而回收站作为电脑对数据文件的最后保护&#xff0c;往往能够避免数据文件的丢失。下面就给大家详细讲解有关&#xff0c;误删回收站的文件怎么恢复&#xff0c;…

AI日常绘画【国庆海报】:盛世迎华诞,最强AI绘图大模型Flux国庆节海报制作教程

大家好&#xff0c;我是画画的小强 马上就要到祖国母亲的节日了&#xff0c;想想心里都美滋滋的&#xff0c;终于可以放松一下了。相信AI绘画关于国庆主题肯定也会精彩纷呈吧&#xff0c;今天和大家分享几组关于国庆海报的制作教程。 本文使用基于Flux的相关Lora模型。 Loar1…

Docker快速部署RabbitMq教程

1、拉取RabbitMQ镜像 docker pull rabbitmq:management RabbitMQ Management 插件为 RabbitMQ 提供了一个基于 Web 的用户界面&#xff08;Management UI&#xff09;&#xff0c;允许你通过浏览器来监控、管理 RabbitMQ 实例。 因为docker默认是使用的是Docker Hub的官方镜…

Matlab进阶绘图第69期—同步坐标图

同步坐标是指将同一figure上的两个或两个以上的子图&#xff0c;用相同的X轴、Y轴或XY轴表示&#xff0c;以方便同步分析。 话不多说&#xff0c;先来看一下同步坐标图的成品效果&#xff1a; 特别提示&#xff1a;本期内容『数据代码』已上传资源群中&#xff0c;加群的朋友请…

RocketMQ 常用命令mqadmin与控制面板

使⽤发送和接收消息验证MQ 验证生产者&#xff1a; 配置 nameserver 的环境变量 &#xff0c;在发送/ 接收消息之前&#xff0c;需要告诉客户端 nameserver 的位置。配置环境变量 NAMESRV_ADDR &#xff1a; vim /etc/profileexport NAMESRV_ADDR"192.168.136.66:9876;1…

虚幻引擎第三人称和第一人称任意切换

虚幻引擎想要在第三人称和第一人称之间任意切换 , 就需要创建两个摄像机 第一人称摄像机 默认激活 去掉勾选 然后添加一个增强输入 双击进去绑定 设置成已按下 , 这样长按只会生效一次 打开第三人称事件图表 , 按如图所示设置即可 , 记得设置第一人称用控制器旋转Yaw , 这…

【机器学习】音乐生成——AI如何创作个性化音乐与配乐

我的主页&#xff1a;2的n次方_ 音乐是人类文化的重要组成部分&#xff0c;它具有极强的情感表达和艺术价值。近年来&#xff0c;随着人工智能技术的飞速发展&#xff0c;AI已经能够自动生成音乐&#xff0c;甚至根据用户需求创作个性化配乐。AI生成音乐的应用场景广泛&…

antd嵌套表单验证

好久之前写的&#xff0c;但是突然想起来没写到这里&#xff0c;还是写一下吧~, 也没啥技术含量&#xff0c;就是有需要的同学要是能一下子看到就方便了~ 嵌套表单项精髓就是在shouldUpdate属性 注意这句&#xff0c;当 shouldUpdate 为 true 时&#xff0c;Form 的任意变化都…

LVS-NAT实战案例,实现四层负载均衡

工作原理 架构概述&#xff1a; 在LVS-NAT架构中&#xff0c;客户端的请求首先到达负载均衡器&#xff08;LVS服务器&#xff09;&#xff0c;然后由LVS根据一定的算法将请求转发到后端的真实服务器。负载均衡器会通过NAT技术修改数据包的源地址和目标地址。 数据流转&#xff…

C++之STL—常用遍历算法

算法头文件 <algorithm>是所有STL头文件中最大的一个&#xff0c;范围涉及到比较、 交换、查找、遍历操作、复制、修改等等 <numeric>体积很小&#xff0c;只包括几个在序列上面进行简单数学运算的模板函数 <functional>定义了一些模板类,用以声明函数对象…