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

文章目录

  • 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://xiahunao.cn/news/2780684.html

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

相关文章

线性代数的本质——1 向量

向量是线性代数中最为基础的概念。 何为向量&#xff1f; 从物理上看&#xff0c; 向量就是既有大小又有方向的量&#xff0c;只要这两者一定&#xff0c;就可以在空间中随便移动。 从计算机应用的角度看&#xff0c;向量和列表很接近&#xff0c;可以用来描述某对象的几个不同…

人力资源智能化管理项目(day05:角色管理)

学习源码可以看我的个人前端学习笔记 (github.com):qdxzw/humanResourceIntelligentManagementProject 搭建页面结构 分页组件&#xff1a;设置layout&#xff0c;表示需要显示的内容&#xff0c;用逗号分隔&#xff0c;布局元素会依次显示。prev表示上一页&#xff0c;next为…

HP Pavilion Laptop 15-cs3xxx原装出厂Win10.20H1系统

惠普笔记本HP Pavilion - 15-cs3030tx原厂Windows10系统镜像下载 链接&#xff1a;https://pan.baidu.com/s/1LmdJoN7F3BGvt49ovq-eww?pwdzgmt 提取码&#xff1a;zgmt 适用型号&#xff1a; 15-cs3001tx&#xff0c;15-cs3030tx&#xff0c;15-cs3031tx&#xff0c;15-cs…

数据结构:并查集讲解

并查集 1.并查集原理2.并查集实现3.并查集应用4.并查集的路径压缩 1.并查集原理 在一些应用问题中&#xff0c;需要将n个不同的元素划分成一些不相交的集合。开始时&#xff0c;每个元素自成一个单元素集合&#xff0c;然后按一定的规律将归于同一组元素的集合合并。在此过程中…

寒假作业2024.2.11

请使用递归实现n! #include <stdio.h> #include <stdlib.h> #include <string.h> #include <math.h> #include <unistd.h> int fun(int n) {if (n0) {return 1;} else {return n*fun(n-1);} } int main(int argc, const char *argv[]) {int n…

Vue核心基础3:计算属性和监视属性

1 计算属性 这边以姓名案例&#xff0c;来介绍计算属性 <body><div id"root"><!-- 姓&#xff1a;<input type"text" v-model:value"firstName"><br>名&#xff1a;<input type"text" v-model:value&…

《CSS 简易速速上手小册》第10章:未来的 CSS(2024 最新版)

文章目录 10.1 CSS 的新特性和趋势10.1.1 基础知识10.1.2 重点案例&#xff1a;使用 CSS Grid 创建响应式图库10.1.3 拓展案例 1&#xff1a;利用 CSS 变量实现主题切换10.1.4 拓展案例 2&#xff1a;使用 lab() 颜色和 layer 规则优化样式 10.2 CSS Houdini&#xff1a;魔法般…

C++进阶(十四)智能指针

&#x1f4d8;北尘_&#xff1a;个人主页 &#x1f30e;个人专栏:《Linux操作系统》《经典算法试题 》《C》 《数据结构与算法》 ☀️走在路上&#xff0c;不忘来时的初心 文章目录 一、为什么需要智能指针&#xff1f;二、内存泄漏1、 什么是内存泄漏&#xff0c;内存泄漏的危…

STM32 7-8

目录 ADC AD单通道 AD多通道 DMA DMA转运数据 DMAAD多通道 ADC AD单通道 AD.c #include "stm32f10x.h" // Device header/*** brief 初始化AD所需要的所有设备* param 无* retval 无*/ void AD_Init(void) {RCC_APB2PeriphClockCmd(RCC_AP…

在程序中使用日志功能

在应用中&#xff0c;需要记录程序运行过程中的一些关键信息以及异常输出等。这些信息用来排查程序故障或者其他用途。 日志模块可以自己实现或者是借用第三方库&#xff0c;之前写过一个类似的使用Qt的打印重定向将打印输出到文件&#xff1a;Qt将打印信息输出到文件_qt log输…

【JavaEE】_HTML常用标签

目录 1.HTML结构 2. HTML常用标签 2.1 注释标签 2.2 标题标签&#xff1a;h1~h6 2.3 段落标签&#xff1a;p 2.4 换行标签&#xff1a;br 2.5 格式化标签 2.6 图片标签&#xff1a;img 2.7 超链接标签&#xff1a;a 2.8 表格标签 2.9 列表标签 2.10 表单标签 2.10…

C++继承(二):菱形继承、virtual菱形虚拟继承

目录 一、了解菱形继承 二、菱形继承的问题 三、虚拟继承virtual 3.1virtual 3.2虚拟继承解决数据冗余和二义性的原理 四、总结/继承和组合 一、了解菱形继承 单继承&#xff1a;一个子类只有一个直接父类时称这个继承关系为单继承 多继承&#xff1a;一个子类有两个或…

C++重新入门-C++ 函数

函数是一组一起执行一个任务的语句。每个 C 程序都至少有一个函数&#xff0c;即主函数 main() &#xff0c;所有简单的程序都可以定义其他额外的函数。 您可以把代码划分到不同的函数中。如何划分代码到不同的函数中是由您来决定的&#xff0c;但在逻辑上&#xff0c;划分通常…

春节折腾了4天,终于用上了win11和matlab2023b

这个春节折腾了4天&#xff0c;终于与时俱进用上了win11和matlab2023b。 新购的硬盘&#xff0c;顺丰快递给力2天半到手。 先折腾硬盘&#xff0c;连线&#xff0c;没有盘符&#xff0c;使用管理&#xff0c;初始化&#xff0c;格式化&#xff0c;新建卷。下载win11&#xff0…

导数的定义【高数笔记】

【含义】可以抽象成&#xff0c;在一个极其短的时间段内&#xff0c;温度差 / 时间差 【本质】瞬间的平均值 【分类】可以分成几类&#xff1f;每类需要注意的点 【导数存在的必要条件】 【导数与极限的关系】可以参考导数的定义的式子 【题型解法】分几个题型&#xff1f;每个…

2.12作业

程序代码&#xff1a; #include<stdlib.h> #include<string.h> #include<stdio.h>//递归实现n! int n(int element) {if(0element)return 1;return element*n(element-1); }//递归实现0-n的和 int sub_sum(int element) {if(0element)return 0;return eleme…

system V——进程间通信

上一篇博客中我介绍了system V进程间通信中的内存共享&#xff0c;但是其中还有两 种通信方式&#xff1a;消息队列、和信号量&#xff0c;接下来我将简单介绍一下&#xff0c;消息队列和 信号量以及操作系统是如何看待system V进程间通信的。1. 消息队列 a. 大致介绍 消息队…

用HTML5 + JavaScript绘制花、树

用HTML5 JavaScript绘制花、树 <canvas>是一个可以使用脚本 (通常为JavaScript) 来绘制图形的 HTML 元素。 <canvas> 标签/元素只是图形容器&#xff0c;必须使用脚本来绘制图形。 HTML5 canvas 图形标签基础https://blog.csdn.net/cnds123/article/details/112…

腾讯云4核8G服务器性能如何?支持多少用户访问?

腾讯云4核8G服务器支持多少人在线访问&#xff1f;支持25人同时访问。实际上程序效率不同支持人数在线人数不同&#xff0c;公网带宽也是影响4核8G服务器并发数的一大因素&#xff0c;假设公网带宽太小&#xff0c;流量直接卡在入口&#xff0c;4核8G配置的CPU内存也会造成计算…

{}初始化和初始化列表

C98标准中允许使用花括号对数组和自定义类型的变量进行初始化&#xff0c;C11扩展了大括号的用途&#xff0c;允许使用花括号对所有的内置类型和自定义类型进行初始化&#xff0c;使用时&#xff0c;可以加号&#xff0c;也可以不加。 对于自定义类型&#xff0c;当花括号中的常…