Openssl 证书/CRL目录的哈希算法
OpenSSL能够为CA证书和CRL使用特定的目录结构。如果将目录名作为第三个参数传递给(如中所述),它将在此目录中查找CA证书,以验证客户端证书。它通过获取客户端证书颁发者的哈希并附加一个整数(例如,Openssl 证书/CRL目录的哈希算法,openssl,Openssl,OpenSSL能够为CA证书和CRL使用特定的目录结构。如果将目录名作为第三个参数传递给(如中所述),它将在此目录中查找CA证书,以验证客户端证书。它通过获取客户端证书颁发者的哈希并附加一个整数(例如,34bb8598.0)来查找正确的CA证书。通常,这些名称是指向真实文件的符号链接,并且符号链接是使用该工具创建的 类似地,OpenSSL可以将证书吊销列表存储在此类目录中(如中所述),并通过证书颁发者的哈希查找正确的吊销列表 现在,我需要让一个程序重用这样一个CRL目录。该程序不使用OpenSS
34bb8598.0
)来查找正确的CA证书。通常,这些名称是指向真实文件的符号链接,并且符号链接是使用该工具创建的
类似地,OpenSSL可以将证书吊销列表存储在此类目录中(如中所述),并通过证书颁发者的哈希查找正确的吊销列表
现在,我需要让一个程序重用这样一个CRL目录。该程序不使用OpenSSL,因此我需要以其他方式生成这些散列。生成这些散列文件名的算法是什么?散列格式没有文档记录,因此这很可能会改变,事实上,它已经改变过一次。支持选项
-subject\u hash
和-issuer\u hash
以及-subject\u hash\u old
和-issuer\u hash\u old
。本说明适用于OpenSSL 1.0.1f之后的“新”哈希格式
对应证书属性上的just callX509\u NAME\u hash
。获取名称的“规范编码”的SHA-1散列,将其前四个字节视为小尾数32位整数,并返回它(有效地反转散列的前四个字节)
那么什么是“规范编码”?它是由函数生成的发卡机构名称的DER表示形式的变异。DER是一种标记长度值编码。我们表示的对象树如下所示:
,带标签rdnSequence
(十进制49)0x31
- 一个或多个RelativeDistinguishedName项目,每个项目都带有标记
(十进制48)0x30
- 一种类型,表示为OID,带有标记
0x06
- 一个字符串值——这就是它变得有趣的地方
- 一种类型,表示为OID,带有标记
- 一个或多个RelativeDistinguishedName项目,每个项目都带有标记
0x13
的“可打印字符串”、带有标记0x16
的“IA5字符串”或带有标记0x0c
的UTF-8字符串
在生成“规范编码”时,RDN序列中每个项目的值将转换为UTF-8,并重新编码为带有标记0x0c
的UTF-8字符串。这种情况发生在家庭中。此外,还应用了以下转换:
- 删除所有前导和尾随空格。任何具有高阶位集的字节都可以不经更改地通过,因此在本上下文中,“空白”表示空格、换行符、换行符、回车符、水平制表符和垂直制表符
- 在字符串内部,上面定义的一个或多个空白字符的任何运行都将被替换为单个空格(
)0x20
- 字符转换为小写。由于忽略任何具有高阶位集的字节,因此这仅适用于ASCII字母A到Z
请注意,某些相关字段的ASN.1定义不允许UTF-8字符串(例如,国家代码仅限于“可打印字符串”),因此您可能无法直接使用ASN.1编码库。哈希格式没有记录,因此可能会发生更改-事实上,它已经更改过一次。支持选项
-subject\u hash
和-issuer\u hash
以及-subject\u hash\u old
和-issuer\u hash\u old
。本说明适用于OpenSSL 1.0.1f之后的“新”哈希格式
对应证书属性上的just callX509\u NAME\u hash
。获取名称的“规范编码”的SHA-1散列,将其前四个字节视为小尾数32位整数,并返回它(有效地反转散列的前四个字节)
那么什么是“规范编码”?它是由函数生成的发卡机构名称的DER表示形式的变异。DER是一种标记长度值编码。我们表示的对象树如下所示:
,带标签rdnSequence
(十进制49)0x31
- 一个或多个RelativeDistinguishedName项目,每个项目都带有标记
(十进制48)0x30
- 一种类型,表示为OID,带有标记
0x06
- 一个字符串值——这就是它变得有趣的地方
- 一种类型,表示为OID,带有标记
- 一个或多个RelativeDistinguishedName项目,每个项目都带有标记
0x13
的“可打印字符串”、带有标记0x16
的“IA5字符串”或带有标记0x0c
的UTF-8字符串
在生成“规范编码”时,RDN序列中每个项目的值将转换为UTF-8,并重新编码为带有标记0x0c
的UTF-8字符串。这种情况发生在家庭中。此外,还应用了以下转换:
- 删除所有前导和尾随空格。任何具有高阶位集的字节都可以不经更改地通过,因此在本上下文中,“空白”表示空格、换行符、换行符、回车符、水平制表符和垂直制表符
- 在字符串内部,上面定义的一个或多个空白字符的任何运行都将被替换为单个空格(
)0x20
- 字符转换为小写。由于忽略任何具有高阶位集的字节,因此这仅适用于ASCII字母A到Z