如何安全地读取PKCS12并将其传递给ruby中的对象?

时间:2013-11-28 00:34:20

标签: ruby ssl encoding openssl pkcs#12

我目前正在使用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编码?

3 个答案:

答案 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测试)