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

本文主要是介绍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]#

导入

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

在这里插入图片描述

在这里插入图片描述

这篇关于PKI - 借助Nginx实现_客户端使用自签证书供服务端验证的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/700736

相关文章

Spring Security自定义身份认证的实现方法

《SpringSecurity自定义身份认证的实现方法》:本文主要介绍SpringSecurity自定义身份认证的实现方法,下面对SpringSecurity的这三种自定义身份认证进行详细讲解,... 目录1.内存身份认证(1)创建配置类(2)验证内存身份认证2.JDBC身份认证(1)数据准备 (2)配置依

利用python实现对excel文件进行加密

《利用python实现对excel文件进行加密》由于文件内容的私密性,需要对Excel文件进行加密,保护文件以免给第三方看到,本文将以Python语言为例,和大家讲讲如何对Excel文件进行加密,感兴... 目录前言方法一:使用pywin32库(仅限Windows)方法二:使用msoffcrypto-too

Java Spring 中 @PostConstruct 注解使用原理及常见场景

《JavaSpring中@PostConstruct注解使用原理及常见场景》在JavaSpring中,@PostConstruct注解是一个非常实用的功能,它允许开发者在Spring容器完全初... 目录一、@PostConstruct 注解概述二、@PostConstruct 注解的基本使用2.1 基本代

C#使用StackExchange.Redis实现分布式锁的两种方式介绍

《C#使用StackExchange.Redis实现分布式锁的两种方式介绍》分布式锁在集群的架构中发挥着重要的作用,:本文主要介绍C#使用StackExchange.Redis实现分布式锁的... 目录自定义分布式锁获取锁释放锁自动续期StackExchange.Redis分布式锁获取锁释放锁自动续期分布式

springboot使用Scheduling实现动态增删启停定时任务教程

《springboot使用Scheduling实现动态增删启停定时任务教程》:本文主要介绍springboot使用Scheduling实现动态增删启停定时任务教程,具有很好的参考价值,希望对大家有... 目录1、配置定时任务需要的线程池2、创建ScheduledFuture的包装类3、注册定时任务,增加、删

SpringBoot整合mybatisPlus实现批量插入并获取ID详解

《SpringBoot整合mybatisPlus实现批量插入并获取ID详解》这篇文章主要为大家详细介绍了SpringBoot如何整合mybatisPlus实现批量插入并获取ID,文中的示例代码讲解详细... 目录【1】saveBATch(一万条数据总耗时:2478ms)【2】集合方式foreach(一万条数

使用Python实现矢量路径的压缩、解压与可视化

《使用Python实现矢量路径的压缩、解压与可视化》在图形设计和Web开发中,矢量路径数据的高效存储与传输至关重要,本文将通过一个Python示例,展示如何将复杂的矢量路径命令序列压缩为JSON格式,... 目录引言核心功能概述1. 路径命令解析2. 路径数据压缩3. 路径数据解压4. 可视化代码实现详解1

PyQt6/PySide6中QTableView类的实现

《PyQt6/PySide6中QTableView类的实现》本文主要介绍了PyQt6/PySide6中QTableView类的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学... 目录1. 基本概念2. 创建 QTableView 实例3. QTableView 的常用属性和方法

Pandas透视表(Pivot Table)的具体使用

《Pandas透视表(PivotTable)的具体使用》透视表用于在数据分析和处理过程中进行数据重塑和汇总,本文就来介绍一下Pandas透视表(PivotTable)的具体使用,感兴趣的可以了解一下... 目录前言什么是透视表?使用步骤1. 引入必要的库2. 读取数据3. 创建透视表4. 查看透视表总结前言

PyQt6/PySide6中QTreeView类的实现

《PyQt6/PySide6中QTreeView类的实现》QTreeView是PyQt6或PySide6库中用于显示分层数据的控件,本文主要介绍了PyQt6/PySide6中QTreeView类的实现... 目录1. 基本概念2. 创建 QTreeView 实例3. QTreeView 的常用属性和方法属性