证书/ CRL目录的哈希算法

时间:2015-12-04 18:50:54

标签: openssl

OpenSSL能够为CA证书和CRL使用特定的目录结构。如果将目录名称作为第三个参数传递给SSL_CTX_load_verify_locations(如this question中所述),它将在此目录中查找CA证书以验证客户端证书。它通过获取客户端证书的颁发者的哈希并附加一个整数,例如,它来找到正确的CA证书。 34bb8598.0。通常,这些名称是指向真实文件的符号链接,符号链接是使用c_rehash工具创建的。

同样,OpenSSL可以在这些目录中存储证书撤销列表,如this question中所述,并通过证书颁发者的哈希查找正确的撤销列表。

现在,我需要让程序重用这样的CRL目录。该程序不使用OpenSSL,因此我需要以其他方式生成这些哈希。生成这些散列文件名的算法是什么?

1 个答案:

答案 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)
    • 一个或多个RelativeDistinguishedName项,每个项都带有标记0x30(小数48)
      • 一种类型,表示为OID,标记为0x06
      • 一个字符串值 - 这就是它变得有趣的地方

证书中给出的字符串值可以用许多不同的类型表示,例如:标记为0x13的“可打印字符串”,标记为0x16的“IA5字符串”或标记为0x0c的UTF-8字符串。

生成“规范编码”时,RDNSequence中每个项目的值将转换为UTF-8,并重新编码为带有标记0x0c的UTF-8字符串。这发生在asn1_string_canon function中。此外,还应用了以下转换:

  • 删除任何前导和尾随空格。任何具有高位设置的字节都可以不加更改地通过,因此在此上下文中的“空格”表示空格,换页,换行,回车,水平制表符和垂直制表符。
  • 在字符串内部,上面定义的一个或多个空格字符的任何运行都会被一个空格(0x20)替换。
  • 字符转换为小写。由于忽略了具有高位设置的任何字节,因此这仅适用于ASCII字母A到Z。

这就是你需要做的一切。

请注意,某些字段的ASN.1定义不允许使用UTF-8字符串(例如,国家/地区代码仅限于“可打印字符串”),因此您可能无法使用ASN。 1个直接编码库。