教程:利用XCA创建一个自签名CA证书并签发一个对应的时间戳服务证书
Use XCA to Create a CA Certificate and Issue a Timestamp Certificate
前言
购买一个代码签名证书非常昂贵,而在Windows平台上,驱动签名需要EV代码签名证书才能进行WHQL认证,EV代码签名证书一年就需要几千块:
作为个人开发者或者测试驱动需求,购买权威机构的EV代码签名证书是非常不划算的,同时需要公司认证,时间流程都非常麻烦。
微软于2019年7月暂停了EV交叉驱动签名证书CA的签发,意味着这之后不能直接使用EV代码签名,需要WHQL认证,但在这之前签发的证书可以直接签署驱动完成认证。网上有一些泄露的EV代码签名证书,可以利用《自建时间戳服务实现伪签驱动证书》的时间戳功能完成伪造签名,让签名时间戳在泄露证书有效期内,实现驱动签名和认证。
本教程主要是解决自建时间戳服务所需要的TSA证书签发问题,写一篇教程记录自制CA证书和TSA证书的教程和坑。
XCA下载
本教程使用XCA进行演示,XCA下载地址:
推荐使用修改版本,修改版本新增了:
- 部分OIDs,包括SSH、MS等用途
- 添加了主体的DN字段和扩展用法
- 推荐使用修改版本:XCA-Pika.zip
- 开源原始版本下载:XCA-Release
您还可以根据OpenSSL进行签发CA证书,本教程暂不提供方法。
XCA教程
XCA数据库
XCA是基于Access数据库进行存储的,因此第一件事是建立一个数据库:
需要设置一个强度足够的密码(特别是你会把数据库备份到网盘或者别的地方的情况下)
下次使用的时候,你已经有数据库了,可以直接打开
XCA设置
初次使用,需要进行一些设置,左上角点开选项:
修改如下设置:
- 默认哈希算法建议
SHA256
,P12加密建议AES256
- 字符串类型必须是UTF8(如果证书内容有中文,否则乱码)
- 安全令牌哈希算法建议勾选
仅支持的算法
- 序列号长度建议增加到96Bit(符合X.509 V3规范)
证书创建
本节介绍XCA基本功能,并创建CA和
XCA私钥
在这个界面,你可以管理你的私钥
私钥的长度和算法很重要,我测试了各种操作系统的兼容性
系统/浏览器 RSA SM2 SECP SECT Prime BrainPool ED25519 Windows 8以上 1024~8192 × √ √ √ √ √ Windows 7/XP 512~4096 × × × × × × Android 5以上 1024~8192 × √ √ √ √ ? iOS / MacOS 1024~8192 × √ × √ √ × Chrome/FireFox 1024~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
再创建一个终端证书密钥:RSA 2048
XCA模板
证书模板是快捷创建证书的工具,推荐使用模板创建。
建议CA和最终证书各创建一个模板使用,下面合二为一介绍:
主体信息
主体信息是证书最关键的部分。识别一个证书,只根据证书私钥HASH和主体HASH判断。
因此,如果信任链接一旦建立,证书的主体信息和密钥不能轻易改变(重新签发也不能变),否则需要重新信任该证书和签发的所有子证书。
拓展信息
拓展信息重新签发证书可以改变,但是建议一次性设置好:
证书别名
在 X.509 格式的证书中,一般使用 Issuer 项标记证书的颁发者信息,该项必须是一个非空的 Distinguished Name 名称。
除此之外还可以使用扩展项 issuerAltName 来标记颁发者的其他名称,这是一个非关键的扩展项。
对于证书持有者,一般使用 Subject 项标记,并使用 subjectAltName 扩展项提供更详细的持有者身份信息。
subjectAltName 全称为 Subject Alternative Name,缩写为 SAN。它可以包括一个或者多个的电子邮件地址,域名,IP地址和 URI 等。
证书别名,证书的其他名字,可以不填
如果是SSL证书,需要在里面添加域名
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设置方法
- 首先你需要一个Github或者Gitee的Pages项目:
2.然后你会获得一个URL,例如:
https://username.github.io/project/
假如CRL文件名叫CA.crl
(后面步骤会生成)
那么把这个文件传到项目根目录,url就是:
https://username.github.io/project/CA.crl
3.填入拓展信息的CRL字段中:
授权信息
什么是授权信息访问?
授权信息访问(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”一项
NetScape
NetScape现在用的人很少了,可以不填内容:
高级信息
暂不提供相关信息,可以不填
证书策略
暂不提供相关信息,可以不填
创建证书
需要分别创建CA和时间戳服务
1.设置证书来源和摘要算法
2.设置主体信息,选择密钥
3.设置日期和属性(重要)
4.修改拓展信息等内容
5.检查证书,并生成
签出CRL
选中CA证书,右键-CA-生成CRL
根据需要选择时间,其他参数可以不动
CRL编号不能每次都一样,每次+1
导出证书
导出CER文件
导出吊销列表
导出私钥文件
上传文件
1、CER和CRL到你的GitHub或者Gitee项目上
2、让你的项目开源,并开启Pages功能
注:不要傻乎乎的把私钥Key上传了,不然就白建了
7 comments
大佬你好,请问这个要怎样才能给(*.sys)驱动文件签名?看了好久您的文章,自己实际操作却弄不来
您好,麻烦看这里https://code.52pika.cn/index.php/archives/277/,如果不会可以留下问题和联系方式
Can you make a tutorial video? Thank you.
So I’m wonder what can we do when successfully created our certificate? Can we use this to sign our application? Drivers, etc? Please clarify thank you.
This tutorial is mainly aimed at issuing timestamp services, which can be used to exploit leaked EV drivers, certificate signing drivers, for specific reference https://code.52pika.cn/index.php/archives/277/
(According to Microsoft policy, driver signatures require the leakage of EV certificates or WHQL. Self signed signatures cannot be directly utilized, but can be used for pseudo signing according to the above tutorial)
In addition, the certificate created in this tutorial can be used for application code signing. Simply set the code signing in the "Key Extension Purpose" section. Of course, you need to trust your CA certificate on your system and set up an appropriate trust chain (CRL or OCSP)
Here is a video that explains how to create it in detail. If you need a time -stamp server certificate, you only need to set the key usage of the second certificate to "digital signature", and set the expansion key usage to "timestamp stamp "Just, the other content is the same (of course, you still need to set CRL or OCSP)
https://www.youtube.com/watch?v=1ZJ2DKL_5Cg
Fine, when I am free, I will do that. Thanks for your advise.