在ruby中生成OpenSSL subject_name哈希

时间:2018-06-16 18:15:17

标签: ruby hash openssl sha1

我已经调查了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来说,它似乎并不重要。

1 个答案:

答案 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)而不必担心转换负值。