OpenSSL能够为CA证书和CRL使用特定的目录结构。如果将目录名称作为第三个参数传递给SSL_CTX_load_verify_locations
(如this question中所述),它将在此目录中查找CA证书以验证客户端证书。它通过获取客户端证书的颁发者的哈希并附加一个整数,例如,它来找到正确的CA证书。 34bb8598.0
。通常,这些名称是指向真实文件的符号链接,符号链接是使用c_rehash
工具创建的。
同样,OpenSSL可以在这些目录中存储证书撤销列表,如this question中所述,并通过证书颁发者的哈希查找正确的撤销列表。
现在,我需要让程序重用这样的CRL目录。该程序不使用OpenSSL,因此我需要以其他方式生成这些哈希。生成这些散列文件名的算法是什么?
答案 0 :(得分:2)
哈希格式未记录,因此可能会发生变化 - 事实上,它已经改变了一次。 x509
command支持选项-subject_hash
和-issuer_hash
以及-subject_hash_old
和-issuer_hash_old
。此描述适用于OpenSSL 1.0.1f的“新”哈希格式。
X509_subject_name_hash
and X509_issuer_name_hash
functions只需在相应的证书属性上调用X509_NAME_hash
即可。 That function获取名称的“规范编码”的SHA-1哈希值,将其前四个字节视为小端32位整数,并将其返回(有效地反转哈希的前四个字节)
那么“规范编码”是什么?它是由函数x509_name_canon
生成的发行者名称的DER表示的变体。 DER是标签长度值编码。我们代表的对象树看起来像这样:
rdnSequence
,标记0x31
(小数49)
0x30
(小数48)
0x06
证书中给出的字符串值可以用许多不同的类型表示,例如:标记为0x13
的“可打印字符串”,标记为0x16
的“IA5字符串”或标记为0x0c
的UTF-8字符串。
生成“规范编码”时,RDNSequence中每个项目的值将转换为UTF-8,并重新编码为带有标记0x0c
的UTF-8字符串。这发生在asn1_string_canon
function中。此外,还应用了以下转换:
0x20
)替换。这就是你需要做的一切。
请注意,某些字段的ASN.1定义不允许使用UTF-8字符串(例如,国家/地区代码仅限于“可打印字符串”),因此您可能无法使用ASN。 1个直接编码库。