我已经调查了30261296但是我仍然无法找到一种方法在Ruby中使用openssl和/或digest gem生成相同的结果。我尝试在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中使用SHA-1对其进行编码(在使用openssl gem时将其表示为/C=US,/O=DigiCert Inc/CN=DigiCert SHA2 Secure Server CA
),OpenSSL显示的结果并不一致。
我试图在Ruby中本地更多地尝试这样做,以避免在可能的情况下出现openssl,因为openssl和digest伴随着ruby env。最后,我需要这个来生成哈希目录树...即85cf5865.0
(哈希+' .0')。
我正在进行的CA DigiCertSHA2SecureServerCA.crt - DER编码。我将DER转换为PEM,因为openssl命令行在没有额外-inform der
开关的情况下使用它。对Ruby的openssl gem来说,它似乎并不重要。
答案 0 :(得分:1)
事实证明这非常简单,因为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返回unsigned int,所以我们可以使用to_s(16)
而不必担心转换负值。