NET8部署Kestrel服务HTTPS深入解读TLS协议之Certificate证书

Certificate证书

Certificate称为数字证书。数字证书是一种证明身份的电子凭证,它包含一个公钥和一些身份信息,用于验证数字签名和加密通信。数字证书在网络通信、电子签名、认证授权等场景中都有广泛应用。其特征如下:

  • 由权威机构颁发,人们可以在互联网上用来识别对方的身份。
  • 证书遵循国际标准 ITUTX.509,主要包括下面的内容:
    • 版本信息
    • 序列号,每个证书都有唯一的序列号
    • 使用的签名算法
    • 签发机构(命名规则一般采用 X.500格式)
    • 有效期
    • 证书所有人的名称
    • 证书所有人的公钥 public key
    • 证书发行者的签名

证书等级

  • Root Cartificate:根证书

根证书:签名(Root CA's signature)是用根私钥(Root CA's private key)签的。所以验证根证书签名(Root CA's signature)要用根公钥(Root CA's public key)才能验证通过。这种情况称为自签名(self-sign)。

  • Intermediate Cartificate:中间证书

中介证书是被根证书签名的证书,是被根证书的私钥进行签名的,因此要验证中介证书也需要使用根公钥。

  • End-entity Certificate:终端实体证书

终端实体证书是有中介证书签发的;使用中介证书对终端实体进行认证的目的是为了减少根证书签名的负担,相当于使用一个中介来代替根实行认证的权利。

证书链

在RFC5280中,证书链或信任链被定义为“证书路径”。换句话说,信任链是指您的SSL证书以及它如何链接回受信任的证书颁发机构。为了使SSL证书可信,它必须可以追溯到它被签署的信任根,这意味着链中的所有证书——终端实体证书、中间证书和根证书,都需要得到适当的信任。信任链分为三个部分:

Windows证书管理

通过Win+R运行:mmc确定,文件->添加/删除管理单元,进行配置证书管理。

证书工具

证书的管理工具有很多,下面列举几种常用的工具:

  • PowerShell CLI:New-SelfSignedCertificate
  • CMD CLI:Certutil
  • X Certificate and Key management
  • CMD CLI:OpenSSL
  • JDK CTL:keytool

New-SelfSignedCertificate

在Windows中,通过PowerShell CLI:New-SelfSignedCertificate进行创建自定义签名证书。说实话,笔者翻烂了官方文档对该工具使用介绍挺粗糙的,一堆的坑准备好踩吧。

1、创建X509证书链

# PowerShell环境(以管理员身份运行)# 默认存储位置:cert:LocalMachine\My【本地计算机\个人】
#准备条件
$pfxPassword = ConvertTo-SecureString -String "[pfx加密]" -Force -AsPlainText
$pfxFilePath = "[pfx文件路径]"
$cerFilePath = "[cer文件路径]"# 语法结构
New-SelfSignedCertificate `
-Subject [颁发给] `
-DnsName [使用者可选名称(Web域名)] `
-NotAfter (Get-Date).AddYears(20) `
-CertStoreLocation "cert:LocalMachine\My" `
-FriendlyName "[友好名称]" `
-HashAlgorithm SHA256 `
-KeyUsageProperty All `
-KeyUsage CertSign, CRLSign, DigitalSignature
-TextExtension @("2.5.29.19={text}CA=1&pathlength=1")# 可缺省-Subject参数时,生成证书时默认取DnsName信息为[颁发给]者。
# 可缺省 -KeyAlgorithm和-KeyLength参数时,默认为RSA 2048。
# 可缺省 -NotBefore参数时,默认为从系统当前时间起始。
# 可缺省 -NotAfter参数时,生成证书时默认有效期为1年。
# 可缺省-FriendlyName参数时,生成证书时[友好名称]为空。
# 可缺省 -HashAlgorithm参数时,默认值SHA256。
# 可缺省 -KeyUsageProperty参数,指定私钥的键用法属性的键用法。默认值None。(使用底层KSP的默认值)# 必须 -KeyUsage参数[密钥用法],指定在证书的密钥使用扩展名中设置的密钥用法。可接受的参数项:
# CertSign:证书签名
# CRLSign:CRL签名
# DataEncipherment:数据加密
# DecipherOnly
# DigitalSignature:数字签名
# EncipherOnly
# KeyAgreement
# KeyEncipherment:钥匙加密
# None:缺省时无
# NonRepudiation# 必须 -TextExtension参数[目的用途],指定证书扩展数组为字符串,每个字符串必须采用OID对象标识符。
# 所有颁发的策略 (2.5.29.32.0)
# 客户端身份验证 (1.3.6.1.5.5.7.3.2)
# 服务器身份验证 (1.3.6.1.5.5.7.3.1)
# BitLocker驱动器加密 (1.3.6.1.4.1.311.67.1.1)
# 加密文档系统 (1.3.6.1.4.1.311.10.3.4)
# 文档签名 (1.3.6.1.4.1.311.10.3.12)
# 安全电子邮件 (1.3.6.1.5.5.7.3.4)
# 语法: TextExtension @(2.5.29.37={text}{oid},{oid})
# Example: TextExtension @("2.5.29.37={text}1.3.6.1.5.5.7.3.1")
(1) Root根证书

根证书完全不需要-Subject [颁发给]和-DnsName [使用者可选名称(Web域名)],只需要起个友好名称做为颁发者,示例如下:

# Root certificate generationNew-SelfSignedCertificate `
-Subject "Kingser RSA Root Certificate Authority 2022" `
-NotAfter (Get-Date).AddYears(30) `
-CertStoreLocation "cert:LocalMachine\My" `
-FriendlyName "Kingser RSA Root Certificate Authority 2022" `
-KeyUsageProperty All `
-KeyUsage CertSign, CRLSign, DigitalSignature `
-TextExtension @("2.5.29.19={text}CA=1&pathlength=1")# Gets certificate generation the path
$certificatePath = ( Get-ChildItem -Path cert:\LocalMachine\My\"[指纹码]" )# create temporary certificate path
$tmpPath = "E:\Certificate"
If(!(test-path $tmpPath))
{
New-Item -ItemType Directory -Force -Path $tmpPath
}# set certificate password here
$pfxPassword = ConvertTo-SecureString -String "[pfx加密]" -Force -AsPlainText
$pfxFilePath = "E:\Certificate\rootCert.pfx"
$cerFilePath = "E:\Certificate\rootCert.cer"

具体实操如下 

 这里有几个坑,需要特别说明一下:

a. # Root certificate generation部分

由于证书生成时,一般默认会指定存放在:cert:LocalMachine\My或cert:CurrentUser\My处。

当执行成功时,系统自动会产生证书的Thumbprint指纹码(如上图)。同时,系统在My和CA两处都会产生该证书,也就是个人证书和中间证书两处入口。不过经检查发现,它指向的仍是同一证书(指纹码相同),但唯独Root根证书不会产生,这是什么原因呢?

经笔者反复测试后,在My和CA两处入口时,它的下级证书创建时才能成功,不然会提示找不到父级证书,导致失败:

 换句话说,-Signer参数似乎只能参照My或CA处的证书,Root受信任区的不能直接拿来生成证书链的子证书。此处微软文档翻烂了笔者都没找到相关资料,巨坑。

b. # Gets certificate generation the path部分

$rootCertPath通过Get-ChildItem -Path cert:\LocalMachine\XX的证书对象,当我把证书注册到Root信任区就无法调用,不可用。

那它为啥会在My和CA两处入口都引用该证书呢?其实笔者也没敢说整明白了。只能从经验上判断当生成证书为子证书时,系统逻辑有可能优先判断该证书是哪个入口开始检索。比如中间证书,所参照父级证书位置当优先从C入口开始检查是否有,没有的话再检索My入口处。不一定正确仅供参考。

c. # create temporary certificate path部分

导出时,可设定一个临时存储证书路径(可选)。当配置了该存放路径时,导出文件变量可以这样:

$pfxFilePath = $tmpPath +"\rootCert.pfx"
$cerFilePath = $tmpPath +"\rootCert.cer"
(2) CA中间证书

中间证书的生成,关键性参数是-Signer参照父级证书,可以设定DnsName域名:

# Gets certificate generation the path
$parentCertPath =( Get-ChildItem -Path cert:\LocalMachine\My\"[指纹码]")# Intermediate certificate generation
New-SelfSignedCertificate `
-Subject [颁发给] `
-DnsName [域名] `
-Signer $parentCertPath `
-NotAfter (Get-Date).AddYears(20) `
-CertStoreLocation "cert:LocalMachine\My" `
-FriendlyName "[友好名称]" `
-KeyUsageProperty All `
-KeyUsage CertSign, CRLSign, DigitalSignature `
-TextExtension @("2.5.29.19={text}CA=1&pathlength=1")# set certificate password here
$intermediateCer =( Get-ChildItem -Path cert:\LocalMachine\My\"[指纹码]")
$pfxFilePath = "E:\Certificate\intermediateCert.pfx"
$cerFilePath = "E:\Certificate\intermediateCert.cer"# Export PfxCertificate the file
$intermediateCer | Export-PfxCertificate -FilePath $pfxFilePath -Password $pfxPassword
# Export Certificate the file
$intermediateCer | Export-Certificate -FilePath $cerFilePath

当然需要注意,-NotAfter参数到期时间,肯定是小于根证书年限的。 具体实操如下 

(3) My终端实体证书

终端证书的生成,同样关键性参数是-Signer参照父级证书,设定DnsName域名基本和中间证书相似。唯一不同的则是-TextExtension参数[目的用途]。比如双向验证时,客户端证书则是提交服务器身份验证,服务端提交客户端身份验证则称之为双向。单向验证仅需要客户端提交服务器身份验证就可以。

它还可以用文件存储系统加密验证,驱动程序签名验证以及文档签名验证等。

# Gets certificate generation the path
$intermediateCer =( Get-ChildItem -Path cert:\LocalMachine\My\"[指纹码]")# End-Entity certificate generation
New-SelfSignedCertificate `
-Subject [颁发给] `
-DnsName [二级域名] `
-Signer $intermediateCer `
-NotAfter (Get-Date).AddYears(3) `
-CertStoreLocation "cert:LocalMachine\My" `
-FriendlyName "[友好名称]" `
-KeyUsageProperty All `
-KeyUsage DigitalSignature, KeyEncipherment, DataEncipherment `
-TextExtension @("2.5.29.37={text}1.3.6.1.5.5.7.3.1")# set certificate password here
$clientCer =( Get-ChildItem -Path cert:\LocalMachine\My\"[指纹码]")
$pfxFilePath = "E:\Certificate\clientCert.pfx"
$cerFilePath = "E:\Certificate\clientCert.cer"# Export PfxCertificate the file
$clientCer | Export-PfxCertificate -FilePath $pfxFilePath -Password $pfxPassword
# Export Certificate the file
$clientCer | Export-Certificate -FilePath $cerFilePath

具体实操如下 

 此处,仍可再单独配置[客户端身份验证]证书,以备服务器部署验证来源客户端身份。在此就不展开详述,感兴趣的朋友可自行适应创建。

 2、证书部署及管理

#准备条件
$cerFilePath = "E:\Certificate\rootCert.cer"# 导入Root根证书
Import-Certificate -FilePath $cerFilePath -CertStoreLocation Cert:\LocalMachine\Root
# Cert:\LocalMachine\Root是本地计算机根
# Cert:\CurrentUser\Root是当前用户根# 检查并移除重复引用的证书
# 检查cert:\LocalMachine\My的重复的Root和CA证书,并移除# 先检查出要移除的证书指纹码,然后通过Remove-Item进行移除。Remove-Item 参数-DeleteKey为连同私钥一并移除(慎用)
Get-ChildItem -Path cert:\LocalMachine\My
Remove-Item -Path cert:\LocalMachine\My\[指纹码]# 可以通过检索DnsName值,进行移除
Get-ChildItem -Path cert:\LocalMachine\My -DnsName *xxx* | Remove-Item

 3、Certutil CLI工具

Certutil 是 Windows 操作系统上预装的工具,可用于 校验文件MD5、SHA1、SHA256,下载恶意文件和免杀。它是一个 CLI 程序,可用于转储和显示证书颁发机构(CA),配置信息,证书服务, CA 组件的备份和还原以及验证证书、密钥对和证书链,它作为证书服务的一部分安装。

实际上,Certutil用途非常广泛,它即可以作为渗透测试工具,也可以作为Windows证书管理的运维工具。

Certutil的主要功能包括查看证书、导出证书、导入证书、验证证书链、生成密钥对等。它通常被系统管理员和安全专家用于管理和维护证书、密钥和证书颁发机构(CA)相关的任务。

Certutil命令的设计旨在提供一种灵活而强大的方式来处理数字证书和密钥,以确保系统的安全性和可信度。

可在命令提示符下输入"certutil /?"来查看完整的命令参数列表和使用说明。

具体详解,请见微软官方文档。

# 检查证书存储,列出本地计算机或用户的证书存储中的证书
certutil -v -store my
certutil -v -store -user my# 从文件查看证书详细内容
certUtil -v -dump rootCert.cer

 Certificate and Key management

XCA是一个用于管理非对称密钥(如RSA或DSA)的接口。它被用作创建和签署证书的小型CA。它使用OpenSSL库进行加密操作。

开源地址:GitHub - chris2511/xca: X Certificate and Key management,官方安装包:Download

注意它可以直接通过Microsoft Store微软商店进行安装,也可以手动下载MSI包来使用。

最新版本为xca-2.6.0-win64.msi。

1、新建数据库

新使用该工具时,需要新建一个xdb(XCA Database)数据库用来存储证书信息,需要设置一个数据库密码。

2、X509证书构造

序号属性名属性学名

Windows

表示

XCA

表示

描述说明
1Id序列号--
2country Name国家代码--
3stateOrProvince Name州或省名--
4locality Name地方名--
5organization Name组织名--
6organizationUnit Name单位名--
7common Name通用名(*)

颁发者

使用者

内部名称
8email Address邮件地址--
9-签名状态UnusedBits
10-私钥(*)HashAlgorithmRSA 2048
11-

有效期

从...到

NotBefore

NotAfter

12-指纹Thumbprint

[待续]

 参考文档

  • 在PowerShell中创建证书
  • 如何:创建开发期间使用的临时证书
  • 关于证书提供程序
  • Certificate 提供程序
  • 网络安全 / SSL,X.509,PEM,DER,CRT,CER,KEY,CSR,P12 作用及区别

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

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

相关文章

跟李沐学AI:池化层

目录 二维最大池化 填充、步幅和多个通道 平均池化层 池化层总结 二维最大池化 返回滑动窗口中的最大值。 图为池化窗口形状为 22 的最大池化层。着色部分是第一个输出元素,以及用于计算这个输出的输入元素: max(0,1,3,4)4。池化层与卷积层类似,不断…

单元测试的最佳实践

整体架构 合适的架构可以提升可测试性。比如菱形对称架构的模块化和解耦特性使得系统各个部分可以独立进行单元测试。这不仅提高了测试的效率,还能够减少测试的依赖性,提高测试准确性。 代码设计 代码设计和可测试性有密切关联。强烈建议一个方法的代码行…

Android 15 适配整理——实践版

背景 谷歌发布Android 15后,国内的手机厂商迅速行动,开始了新系统的适配工作。小米、OPPO、vivo和联想等金标联盟成员联合发布了适配公告,督促APP开发者在2024年8月31日前完成适配工作,否则将面临搜索标签提示、应用降级、分机型…

JavaWeb笔记_JSTL标签库JavaEE三层架构案例

一.JSTL标签库 1.1 JSTL概述 JSTL(jsp standard tag library):JSP标准标签库,它是针对EL表达式一个扩展,通过JSTL标签库与EL表达式结合可以完成更强大的功能 JSTL它是一种标签语言,JSTL不是JSP内置标签 JSTL标签库主要包含: ****核心标签 格式化标签 …

Android平台轻量级RTSP服务模块二次封装版调用说明

技术背景 在前面的blog,我们发布了Android平台轻量级RTSP服务模块的技术对接说明,好多开发者希望,更黑盒的对接轻量级RTSP服务这块,专注于自身业务逻辑。为此,我们针对Android平台轻量级RTSP服务模块,做了…

解析capl文件生成XML Test Module对应的xml工具

之前一直用的CAPL Test Module来写代码,所有的控制都是在MainTest()函数来实现的,但是有一次,代码都写完了,突然需要用xml的这种方式来实现,很突然,之前也没研究过,整理这个xml整的一身汗&#…

vue3前端开发-小兔鲜项目-登录组件的开发表单验证

vue3前端开发-小兔鲜项目-登录组件的开发表单验证&#xff01;现在开始写登录页面的内容。首先这一次完成基础的首页按钮点击跳转&#xff0c;以及初始化一些简单的表单的输入验证。后期还会继续完善内容。 1&#xff1a;首先还是准备好login页面的组件代码内容。 <script …

企业风险管理的智能监控:Kompas.ai如何预警潜在风险

在企业运营中&#xff0c;风险管理是确保业务连续性和稳健发展的关键环节。随着技术的进步&#xff0c;智能风险管理成为预防损失和识别潜在风险的重要手段。Kompas.ai&#xff0c;作为一款先进的智能监控工具&#xff0c;正通过数据分析和模式识别技术&#xff0c;帮助企业实现…

《华为数据之道》读书笔记六---面向自助消费的数据服务建设

七、从结果管理到过程管理&#xff0c; 从能“看”到能“管” 1、数据赋能业务运营 数字化运营旨在利用数字化技术获取、管理和分析数据&#xff0c;从而为企业的战略决策与业务运营提供可量化的、科学的支撑。 数字化运营归根结底是运营&#xff0c;旨在推动运营效率与能力的…

基站光伏直流叠光能效管理方案

安科瑞 华楠 基站现状和趋势 5G基站是专门提供5G网络服务的公用移动通信基站。5G基站主要用于提供5G空口协议功能&#xff0c;支持与用户设备、核心网之间的通信。按照逻辑功能划分&#xff0c;5G基站可分为5G基带单元与5G射频单元&#xff0c;二者之间可通过CPRI或eCPRI接口…

AFSim仿真系统-架构概览

引言 本文档从最终用户的角度描述了AFSIM架构&#xff0c;旨在帮助最终用户深入了解AFSIM的操作概念。 核心架构 AFSIM基于面向对象的C架构&#xff0c;提供了一种可扩展和模块化的架构&#xff0c;使得许多附加功能能够轻松集成。AFSIM允许新的组件模型&#xff08;如传感器、…

vue3.0学习笔记(二)——生命周期与响应式数据(ref,reactive,toRef,toRefs函数)

1. 组合API-setup函数 使用细节&#xff1a; setup 是一个新的组件选项&#xff0c;作为组件中使用组合API的起点。从组件生命周期来看&#xff0c;它的执行在组件实例创建之前vue2.x的beforeCreate执行。这就意味着在setup函数中 this 还不是组件实例&#xff0c;this 此时是…

SpringBoot 实现图形验证码

一、最终结果展示 二、前端代码 2.1 index.html <!DOCTYPE html> <html lang"en"><head><meta charset"utf-8"><title>验证码</title><style>#inputCaptcha {height: 30px;vertical-align: middle;}#verifica…

交易积累-BR

BR指标&#xff0c;全称是“买卖意愿比率”&#xff08;Bull/Bear Ratio&#xff09;&#xff0c;是一个衡量市场买卖力量对比的技术分析工具。BR指标是由中国的技术分析师发展起来的&#xff0c;它通过比较股票或市场在一定时间内的上涨能量与下跌能量来评估市场情绪和潜在的趋…

自动驾驶(八十八)---------通讯之SOMEIP

1. 什么是SOME/IP 服务导向架构&#xff08;SOA&#xff0c;Service-Oriented Architecture&#xff09;是一种设计软件系统的方法&#xff0c;强调通过可重用的服务来实现系统的松散耦合。每个服务是独立的功能单元&#xff0c;可以被不同的应用程序使用。这些服务通过标准化的…

【教程】Node.js+Apache 部署网页全过程(非常详细!)

文章目录 背景0. 前置假设1. 更新系统和安装必要软件2. 打包并上传项目到服务器2.1 识别需要上传的文件2.2 文件归档和压缩2.3 压缩文件上传到服务器2.4 解压文件 3. 配置Node.js应用3.1 启动 PM23.2 确认 PM2 进程 4. 配置Apache反向代理5. 启用必要的Apache模块6. 检查 Apach…

linux如何卸载python3.5

卸载&#xff1a; 1、卸载python3.5 sudo apt-get remove python3.5 2、卸载python3.5及其依赖 sudo apt-get remove --auto-remove python3.5 3、清除python3.5 sudo apt-get purge python3.5 或者 sudo apt-get purge --auto-remove python3.5

AI发展下的伦理挑战:构建未来科技的道德框架

一、引言 随着人工智能&#xff08;AI&#xff09;技术的飞速发展&#xff0c;我们正处在一个前所未有的科技变革时代。AI不仅在医疗、教育、金融、交通等领域展现出巨大的应用潜力&#xff0c;也在日常生活中扮演着越来越重要的角色。然而&#xff0c;这一技术的迅猛进步也带来…

【OpenCV C++20 学习笔记】操作图片

操作图片 概述图片的导入和保存对导入的图片的操作获取像素值Point类型和图片像素 内存管理和引用计数一些简便操作图片可视化更精确的类型转换 概述 在本专栏的第一篇文章中就介绍了一个用OpenCV处理图片的实例&#xff08;《图片处理基础》&#xff09;&#xff0c;这篇文章…

【Linux】信号3——信号的处理

1.信号的处理 我们都说信号被收到了&#xff0c;可能不会里面处理 信号是什么时候被处理的呢&#xff1f; 前提是我们得知道自己收到了信号&#xff0c;进程就得在合适的时候去查自己的pending表和block表&#xff0c;这些属于内核数据结构&#xff0c;进程一定要处于内核态&a…