教程:利用XCA创建一个自签名CA证书并签发一个对应的时间戳服务证书

Use XCA to Create a CA Certificate and Issue a Timestamp Certificate

what-is-a-digital-certificate.svg

前言

购买一个代码签名证书非常昂贵,而在Windows平台上,驱动签名需要EV代码签名证书才能进行WHQL认证,EV代码签名证书一年就需要几千块:

20231020103135.png

作为个人开发者或者测试驱动需求,购买权威机构的EV代码签名证书是非常不划算的,同时需要公司认证,时间流程都非常麻烦。

微软于2019年7月暂停了EV交叉驱动签名证书CA的签发,意味着这之后不能直接使用EV代码签名,需要WHQL认证,但在这之前签发的证书可以直接签署驱动完成认证。网上有一些泄露的EV代码签名证书,可以利用《自建时间戳服务实现伪签驱动证书》的时间戳功能完成伪造签名,让签名时间戳在泄露证书有效期内,实现驱动签名和认证。

本教程主要是解决自建时间戳服务所需要的TSA证书签发问题,写一篇教程记录自制CA证书和TSA证书的教程和坑。

XCA下载

本教程使用XCA进行演示,XCA下载地址:

推荐使用修改版本,修改版本新增了:

  1. 部分OIDs,包括SSH、MS等用途
  2. 添加了主体的DN字段和扩展用法

您还可以根据OpenSSL进行签发CA证书,本教程暂不提供方法。

XCA教程

XCA数据库

XCA是基于Access数据库进行存储的,因此第一件事是建立一个数据库:
20231020105130.png

需要设置一个强度足够的密码(特别是你会把数据库备份到网盘或者别的地方的情况下)
20231020105411.png

下次使用的时候,你已经有数据库了,可以直接打开

XCA设置

初次使用,需要进行一些设置,左上角点开选项:
20231020105708.png

修改如下设置:

  1. 默认哈希算法建议SHA256,P12加密建议AES256
  2. 字符串类型必须是UTF8(如果证书内容有中文,否则乱码)
  3. 安全令牌哈希算法建议勾选仅支持的算法
  4. 序列号长度建议增加到96Bit(符合X.509 V3规范)
    20231020105921.png

证书创建

本节介绍XCA基本功能,并创建CA和

XCA私钥

在这个界面,你可以管理你的私钥

私钥的长度和算法很重要,我测试了各种操作系统的兼容性

系统/浏览器RSASM2SECPSECTPrimeBrainPoolED25519
Windows 8以上1024~8192×
Windows 7/XP512~4096××××××
Android 5以上1024~8192×?
iOS / MacOS1024~8192×××
Chrome/FireFox1024~8192××
密信浏览器1024~8192×××
IE 7或更高512~2048××××××


兼容性详细信息

  • Windows 8以上:

    • RSA:1024~8192,推荐至少2048位RSA
    • EC:SPEC/SECT/Prime/BrainPool所有
    • ED:支持ED25519算法
    • SM2: 不支持,也不支持SM3摘要算法
  • Windows 7/XP:

    • RSA:512~4096,8192不推荐
    • EC:Win7以上支持SPEC256曲线
    • 其他曲线不保证兼容,不建议使用
    • SM2: 不支持,也不支持SM3摘要算法
  • Android/iOS/MacOS

    • RSA:1024~8192,推荐至少2048位RSA
    • EC:SPEC所有长度,其他的兼容性差
    • SM2: 不支持,也不支持SM3摘要算法
  • Chromium内核的浏览器/Edge/FireFox

    • RSA:1024~8192,推荐至少2048位RSA
    • EC:SPEC所有长度,其他的兼容性差
  • IE浏览器

    • RSA:1024~2048,更高的不推荐
    • 其他的不兼容,不建议使用

推荐私钥算法:

  • RSA:4096
  • ECC:Prime-256,Secp-521

我们首先创建一个CA证书的私钥:RSA 4096
20231020110541.png

再创建一个终端证书密钥:RSA 2048
20231020113520.png

XCA模板

证书模板是快捷创建证书的工具,推荐使用模板创建。
建议CA和最终证书各创建一个模板使用,下面合二为一介绍:

主体信息

主体信息是证书最关键的部分。识别一个证书,只根据证书私钥HASH和主体HASH判断
因此,如果信任链接一旦建立,证书的主体信息和密钥不能轻易改变(重新签发也不能变),否则需要重新信任该证书和签发的所有子证书

20231020114541.png

拓展信息

拓展信息重新签发证书可以改变,但是建议一次性设置好:
20231020115451.png

证书别名
在 X.509 格式的证书中,一般使用 Issuer 项标记证书的颁发者信息,该项必须是一个非空的 Distinguished Name 名称。
除此之外还可以使用扩展项 issuerAltName 来标记颁发者的其他名称,这是一个非关键的扩展项。
对于证书持有者,一般使用 Subject 项标记,并使用 subjectAltName 扩展项提供更详细的持有者身份信息。
subjectAltName 全称为 Subject Alternative Name,缩写为 SAN。它可以包括一个或者多个的电子邮件地址,域名,IP地址和 URI 等。

证书别名,证书的其他名字,可以不填
如果是SSL证书,需要在里面添加域名
20231020115931.png

CRL分发
什么是CRL
证书吊销列表(Certificate Revocation List ,简称: CRL) 是 PKI 系统中的一个结构化数据文件,该文件包含了证书颁发机构 (CA) 已经吊销的证书的序列号及其吊销日期。
CRL 文件中还包含证书颁发机构信息、吊销列表失效时间和下一次更新时间,以及采用的签名算法等。
证书吊销列表最短的有效期为一个小时,一般为 1 天,甚至一个月不等,由各个证书颁发机构在设置其证书颁发系统时设置。
注意事项

这里需要注意的是,CRL是签发该证书的CA提供的CRL:

如果一个CA证书签发了一个End Cert,那么:
1、该End Cert的CRL信息应该填写该CA签出的CRL地址。
2、该CA如果是自签名证书,则该CA证书信息的CRL地址也是自己签出的,否则该CA的CRL证书信息的CRL必须是该CA的颁发CA签出的CRL地址。
CRL设置方法
  1. 首先你需要一个Github或者Gitee的Pages项目:
    20231020120446.png
    2.然后你会获得一个URL,例如:
    https://username.github.io/project/
    假如CRL文件名叫CA.crl(后面步骤会生成)
    那么把这个文件传到项目根目录,url就是:
    https://username.github.io/project/CA.crl
    3.填入拓展信息的CRL字段中:
    20231020120136.png
授权信息
什么是授权信息访问?
授权信息访问(Authority Info Access),简称为AIA,意思是证书签发者信息访问网址,用于告诉浏览器这张证书是哪个签发CA签发的,去哪里可以下载签发者证书用于验证用户证书是否真的是这个签发CA签发的,这个信息必须包含在用户证书中,以便浏览器能获得证书签发者的证书来验证用户证书。
没有授权信息访问有什么影响?
如果CA签发的用户证书和签发CA都没有AIA信息,这样即使预置信任了根证书也由于无法往上验证而使得浏览器无法显示为可信证书。有些用户证书中有AIA信息,但是无法访问,这也等于没有AIA信息。这个字段必须有,并且一定要确保AIA网址可访问,而且必须是正确的签发CA证书。这个字段影响了浏览器是否可以正常识别和验证网站部署的SSL证书,非常重要。
注意事项
  • 如果上一步CRL填写了crl文件地址,那么需要在本步骤添加CA证书文件的地址

根据CRL设置方法获得的URL例如:
https://username.github.io/project/
假如CRL文件名叫CA.cer(后面会创建)
那么把这个文件传到项目根目录,url就是:
https://username.github.io/project/CA.cer

请注意:

如果一个CA证书签发了一个End Cert,那么:
1、该End Cert的CA文件应该填写该CA的文件。
2、该CA如果是自签名证书,则该CA证书信息的CA文件也是就是自身证书文件(同样需要挂公网),否则该CA的CA文必须是该CA的颁发CA签出的CA文件。
  • 如果上一步CRL没有crl文件地址,那么需要添加OCSP:
    OCSP搭建步骤很复杂,这里不做推荐
    需要OpenSSL或者ECJBA并建立一个RA机构

密钥用法

特别注意:

  • 如果是CA根证书

    • 左侧密钥用法必须包含“Certificate Sign”和“CRL Sign”
    • 右侧拓展用法必须包含“X509v3 Any Policy”,推荐包含“Any Extend Key Usage”
  • 如果是时间戳证书

    • 左侧密钥用法必须包含“Digital Signature”
    • 右侧的拓展用法只能选择“Time Stamping”一项

    20231020123629.png

NetScape

NetScape现在用的人很少了,可以不填内容:
20231020131245.png

高级信息

暂不提供相关信息,可以不填

证书策略

暂不提供相关信息,可以不填

创建证书

需要分别创建CA和时间戳服务

1.设置证书来源和摘要算法
20231020131637.png
2.设置主体信息,选择密钥
20231020131833.png
3.设置日期和属性(重要)
20231020131926.png
4.修改拓展信息等内容
20231020131943.png
5.检查证书,并生成
20231020131959.png

签出CRL

选中CA证书,右键-CA-生成CRL
20231020140252.png

根据需要选择时间,其他参数可以不动
CRL编号不能每次都一样,每次+1
20231020140351.png

导出证书

导出CER文件

20231020140722.png

导出吊销列表

20231020140754.png

导出私钥文件

20231020141016.png

上传文件

1、CER和CRL到你的GitHub或者Gitee项目上
2、让你的项目开源,并开启Pages功能
注:不要傻乎乎的把私钥Key上传了,不然就白建了

Last modification:October 20, 2023
If you think my article is useful to you, please feel free to appreciate