PKI - 借助Nginx实现_客户端使用自签证书供服务端验证

news2024/11/24 9:44:49

文章目录

  • Pre
  • 概述
  • 在 Nginx 中实现客户端使用自签名证书供服务器验证
    • 1. 生成客户端密钥对
    • 2. 生成自签名客户端证书
    • 3. 配置 Nginx
    • 4. 重启 Nginx 修
    • 5. 验证
  • 在浏览器中安装客户端证书以便进行访问

在这里插入图片描述


Pre

PKI - 借助Nginx 实现Https 服务端单向认证、服务端客户端双向认证

PKI - 数字签名与数字证书

PKI - 借助Nginx 实现Https_使用CA签发证书


概述

客户端使用自签名证书供服务端验证的作用和意义主要体现在以下几个方面:

  1. 身份验证: 自签名证书可以用于验证客户端的身份。通过客户端提供的证书,服务端可以确保连接方是合法的客户端,并且拥有该证书对应的私钥。

  2. 加密通信: 使用自签名证书的客户端可以与服务端建立加密的通信通道。客户端的证书中包含了公钥,可以用于加密数据传输,保护数据的机密性。

  3. 防止中间人攻击: 通过客户端的证书验证,服务端可以确保与客户端直接通信,防止中间人攻击。如果客户端提供的证书无效或不匹配,服务端会拒绝连接,从而保护通信的安全性。

  4. 授权访问: 服务端可以根据客户端提供的证书对其进行授权访问。通过证书中的信息,服务端可以确定客户端的身份和权限,从而限制或授权其访问特定资源或功能。

  5. 建立信任关系: 使用自签名证书的客户端可以建立信任关系,并证明其身份是可信的。服务端可以信任由特定 CA 签发的证书,从而确保与合法的客户端进行通信,建立信任关系。

总的来说,客户端使用自签名证书供服务端验证可以加强通信的安全性和可靠性,确保通信双方的身份和数据的安全,建立起信任关系,从而提高整体系统的安全性。


在 Nginx 中实现客户端使用自签名证书供服务器验证

要在 Nginx 中实现客户端使用自签名证书供服务器验证,需要执行以下步骤:

1. 生成客户端密钥对

openssl genrsa -out client.key 2048

这个命令生成了一个 2048 位的 RSA 密钥对,其中私钥保存在 client.key 文件中。

2. 生成自签名客户端证书

openssl req -x509 -new -nodes -key client.key -subj "/CN=client" -days 10000 -out client.crt

这个命令生成了一个自签名的客户端证书。
-x509 参数表示生成的证书是自签名的 X.509 证书,
-new 参数表示生成一个新的证书请求,
-nodes 参数表示不加密生成的私钥,
-key 参数指定了用于生成证书的私钥,
-subj 参数用于指定证书的主题信息,其中 /CN=client 表示通用名称 (Common Name) 是 “client”,
-days 参数表示证书的有效期
-out 参数指定了输出的证书文件名。

通过这些命令,成功生成了一个自签名的客户端证书和私钥,可以用于客户端与服务器之间的安全通信。

请注意,这些证书和密钥是自签名的,因此在生产环境中可能需要进行更严格的安全性配置。


3. 配置 Nginx

在 Nginx 的配置文件中,添加以下 SSL 配置,以指定客户端证书和 CA 证书,并启用客户端证书验证:

server {
    listen 443 ssl;

   ssl on;
  ssl_certificate /cert/server.crt;
  ssl_certificate_key /cert/server.key;
  ssl_client_certificate /cert/client.crt;
  ssl_verify_client on;

  ssl_session_cache shared:SSL:1m;
  ssl_session_timeout 10m;
  ssl_ciphers HIGH:!aNULL:!MD5;
  ssl_prefer_server_ciphers on;


    ...
}

以下是每一项的含义解释:

  1. ssl on;

    • 启用 SSL/TLS。这告诉 Nginx 对来自客户端的连接启用 SSL/TLS 加密。
  2. ssl_certificate /cert/server.crt;

    • 指定服务器证书的路径。server.crt 是服务器的公钥证书,用于向客户端证明服务器的身份。这个证书将由服务器发送给客户端,以供客户端验证服务器的身份。
  3. ssl_certificate_key /cert/server.key;

    • 指定服务器私钥的路径。server.key 是服务器的私钥,用于解密客户端发送的加密数据。私钥必须与证书配对,并且只有持有私钥的服务器才能解密使用相应证书加密的数据。
  4. ssl_client_certificate /cert/client.crt;

    • 指定客户端 CA 证书的路径。client.crt 是用于验证客户端证书的 CA 证书。当 ssl_verify_client on; 时,服务器将使用指定的客户端 CA 证书对客户端发送的证书进行验证。
  5. ssl_verify_client on;

    • 启用客户端证书验证。当此选项设置为 on 时,Nginx 将要求连接客户端提供有效的客户端证书,并使用 ssl_client_certificate 中指定的 CA 证书对其进行验证。
  6. ssl_session_cache shared:SSL:1m;

    • 配置 SSL 会话缓存。这指定了用于缓存 SSL 会话信息的共享内存区域的名称和大小。这可以提高 SSL/TLS 连接的性能,减少握手过程的开销。
  7. ssl_session_timeout 10m;

    • 设置 SSL 会话超时时间。这指定了 SSL 会话在多久没有被使用后过期并被删除的时间。过期的 SSL 会话将被移除,以释放资源。
  8. ssl_ciphers HIGH:!aNULL:!MD5;

    • 配置 SSL 密码套件。这指定了允许使用的密码套件列表。在这个例子中,使用了一个高安全性的密码套件,禁用了空密钥和 MD5 散列算法。
  9. ssl_prefer_server_ciphers on;

    • 设置是否优先使用服务器密码套件。当此选项设置为 on 时,服务器将优先选择服务器端指定的密码套件,而不是客户端指定的密码套件。这有助于防止客户端通过协商使用较弱的密码套件。

通过正确配置这些 SSL 选项,您可以提高您的 Nginx 服务器的安全性,并确保 SSL/TLS 连接的机密性和完整性。

通过这个配置,Nginx 将在客户端建立连接时要求客户端提供有效的证书,并使用指定的 CA 证书对其进行验证。只有当客户端提供的证书被成功验证后,Nginx 才会允许连接建立,并允许客户端访问受保护的资源。


4. 重启 Nginx 修

改完 Nginx 配置后,重新加载或重启 Nginx 服务,使更改生效。

sudo systemctl reload nginx

现在,Nginx 已经配置为要求客户端使用自签名证书进行验证。当客户端发起连接时,Nginx 将验证客户端提供的证书是否由指定的 CA 签名,以及证书的有效性。如果验证通过,Nginx 将允许连接;否则,将拒绝连接。

请注意,客户端证书验证是双向的,即服务器会验证客户端提供的证书。因此,客户端在发起连接时需要提供有效的客户端证书和私钥。


5. 验证

执行

cur1  https://artisan.com  --resolve artisan.com:443:192.68.3.103

返回

<html>
<head><title>400 No required ssL certificate was sent</title></head>
<body>
<center><h1>400 Bad Request</h1></center>
<center>No required SsL certificate was sent</center>
<hr><center>nginx/1.16.1</center>
</body>
</htm1>

服务器返回了一个 400 Bad Request 错误,指示客户端没有发送必需的 SSL 证书。这是因为服务器配置了要求客户端提供 SSL 证书,但客户端在连接时未提供有效的 SSL 证书。


如何解决呢?

可以通过以下几种方式来解决这个问题:

  1. 提供有效的客户端 SSL 证书: 确保客户端在连接时提供了有效的 SSL 证书。可以使用生成的客户端证书来进行连接。

  2. 检查 SSL 配置: 检查服务器端的 SSL 配置,确保已正确启用客户端证书验证,并且指定了正确的客户端 CA 证书路径。

  3. 调试连接: 可以使用 OpenSSL 工具来模拟客户端连接并进行调试,以查看服务器的 SSL 配置是否正确。例如,您可以使用以下命令进行连接:

    openssl s_client -connect artisan.com:443 -CAfile /path/to/ca.crt -cert /path/to/client.crt -key /path/to/client.key
    

    其中,/path/to/ca.crt 是客户端 CA 证书的路径,/path/to/client.crt/path/to/client.key 是客户端证书和私钥的路径。通过这个命令,您可以模拟客户端连接并查看服务器的 SSL 配置是否正确。

  4. 检查服务器日志: 检查服务器的日志文件,查看是否有关于 SSL 握手失败的错误消息。这些日志可以提供更多的细节,帮助您确定问题所在。


我们 提供有效的客户端 SSL 证书继续试下

curl  https://artisan.com  --cacert /cert/ca.crt --cert /cert/client.crt --key  /cert/client.key --resolve artisan.com:443:192.168.3.103
  • --cacert /cert/ca.crt 客户端验证服务端用
  • --cert /cert/client.crt --key /cert/client.key 服务端验证客户端用 ,这个私钥不会发送给服务端,仅作为验证使用

OK, 可以正常访问。


在浏览器中安装客户端证书以便进行访问

完成双向认证后,如果想在浏览器中安装客户端证书以便进行访问,可以将客户端证书和私钥导出为 PKCS#12 格式 (PFX 文件),然后在浏览器中导入该文件。

下面是执行的步骤:

  1. 将客户端证书和私钥导出为 PKCS#12 格式:
    使用以下命令将客户端证书和私钥导出为 PKCS#12 格式的 PFX 文件:

    openssl pkcs12 -export -inkey /cert/client.key -in /cert/client.crt -out client.pfx
    

    这个命令将 client.crtclient.key 文件导出到一个名为 client.pfx 的 PKCS#12 文件中。

  2. 导入 PFX 文件到浏览器中:
    根据使用的浏览器不同,导入 PFX 文件的步骤可能会有所不同。一般来说,可以按照以下步骤来导入证书:

    • 在浏览器中打开设置或选项菜单。
    • 导航到安全性或证书管理部分。
    • 查找导入证书或安全令牌的选项,并选择导入。
    • 选择您之前导出的 client.pfx 文件,并输入密码(如果有的话)。
    • 完成导入后,浏览器将安装我们的客户端证书,并可以用于进行双向认证的访问。

通过执行这些步骤,浏览器就可以使用导入的客户端证书来进行与服务器的双向认证的安全通信。请注意,具体的操作步骤可能因浏览器版本和操作系统而有所不同,建议根据使用的浏览器和操作系统查阅相关文档以获取详细的指导。


[root@localhost cert]# openssl pkcs12 -export -inkey /root/cert/client.key -in /root/cert/client.crt -out client.pfx
Enter Export Password:
Verifying - Enter Export Password:
[root@localhost cert]#
[root@localhost cert]# ll
total 12
-rw-r--r--. 1 root root 1090 Feb 11 15:14 client.crt
-rw-r--r--. 1 root root 1675 Feb 11 15:13 client.key
-rw-r--r--. 1 root root 2365 Feb 11 16:21 client.pfx
[root@localhost cert]#
[root@localhost cert]#
[root@localhost cert]#


导入

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

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

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

相关文章

【Java EE初阶十二】网络编程TCP/IP协议(一)

1. 网络编程 通过网络&#xff0c;让两个主机之间能够进行通信->就这样的通信来完成一定的功能&#xff0c;进行网络编程的时候&#xff0c;需要操作系统给咱们提供一组API&#xff0c;通过这些API来完成编程&#xff1b;API可以认为是应用层和传输层之间交互的路径&#xf…

轴角与旋转矩阵、欧拉角与旋转矩阵、四元数与旋转矩阵的转换

一、轴角转换成旋转矩阵 C实现 #include <iostream> #include <Eigen/Dense> #define _USE_MATH_DEFINES #include <math.h> using namespace std;int main() {double theta M_PI/2;//90度Eigen::Vector3d xyz(1, 0, 0);//x轴Eigen::AngleAxisd rotation_…

Linux nohup命令和

参考资料 linux后台运行nohup命令的使用及2>&1字符详解 目录 前期准备一. 基本语法二. 执行时不指定日志文件三. 执行后不想要日志文件四. nohup命令的执行与kill4.1 执行4.2 kill 前期准备 &#x1f4c4;handle_file.sh #!/bin/bashecho "文件复制开始..."…

精读《js 模块化发展》

1 引言 如今&#xff0c;Javascript 模块化规范非常方便、自然&#xff0c;但这个新规范仅执行了 2 年&#xff0c;就在 4 年前&#xff0c;js 的模块化还停留在运行时支持&#xff0c;10 年前&#xff0c;通过后端模版定义、注释定义模块依赖。对经历过来的人来说&#xff0c;…

[VulnHub靶机渗透] WestWild 1.1

&#x1f36c; 博主介绍&#x1f468;‍&#x1f393; 博主介绍&#xff1a;大家好&#xff0c;我是 hacker-routing &#xff0c;很高兴认识大家~ ✨主攻领域&#xff1a;【渗透领域】【应急响应】 【python】 【VulnHub靶场复现】【面试分析】 &#x1f389;点赞➕评论➕收藏…

摩尔斯电码

1.介绍 摩尔斯电码是一种用来交流的系统&#xff0c;通过点和划来传递编码信息。 摩尔斯电码由两种不同的信号单位组成&#xff1a;点和划。在摩斯电码的官方术语&#xff0c;点通常读作“滴”。划通常读作“嗒”。 2.摩尔斯电码表 3.节奏和停顿 滴发短促的单音节音&#x…

免费数据恢复软件哪个好?适用于 Windows的顶级免费数据恢复软件推荐

终于要说到Windows 11了&#xff0c;有太多令人惊叹的功能&#xff0c;让人跃跃欲试。但是&#xff0c;在升级到 Windows 11 或使用 Windows 11 时&#xff0c;人们可能会因计算机问题而导致文件被删除或丢失。这就是为什么需要 Windows 11 的免费文件恢复的原因。这是适用于 W…

无人机遥感技术应用分析,无人机遥感系统测绘技术详解

由于无人机具有机动快速、使用成本低、维护操作简单等技术特点,因此被作为一种理想的飞行平台广泛应用于军事和民用各个领域。尤其是进入二十一世纪以后,许多国家将无人机系统的研究、开发、应用置于优先发展的地位,体积小、重量轻、探测精度高的新型传感器的不断问世,也使无人…

精品springboot疫苗发布和接种预约系统

《[含文档PPT源码等]精品基于springboot疫苗发布和接种预约系统[包运行成功]》该项目含有源码、文档、PPT、配套开发软件、软件安装教程、项目发布教程、包运行成功&#xff01; 软件开发环境及开发工具&#xff1a; Java——涉及技术&#xff1a; 前端使用技术&#xff1a;…

推荐系统|行为序列_用户行为序列建模、Din模型和SIM模型

文章目录 用户行为序列建模Din模型Din模型的缺点 用户行为序列建模 物品ID通过Embedding将会得到一个向量&#xff0c;性质差不多的向量在空间中也会处于差不多的位置&#xff0c;可以用取平均方式得到一个综合所有向量的向量。 取平均后可以作为代表用户的一个特征。 以上的…

使用 Windows 11/10 上的最佳 PDF 转 Word 转换器释放 PDF 的潜力

毫无疑问&#xff0c;PDF 是最好的文档格式之一&#xff0c;但就像其他格式一样&#xff0c;有时它们确实会带来一些限制。例如&#xff0c;在某些情况下&#xff0c;您可能想要将 PDF 转换为 Word。在这种情况下&#xff0c;您始终可以借助 PDF 到 Word 转换器的帮助。 为了说…

通过Dynamo删除Revit中族参数探究

起因是这样的&#xff0c;有位同事想在项目中直接删除revit族的参数&#xff0c;而不打开族&#xff0c;避免因为重载族&#xff0c;造成一些管件连接断开&#xff0c;于是就有了下面这些研究&#xff0c;当然是因为我没办法实现这个想法&#xff0c;所以这次可以分享下研究的过…

阿里云带宽计费模式怎么选?如何收费的?

阿里云服务器带宽计费模式分为“按固定带宽”和“按使用流量”&#xff0c;有什么区别&#xff1f;按固定带宽是指直接购买多少M带宽&#xff0c;比如1M、5M、10M、100M等&#xff0c;阿里云直接分配用户所购买的带宽值&#xff0c;根据带宽大小先付费再使用&#xff1b;按使用…

电磁兼容故障整改-辐射发射超标

设备的辐射于扰发射超标有两种可能:一种是设备外壳的屏蔽性能不完善;另一种是射频干扰经由电源线和其他线缆逸出。判断方法是拔掉不必要的电线和电源插头&#xff0c;或者将电缆长度减小至最短&#xff0c;继续做试验&#xff0c;如果没有任何改善迹象&#xff0c;则应怀疑是设…

从github上拉取项目到pycharm中

有两种方法&#xff0c;方法一较为简单&#xff0c;方法二用到了git bash&#xff0c;推荐方法一 目录 有两种方法&#xff0c;方法一较为简单&#xff0c;方法二用到了git bash&#xff0c;推荐方法一方法一&#xff1a;方法二&#xff1a; 方法一&#xff1a; 在github上复制…

css的布局(BFC)

一、css中常规的定位方案 1、普通流 元素按照其在HTML中的先后位置自上而下布局。 行内元素水平排列&#xff0c;当行被占满后换行&#xff1b;块级元素则会被渲染为完整的一行。 所有元素默认都是普通流定位。 2、浮动 元素首先按照普通流的位置出现&#xff0c; 然后根据浮动…

车载电子电器架构 —— 网络拓扑开发概述

车载电子电器架构 —— 网络拓扑开发概述 我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 屏蔽力是信息过载时代一个人的特殊竞争力,任何消耗你的人和事,多看一眼都是你的不对。非必要不费力证明…

【Java从入门到精通】Java变量类型

Java 变量类型 在 Java 语言中&#xff0c;所有的变量在使用前必须声明。 声明变量的基本格式如下&#xff1a; type identifier [ value][, identifier [ value] ...] ; 格式说明&#xff1a; type -- 数据类型。identifier -- 是变量名&#xff0c;可以使用逗号 , 隔开…

Github 2024-02-08 开源项目日报 Top9

根据Github Trendings的统计&#xff0c;今日(2024-02-08统计)共有9个项目上榜。根据开发语言中项目的数量&#xff0c;汇总情况如下&#xff1a; 开发语言项目数量Ruby项目1HTML项目1Python项目1Scala项目1PLpgSQL项目1Rust项目1NASL项目1C项目1TypeScript项目1非开发语言项目…

AI:126-基于深度学习的人体情绪识别与分析

🚀点击这里跳转到本专栏,可查阅专栏顶置最新的指南宝典~ 🎉🎊🎉 你的技术旅程将在这里启航! 从基础到实践,深入学习。无论你是初学者还是经验丰富的老手,对于本专栏案例和项目实践都有参考学习意义。 ✨✨✨ 每一个案例都附带有在本地跑过的关键代码,详细讲解供…