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

相关文章

中文分词jieba库的使用与实景应用(一)

知识星球:https://articles.zsxq.com/id_fxvgc803qmr2.html 目录 一.定义: 精确模式(默认模式): 全模式: 搜索引擎模式: paddle 模式(基于深度学习的分词模式): 二 自定义词典 三.文本解析   调整词出现的频率 四. 关键词提取 A. 基于TF-IDF算法的关键词提取 B. 基于TextRank算法的关键词提取

使用SecondaryNameNode恢复NameNode的数据

1)需求: NameNode进程挂了并且存储的数据也丢失了,如何恢复NameNode 此种方式恢复的数据可能存在小部分数据的丢失。 2)故障模拟 (1)kill -9 NameNode进程 [lytfly@hadoop102 current]$ kill -9 19886 (2)删除NameNode存储的数据(/opt/module/hadoop-3.1.4/data/tmp/dfs/na

Hadoop数据压缩使用介绍

一、压缩原则 (1)运算密集型的Job,少用压缩 (2)IO密集型的Job,多用压缩 二、压缩算法比较 三、压缩位置选择 四、压缩参数配置 1)为了支持多种压缩/解压缩算法,Hadoop引入了编码/解码器 2)要在Hadoop中启用压缩,可以配置如下参数

Makefile简明使用教程

文章目录 规则makefile文件的基本语法:加在命令前的特殊符号:.PHONY伪目标: Makefilev1 直观写法v2 加上中间过程v3 伪目标v4 变量 make 选项-f-n-C Make 是一种流行的构建工具,常用于将源代码转换成可执行文件或者其他形式的输出文件(如库文件、文档等)。Make 可以自动化地执行编译、链接等一系列操作。 规则 makefile文件

hdu1043(八数码问题,广搜 + hash(实现状态压缩) )

利用康拓展开将一个排列映射成一个自然数,然后就变成了普通的广搜题。 #include<iostream>#include<algorithm>#include<string>#include<stack>#include<queue>#include<map>#include<stdio.h>#include<stdlib.h>#include<ctype.h>#inclu

使用opencv优化图片(画面变清晰)

文章目录 需求影响照片清晰度的因素 实现降噪测试代码 锐化空间锐化Unsharp Masking频率域锐化对比测试 对比度增强常用算法对比测试 需求 对图像进行优化,使其看起来更清晰,同时保持尺寸不变,通常涉及到图像处理技术如锐化、降噪、对比度增强等 影响照片清晰度的因素 影响照片清晰度的因素有很多,主要可以从以下几个方面来分析 1. 拍摄设备 相机传感器:相机传

【C++】_list常用方法解析及模拟实现

相信自己的力量,只要对自己始终保持信心,尽自己最大努力去完成任何事,就算事情最终结果是失败了,努力了也不留遗憾。💓💓💓 目录   ✨说在前面 🍋知识点一:什么是list? •🌰1.list的定义 •🌰2.list的基本特性 •🌰3.常用接口介绍 🍋知识点二:list常用接口 •🌰1.默认成员函数 🔥构造函数(⭐) 🔥析构函数 •🌰2.list对象

【Prometheus】PromQL向量匹配实现不同标签的向量数据进行运算

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Python全栈,前后端开发,小程序开发,人工智能,js逆向,App逆向,网络系统安全,数据分析,Django,fastapi

让树莓派智能语音助手实现定时提醒功能

最初的时候是想直接在rasa 的chatbot上实现,因为rasa本身是带有remindschedule模块的。不过经过一番折腾后,忽然发现,chatbot上实现的定时,语音助手不一定会有响应。因为,我目前语音助手的代码设置了长时间无应答会结束对话,这样一来,chatbot定时提醒的触发就不会被语音助手获悉。那怎么让语音助手也具有定时提醒功能呢? 我最后选择的方法是用threading.Time

Android实现任意版本设置默认的锁屏壁纸和桌面壁纸(两张壁纸可不一致)

客户有些需求需要设置默认壁纸和锁屏壁纸  在默认情况下 这两个壁纸是相同的  如果需要默认的锁屏壁纸和桌面壁纸不一样 需要额外修改 Android13实现 替换默认桌面壁纸: 将图片文件替换frameworks/base/core/res/res/drawable-nodpi/default_wallpaper.*  (注意不能是bmp格式) 替换默认锁屏壁纸: 将图片资源放入vendo