在 ruby 中生成 OpenSSL subject_name 哈希

Generate OpenSSL subject_name hash in ruby

我已经调查了 但是我仍然不知所措,无法找到一种方法在 Ruby 中使用 openssl and/or 摘要 gems。我试图在 ruby 中复制的 OpenSSL 输出如下:

$ openssl x509 -noout -subject_hash -in DigiCertSHA2SecureServerCA.pem
85cf5865

在阅读很多东西时,我相信这个哈希是从证书的 Subject: 部分生成的,就像专有名称一样。在此证书案例中,效果为:

$ openssl x509 -noout -subject -in DigiCertSHA2SecureServerCA.crt
subject=C = US, O = DigiCert Inc, CN = DigiCert SHA2 Secure Server CA

尝试在命令行或 Ruby 中(使用 openssl gem 时将其表示为 /C=US,/O=DigiCert Inc/CN=DigiCert SHA2 Secure Server CA)进行 SHA-1 编码,但没有产生相同的结果由 OpenSSL 显示。

我正在尝试在 Ruby 中更自然地执行此操作,以避免尽可能避免使用 openssl,因为 openssl 和 digest 与 ruby env 一起出现。最后我需要它来生成哈希目录树......即 85cf5865.0 (hash + '.0').

我拥有的 CA 是 DigiCertSHA2SecureServerCA.crt - DER 编码。我将 DER 转换为 PEM,因为 openssl 命令行使用它时没有额外的 -inform der 开关。 Ruby 的 openssl gem.

似乎无关紧要

事实证明这非常简单,因为 Ruby 的 OpenSSL 绑定包括 OpenSSL::X509::Name#hash method,这正是我们想要的。

require 'openssl'

# Read the certificate.
cert = OpenSSL::X509::Certificate.new(File.binread("DigiCertSHA2SecureServerCA.crt"))

# Get the subject, which is an OpenSSL::X509::Name object.
name = cert.subject

# hash returns an integer, we want the hex string so call to_s(16).
puts name.hash.to_s(16) #=> 85cf5865

由于 OpenSSL returns 是一个无符号整数,因此整数将是正数,因此我们可以直接使用 to_s(16) 而无需担心转换负值。