PKI - 借助Nginx实现_客户端使用CA根证书签发客户端证书

2024-02-12 08:04

本文主要是介绍PKI - 借助Nginx实现_客户端使用CA根证书签发客户端证书,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • Pre
  • 概述
  • 步骤
    • 1. 创建根证书
    • 2. 生成客户端证书
    • 3. 准备客户端证书扩展文件
    • 4. 签发客户端证书
    • 5. 配置Nginx
    • 5. 重启 Nginx
    • 6. 测试
  • SAN 证书扩展
    • 案例:使用IP访问

在这里插入图片描述


Pre

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

PKI - 数字签名与数字证书

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

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


概述

步骤

1. 创建根证书

openssl genrsa -out client-ca.key 2048
openssl req -x509 -new -nodes -key client-ca.key -subj "/CN=client-ca" -days 5000 -out client-ca.crt

这两个命令用于创建自签名的根证书(CA 根证书):

  1. openssl genrsa -out client-ca.key 2048

    • 这个命令生成了一个 2048 位长度的 RSA 私钥,并将其保存到 client-ca.key 文件中。这个私钥将用于后续创建自签名的根证书。
  2. openssl req -x509 -new -nodes -key client-ca.key -subj "/CN=client-ca" -days 5000 -out client-ca.crt

    • 这个命令使用上一步生成的私钥 (client-ca.key) 来生成一个自签名的根证书。具体地,它执行了以下操作:
      • -x509:生成一个自签名的 X.509 格式证书。
      • -new:创建一个新的证书请求。
      • -nodes:不使用密码加密密钥。
      • -key client-ca.key:指定之前生成的私钥文件作为证书的密钥。
      • -subj "/CN=client-ca":指定证书的主题信息。在这里,/CN=client-ca 表示证书的通用名称 (Common Name) 为 client-ca
      • -days 5000:指定证书的有效期为 5000 天。
      • -out client-ca.crt:将生成的自签名根证书保存到 client-ca.crt 文件中。

通过执行这两个命令,您可以生成一个自签名的根证书,用于签发其他证书,如服务器证书、客户端证书等。


2. 生成客户端证书

openssl genrsa -out client.key 2048
openssl req -new -key client.key -subj "/CN=client" -out client.csr

这两个命令用于生成客户端证书的私钥和证书签名请求 (CSR):

  1. openssl genrsa -out client.key 2048

    • 这个命令生成了一个 2048 位长度的 RSA 私钥,并将其保存到 client.key 文件中。这个私钥将用于后续创建客户端证书。
  2. openssl req -new -key client.key -subj "/CN=client" -out client.csr

    • 这个命令创建了一个新的证书签名请求 (CSR),用于请求签发客户端证书。具体地,它执行了以下操作:
      • -new:创建一个新的证书请求。
      • -key client.key:指定之前生成的私钥文件作为证书的密钥。
      • -subj "/CN=client":指定了证书的主题信息。在这里,/CN=client 表示证书的通用名称 (Common Name) 为 client
      • -out client.csr:将生成的证书签名请求保存到 client.csr 文件中。

通过执行这两个命令,可以生成客户端证书所需的私钥和证书签名请求。然后,可以将证书签名请求发送给证书颁发机构 (CA) 进行签发客户端证书,或者使用自己的 CA 根证书签发客户端证书。


3. 准备客户端证书扩展文件

创建一个名为 client.ext 的文件,并将 extendedKeyUsage = clientAuth 写入其中,以指定客户端证书的扩展属性。

cat > client.ext << EOF
extendedKeyUsage = clientAuth
EOF

这个命令将创建一个名为 client.ext 的文件,并将 extendedKeyUsage = clientAuth 写入其中。请注意,<< 操作符用于将多行文本输入到文件中,EOF 是结束符,指示输入结束。

执行这个命令后,您就创建了 client.ext 文件,并指定了客户端证书的扩展属性。可以在后续的签发客户端证书的步骤中使用这个文件。


4. 签发客户端证书

openssl x509 -req -in client.csr -CA client-ca.crt -CAkey client-ca.key -CAcreateserial -extfile client.ext -out client.crt -days 5000

这个命令用于签发客户端证书,将客户端证书的 CSR (证书签名请求) 使用您的自签名根证书 (client-ca.crt) 进行签名,生成客户端证书 (client.crt)。

具体地,这个命令执行了以下操作:

  • -req -in client.csr:指定要签名的证书签名请求 (CSR) 文件为 client.csr
  • -CA client-ca.crt -CAkey client-ca.key:指定您的自签名根证书 (client-ca.crt) 和相应的私钥文件 (client-ca.key) 用于签名客户端证书。
  • -CAcreateserial:生成一个序列号文件,用于跟踪已经签发的证书。
  • -extfile client.ext:指定了客户端证书的扩展属性文件为 client.ext。在这里,我们使用之前创建的 client.ext 文件,其中包含了客户端证书的扩展属性。
  • -out client.crt:指定签发后的客户端证书保存的文件为 client.crt
  • -days 5000:指定客户端证书的有效期为 5000 天。

通过执行这个命令,将会生成一个由您的自签名根证书签发的客户端证书,该证书具有在 client.ext 文件中定义的扩展属性,并且有效期为 5000 天。

可以将生成的客户端证书 (client.crt) 分发给客户端,并在服务器端使用它来进行客户端证书验证。

在这里插入图片描述


5. 配置Nginx

在这里插入图片描述
使用根证书


5. 重启 Nginx

systemctl restart nginx

6. 测试

curl https://artisan.com --cert /cert/client.crt --key /cert/client.key --cacert /cert/ca.crt --resolve artisan.com:443:192.168.3.103

OK


SAN 证书扩展

在 SSL/TLS 证书中,服务器实体名称通常由 Subject 字段中的 Common Name (CN) 或 Subject Alternative Name (SAN) 字段指定。

  1. Common Name (CN):

    • Common Name (CN) 是 SSL/TLS 证书中 Subject 字段的一部分,用于指定证书的持有者。在传统的 SSL/TLS 证书中,CN 通常用于指定服务器的域名。例如,对于网站 example.com,其证书的 CN 可能为 CN=example.com
  2. Subject Alternative Name (SAN):

    • Subject Alternative Name (SAN) 是 SSL/TLS 证书中的一个扩展字段,用于指定证书的额外主体名称。SAN 可以包含多个条目,每个条目都可以是一个域名、IP 地址、电子邮件地址等。SAN 的出现是为了解决单个 CN 无法满足多域名证书的需求。现代的 SSL/TLS 证书中通常使用 SAN 来指定主要的服务器域名以及可能的其他域名。

在证书验证过程中,客户端会检查服务器证书的 SAN 来验证证书中包含的域名是否与正在访问的域名匹配。如果证书中包含了 SAN 扩展,通常会优先使用 SAN 中的域名进行验证,而不是 CN 中的域名。

总而言之,虽然过去使用 CN 来验证证书中的域名是常见的做法,但随着 SAN 的出现和广泛应用,现代的 SSL/TLS 证书验证通常优先考虑 SAN 中的域名。 SAN 提供了更灵活和可扩展的方法来指定证书中的主体名称。


SAN(Subject Alternative Name)是一种 X.509 证书的扩展,它允许您将一个证书绑定到多个主机名。使用 SAN 扩展,可以在同一个证书中包含多个主机名,这样可以简化证书管理,并提供更灵活的配置选项。SAN 证书可以为一个证书提供多个域名的支持,而不需要为每个域名创建一个单独的证书。

在创建 SAN 证书时,您可以在证书签名请求 (CSR) 中指定要包含的主机名,或者在签发证书时使用配置文件指定。以下是创建 SAN 证书的一般步骤:

  1. 创建配置文件(可选):

    • 您可以创建一个包含 SAN 扩展配置的文件。例如,创建一个名为 san.ext 的文件,并在其中指定要包含的主机名:
      subjectAltName = @alt_names
      [alt_names]
      DNS.1 = example.com
      DNS.2 = www.example.com
      DNS.3 = subdomain.example.com
      
  2. 生成证书签名请求 (CSR):

    • 在生成 CSR 时,您可以将 SAN 扩展属性包含在请求中。例如:
      openssl req -new -key keyfile.key -out csrfile.csr -subj "/CN=example.com" -config san.ext
      
  3. 签发证书:

    • 使用您的 CA 根证书签发证书时,确保包含 SAN 扩展。如果使用配置文件创建了 CSR,确保在签发证书时指定相同的配置文件。例如:
      openssl x509 -req -in csrfile.csr -CA cacert.crt -CAkey cakey.key -CAcreateserial -out certfile.crt -days 365 -extensions v3_req -extfile san.ext
      

通过这些步骤,可以创建一个包含多个主机名的 SAN 证书。这对于为同一个服务器提供多个域名的支持或将证书用于多个服务器都非常有用。


案例:使用IP访问

在这里插入图片描述
不行…

那怎么办呢?

在这里插入图片描述

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

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



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

相关文章

使用Python实现IP地址和端口状态检测与监控

《使用Python实现IP地址和端口状态检测与监控》在网络运维和服务器管理中,IP地址和端口的可用性监控是保障业务连续性的基础需求,本文将带你用Python从零打造一个高可用IP监控系统,感兴趣的小伙... 目录概述:为什么需要IP监控系统使用步骤说明1. 环境准备2. 系统部署3. 核心功能配置系统效果展

Python实现微信自动锁定工具

《Python实现微信自动锁定工具》在数字化办公时代,微信已成为职场沟通的重要工具,但临时离开时忘记锁屏可能导致敏感信息泄露,下面我们就来看看如何使用Python打造一个微信自动锁定工具吧... 目录引言:当微信隐私遇到自动化守护效果展示核心功能全景图技术亮点深度解析1. 无操作检测引擎2. 微信路径智能获

使用Java将各种数据写入Excel表格的操作示例

《使用Java将各种数据写入Excel表格的操作示例》在数据处理与管理领域,Excel凭借其强大的功能和广泛的应用,成为了数据存储与展示的重要工具,在Java开发过程中,常常需要将不同类型的数据,本文... 目录前言安装免费Java库1. 写入文本、或数值到 Excel单元格2. 写入数组到 Excel表格

redis中使用lua脚本的原理与基本使用详解

《redis中使用lua脚本的原理与基本使用详解》在Redis中使用Lua脚本可以实现原子性操作、减少网络开销以及提高执行效率,下面小编就来和大家详细介绍一下在redis中使用lua脚本的原理... 目录Redis 执行 Lua 脚本的原理基本使用方法使用EVAL命令执行 Lua 脚本使用EVALSHA命令

Python中pywin32 常用窗口操作的实现

《Python中pywin32常用窗口操作的实现》本文主要介绍了Python中pywin32常用窗口操作的实现,pywin32主要的作用是供Python开发者快速调用WindowsAPI的一个... 目录获取窗口句柄获取最前端窗口句柄获取指定坐标处的窗口根据窗口的完整标题匹配获取句柄根据窗口的类别匹配获取句

Java 中的 @SneakyThrows 注解使用方法(简化异常处理的利与弊)

《Java中的@SneakyThrows注解使用方法(简化异常处理的利与弊)》为了简化异常处理,Lombok提供了一个强大的注解@SneakyThrows,本文将详细介绍@SneakyThro... 目录1. @SneakyThrows 简介 1.1 什么是 Lombok?2. @SneakyThrows

在 Spring Boot 中实现异常处理最佳实践

《在SpringBoot中实现异常处理最佳实践》本文介绍如何在SpringBoot中实现异常处理,涵盖核心概念、实现方法、与先前查询的集成、性能分析、常见问题和最佳实践,感兴趣的朋友一起看看吧... 目录一、Spring Boot 异常处理的背景与核心概念1.1 为什么需要异常处理?1.2 Spring B

Python位移操作和位运算的实现示例

《Python位移操作和位运算的实现示例》本文主要介绍了Python位移操作和位运算的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 目录1. 位移操作1.1 左移操作 (<<)1.2 右移操作 (>>)注意事项:2. 位运算2.1

如何在 Spring Boot 中实现 FreeMarker 模板

《如何在SpringBoot中实现FreeMarker模板》FreeMarker是一种功能强大、轻量级的模板引擎,用于在Java应用中生成动态文本输出(如HTML、XML、邮件内容等),本文... 目录什么是 FreeMarker 模板?在 Spring Boot 中实现 FreeMarker 模板1. 环

Qt实现网络数据解析的方法总结

《Qt实现网络数据解析的方法总结》在Qt中解析网络数据通常涉及接收原始字节流,并将其转换为有意义的应用层数据,这篇文章为大家介绍了详细步骤和示例,感兴趣的小伙伴可以了解下... 目录1. 网络数据接收2. 缓冲区管理(处理粘包/拆包)3. 常见数据格式解析3.1 jsON解析3.2 XML解析3.3 自定义