文章目录
- 引言
- windows上对个人证书的增删查
- 创建证书
- 证书的查找
- 证书的删除
- 证书的安装
- Linux上对个人证书的增删查
- 创建证书
- 证书的安装
- 证书的查看
- 证书的删除
- Linux上对系统证书的增删查
引言
PS: 我之前看过《图解密码技术》,已经对证书这些概念有基本的了解,见:密码学简述。所以本文不会涉及证书相关概念的介绍。本文只干一件事(到鹅城只干一件事),那就是,对windows/linux上个人证书的增删查。
之前在知乎上看到一个问题:为什么以前 12306 页面的 https 会被划红线? - 知乎
本文介绍windows和linux上证书的增删查。以上面问题为引,进行展开说明。
我们先打开购票网站,导出它的证书。可以看到它的证书链如下所示:
因为我的系统信任CECA的证书,所以12306的证书验证通过。
那如何查看当前系统,都信任哪些证书呢?参考如何:使用 MMC 管理单元查看证书 - WCF | Microsoft Learn,我们可以运行certlm.msc
查看本地设备的证书,使用certmgr.msc
查看当前用户的证书。可以看到,CFCA EV ROOT 的自签名证书被系统信任。
在windows下,使用上面图形界面,我们可以对证书进行增删查。
但是,图形界面是不方便嵌入到程序中。命令工具和相关的API,更便于在程序中调用。
下面,我们介绍下windows和linux上,命令行对证书的增删查。
证书增删查的API,我没仔细去搜,按下不表。
windows上对个人证书的增删查
在对证书增删查之前,我们查看下证书的存储位置。查看下,增删查的操作对象,身在何处。
然而,参见证书存储 - Windows drivers | Microsoft Learn,证书被存储在注册表中。我去看了一下,人类无法直接进行读取识别。所以,我们后面验证证书是否被安装或者删除,可以使用引用中的方式查看。
下面我们使用certutil | Microsoft Learn,对证书进行操作。
注:certutil.exe
在win11中自带。没必要去使用firefox - Mozilla NSS certutil binary - Super User,官方没有提供它的win版本,没有系统自带的香。
除了certutil.exe
,还可以通过Certmgr.exe (Certificate Manager Tool) - .NET Framework | Microsoft Learn、 Get-ChildItem (Microsoft.PowerShell.Management) - PowerShell | Microsoft Learn等对证书进行操作。
通常只需要操作当前用户下的个人证书,使用certutil.exe
足矣。
创建证书
对系统上的证书进行增删查,得先有一个证书。建议网上随意打开一个https的站点,用它的证书实验。
而这里,我选择自签名一张证书,闹着玩。可以跳过本节。(不值得花费时间去了解window下创建证书,虽然我这么做了。用openssl很好,windows和linux下相同的参数,一套搞定。但是,openssl在windows还得安装,懒得安装。)
用openssl
创建证书是再合适不过的了。但是windows安装openssl可能有点麻烦,至少我没干过,暂时不使用这个方案。
如果是自己闹着玩,可以使用MakeCert - Win32 apps | Microsoft Learn创建一个证书。而文档中已说明,弃用 Makecert,使用New-SelfSignedCertificate (pki) | Microsoft Learn。可以参考创建自签名公用证书来对应用程序进行身份验证 - Microsoft Entra | Microsoft Learn,创建一个证书。
我习惯的逻辑是,创建一个私钥(可以从私钥中导出公钥)->创建一个证书请求->生成证书。但过程似乎略有不同。我们可以在windows powershell ISE中运行下面脚本,生成私钥和证书。
$certname = "dacao" ## Replace {certificateName}
## 创建一个自签名证书,并将证书存储在当前用户的“个人”的证书存储区中
## -Subject":用于指定证书的名称和其他信息。
## "-KeyExportPolicy":密钥导出策略,指示是否允许通过导出证书来导出私钥。在这里,我们将其设置为“Exportable”,表示允许导出。
##"-KeyExportPolicy":密钥导出策略,指示是否允许通过导出证书来导出私钥。在这里,我们将其设置为“Exportable”,表示允许导出。
## "-KeySpec":密钥规范,指示生成的密钥是用于签名还是加密。在这里,我们将其设置为“Signature”,表示生成的密钥将用于签名操作。
## "-KeyLength":密钥长度,以比特为单位。在这里,我们将其设置为 "2048",表示生成的密钥将为 2048 比特长。
## "-KeyAlgorithm":密钥算法,指示生成的密钥使用的加密算法。在这里,我们将其设置为“RSA”,表示将使用 RSA 算法。
## "-HashAlgorithm":哈希算法,用于生成证书哈希值。在这里,我们将其设置为“SHA256”,该算法生成 256 位哈希值。
$cert = New-SelfSignedCertificate -Subject "CN=$certname" -CertStoreLocation "Cert:\CurrentUser\My" -KeyExportPolicy Exportable -KeySpec Signature -KeyLength 2048 -KeyAlgorithm RSA -HashAlgorithm SHA256
## 导出证书到文件
Export-Certificate -Cert $cert -FilePath "E:\download\$certname.cer" ## Specify your preferred location
## 为证书私钥创建密码,并将其保存在变量中
$mypwd = ConvertTo-SecureString -String "111111" -Force -AsPlainText ## Replace {myPassword}
## 导出私钥
Export-PfxCertificate -Cert $cert -FilePath "E:\download\$certname.pfx" -Password $mypwd ## Specify your preferred location
证书的查找
上面创建了一个自签名证书,并将证书存储在当前用户的“个人”的证书存储区中。下面,在命令行查看证书。
## 列出“受信任的根证书颁发机构”中所有的证书
## certutil -store root # 不全
## certmgr /C /s root # 输出不方便过滤
Get-ChildItem -Path "Cert:\CurrentUser\root"
## 列出当前用户证书
certutil -user -store MY # -user表示访问用户存储而不是计算机存储
Get-ChildItem -Path "Cert:\CurrentUser\my"
证书的删除
通常是不需要删除证书的。因为通常情况下,安装后,也没有什么坏处。
## 查找指定名词的证书的哈希值
Get-ChildItem -Path "Cert:\CurrentUser\My" | Where-Object {$_.Subject -Match "dacao"} | Select-Object Thumbprint
Thumbprint
----------
9330B2C240B1C93432C53FF57DA20000B168C054
## 删除该证书
Remove-Item -Path Cert:\CurrentUser\My\9330B2C240B1C93432C53FF57DA20000B168C054 -DeleteKey
# 列出证书-过滤CN
## certID可以是序列号,sha1值,CN, email等
certutil -delstore My certID
证书的安装
certutil.exe -user -addstore My E:\download\dacao.cer
Linux上对个人证书的增删查
linux需要安装下certutil 。certutil命令是由NSS(Network Security Services)提供的证书数据库工具。
sudo apt install libnss3-tools
windows是微软的操作系统,它可以规定证书的存储位置。Linux虽然有文件系统的规范(Filesystem Hierarchy Standard,FHS),但是对于证书存储位置,似乎不会有强制规定。阅读上面链接中的文档,我们可以知道,证书的数据库文件名为cert9.db
(旧的数据库文件名为cert8.db)。在家目录下查找下:
~ find . -name "cert9.db"
./.mozilla/firefox/dqrmhy2g.default-release/cert9.db
./.pki/nssdb/cert9.db
创建证书
之前不想在windows上安装openssl,所以用了windows自带的cmdlet创建了一个自签名证书。这里,我们使用openssl创建一个证书。
# 创建一个没有密码保护的RSA私钥
openssl genrsa -out private.key 2048
# 创建的key的格式是pem
# rsa -in private.key -inform PEM -text -noout
# 创建一个证书请求
openssl req -new -key private.key -out dacao.csr -subj "/C=CN/ST=shanghai/CN=da1234cao.top"
# 创建证书
openssl x509 -req -in dacao.csr -signkey private.key -out dacao.pem
证书的安装
certutil -A -d sql:$HOME/.pki/nssdb -i dacao.pem -n "dacao_cert" -t "C,u,u"
证书的查看
# 列出所有的证书
# certutil -d dbm:$HOME/.pki/nssdb -L # 列出该目录下cert8.db中的证书
certutil -d sql:$HOME/.pki/nssdb -L # 列出该目录下cert9.db中的证书
certutil -d sql:$HOME/.mozilla/firefox/dqrmhy2g.default-release/ -L
证书的删除
certutil -D -d sql:$HOME/.pki/nssdb -n "dacao_cert"
Linux上对系统证书的增删查
linux系统证书的存储位置,参考:SSL Certificate Location on UNIX/Linux - Server Fault、 SSL Certificate Location on UNIX/Linux – Fixya Cloud
如果需要添加或者删除系统信任的证书,可以参考:Linux下管理CA证书(ca-certificates) | WindomZ`s GitHub Pages
ubuntu系统,总的来说,应该是这样(我没实验过):
第一步:把需要添加/删除的证书,添加到/etc/ssl/certs
,或者从该目录下移除。
第二步:运行sudo update-ca-certificates
,以更新信息(修改/etc/ca-certificates.conf
等)。