上传了个SM2证书手动验证器,强迫症得绑点文字上去,这篇文字只介绍手动验签的部分,关于证书字段、证书链验证等内容可以看以下两篇:
SM2证书解析-证书链验证具体实现【含资源!见页首】
SM2证书链验证(P7B)【含资源!见页首】
所谓手动验签,就是用上级CA证书的公钥,验证下级证书的签名值。逐级向上验证,直至根证书。
1.使用ASN.1查看器打开待验证的证书:将基本证书域的Hex流复制下来作为待验签的原文值。
2.使用ASN.1查看器获取签名值域的TLV字段值
然而,签名值域的长度一般在70byte到74byte之间,除去签名值域开头的内容标记,签名值RS点存储形式为TLV。故需要剥离头部标记和R,S点的TL,才能够从签名值域中获取到RS的值
在获取证书签名值域的时候可以用的偷懒小技巧:已知证书签名值的编码格式为TLV,即:R(TLV), S(TLV)。然而SM2验签模块需要的值只有R和S,那么我们对签名值后32字节进行截取,这32字节的内容即为S。接下来只需要判断S对应的Type和Length即可。我们已知证书签名值的Type为02,签名值长度一般会出现20(16进制20即为10进制32-对应32字节),21(16进制21即为10进制33-对应33字节)两种。因为SM2一个点的坐标长度为32字节,那么当长度为34字节时,其Length前方必然带有00填充。则可把规则写成:签名值域-截掉32字节S,判断末尾16进制字符串是否为“00”,若是“00”,则剥除前方3字节-4个16进制字符串(Type和length和填充“00”)-再从签名值字符串末尾取32字节(64个HexStr字符)-即为点R的值。
由于这玩意是做 [证书自动验证工具] 时的副产物,故源代码已经丢失,只留下了编译好的程序,供初学者或对待特殊证书时使用。所以下面只说使用流程:
这东西全部的内容有这些:
1.将上文从ASN.1中提取的基本证书域、签名值域,和上一级CA证书的公钥(直接点开CA证书复制即可)的内容直接复制到工具路径的input文件夹里对应的txt中
2.点击验证脚本
关于椭圆曲线公钥压缩规则:Hex字符串04开头:是为未被压缩的公钥,Hex字符串03开头,后面的32byte为公钥X坐标的值,我们可以通过带入椭圆曲线参数对公钥进行解压缩。03意为:y的值(整形)为奇数;对应的,02意为y的值为偶数,可以用我这个工具来对椭圆曲线的公钥进行压缩、解压缩:SM2公钥压缩、解压缩工具
最后的 错误尝试:可以尝试修改output文件夹中txt字段的任意内容,再点开验证脚本:
得到验证False的结果