我需要以下的红宝石:
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命令相同的指纹。
知道我可能做错了吗?
答案 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)
无论哪种方式都有效。