4

我需要以下红宝石等价物:

openssl x509 -sha1 -fingerprint -noout -in cert.pem

我写的代码是:

data = File.read("cert.pem")
data["-----BEGIN CERTIFICATE-----\n"]=""
data["-----END CERTIFICATE-----\n"]=""
OpenSSL::Digest::SHA1.new(Base64.encode64(data))

此代码不会生成与 openssl cli 命令相同的指纹。

知道我可能做错了什么吗?

4

2 回答 2

8

As gtrig mentions, the OpenSSL command line builds the fingerprint by hashing the DER encoding of the certificate, not the Base64 PEM representation. You can parse this using pure OpenSSL:

file_data = File.read("cert.pem")
cert = OpenSSL::X509::Certificate.new(file_data)
puts OpenSSL::Digest::SHA1.new(cert.to_der).to_s

Shameless plug: r509 can also do this like so:

cert = R509::Cert.load_from_file("cert.pem")
puts cert.fingerprint('sha1')

If you need it to be in colon separated form you can just take the hash and do something like "fingerprint".scan(/../).map{ |s| s.upcase }.join(":")

于 2013-05-13T19:41:52.293 回答
1

试试 Base64.decode64。

OpenSSL::Digest::SHA1.new(Base64.decode64(data))

PEM 格式的证书是二进制 DER 格式的 Base 64 编码版本,因此需要在获取 SHA1 哈希之前对其进行解码。

或者,您可以使用 OpenSSL 将 PEM 文件转换为 DER 格式,如下所示:

openssl x509 -in cert.pem -out cert.der -outform der

然后您的 Ruby 代码将如下所示:

 data2 = File.read("cert.der")
 print OpenSSL::Digest::SHA1.new(data2)

无论哪种方式都有效。

于 2013-05-13T17:39:02.907 回答