用于生成指纹的openssl的Ruby代码

时间:2013-05-13 07:09:36

标签: ruby openssl base64 sha1 fingerprint

我需要以下的红宝石:

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命令相同的指纹。

知道我可能做错了吗?

2 个答案:

答案 0 :(得分:6)

正如gtrig所提到的,OpenSSL命令行通过散列证书的DER编码而不是Base64 PEM表示来构建指纹。您可以使用纯OpenSSL解析它:

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

无耻的插件:r509也可以这样做:

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

如果你需要它以冒号分隔的形式,你可以只取哈希并执行"fingerprint".scan(/../).map{ |s| s.upcase }.join(":")

之类的操作

答案 1 :(得分: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)

无论哪种方式都有效。