我目前正在使用google api客户端gem与google apis进行通信。它使用PKCS12对这些服务进行身份验证,并使用OpenSSL :: PKCS12.new
http://www.ruby-doc.org/stdlib-2.0/libdoc/openssl/rdoc/OpenSSL/PKCS12.html
然而,当我使用File.read读取文件并尝试传递字符串时,我得到String有一个空字节错误。如何避免这种情况并确保它仍然是针对PKCS12类的DER编码?
答案 0 :(得分:3)
我在这个问题上发布赏金之后不久就想到了这一点。 问题In ruby, how do I get the subject, issuer etc. after creating an OpenSSL PKCS12 object对于提出这个解决方案非常有用。
OpenSSL::PKCS12::new将抛出异常,因为String不是有效的DER编码字符串或密码不正确。
这是我为我的模型编写的验证器,
def valid_pkcs12_file
begin
test = OpenSSL::PKCS12::new(pkcs12_file.read, password)
rescue Exception => e
Rails.logger.warn "pkcs12 error #{e.message}"
errors.add(:pkcs12_file, 'invalid pkcs12 file or password')
ensure
pkcs12_file.rewind
end
end
如果有人有更优雅的方法,我愿意接受建议。
答案 1 :(得分:3)
require 'openssl'
p12 = OpenSSL::PKCS12.new(File.read('/path/to/p12'), "pass_phrase")
key = p12.key
certificate = p12.certificate
答案 2 :(得分:1)
使用Google::APIClient::KeyUtils.load_from_pkcs12
代替OpenSSL::PKCS12.new
。它将返回OpenSSL::PKey::RSA
个实例。
load_from_pkcs12
将引发ArgumentError: Invalid keyfile or passphrase
。
来自README:
key = Google::APIClient::KeyUtils.load_from_pkcs12('client.p12', 'notasecret')
# and so on
(用ruby-2.1.0测试)