【问题标题】:Getting OpenSSL::X509::CertificateError nested asn1 error on Ruby在 Ruby 上获取 OpenSSL::X509::CertificateError 嵌套 asn1 错误
【发布时间】:2014-06-17 12:29:03
【问题描述】:

我有来自 Apple 的 .p12 文件,并尝试使用以下命令将其转换为 .pem 文件:

openssl pkcs12 -in cert.p12 -out apple_push_notification_development.pem -nodes -clcerts

尝试创建新的 OpenSSL::X509::Certificate 对象时

OpenSSL::X509::Certificate.new(File.read('apple_push_notification_development.pem'))

我收到以下错误:

OpenSSL::X509::CertificateError: nested asn1 error
    from (irb):9:in `initialize'
    from (irb):9:in `new'
    ...

我做错了吗?被卡住了,请帮忙。 谢谢

【问题讨论】:

    标签: ruby apple-push-notifications


    【解决方案1】:

    感谢这不是您完全相同的情况,但我试图在我的实例中读取 PEM 文件 (PKCS7)。 OpenSSL CLI 可以很好地解码它,但是当我尝试将它加载到一个对象中时,ruby 一直抛出你描述的相同的嵌套 asn1 错误。

    在我的情况下,它需要一个新行,即 PEM 文件末尾的 '\n' 才能接受它。

    只有当我创建一个空对象并将生成的 PEM 输出与我尝试加载的文件进行比较时,我才解决了这个问题。

    因此,可以尝试使用 X509 证书:

    cert = OpenSSL::X509::Certificate.new
    cert.to_pem
    => "-----BEGIN CERTIFICATE-----\nMCUwGwIAMAMGAQAwADAEHwAfADAAMAgwAwYBAAMBADADBgEAAwEA\n-----END CERTIFICATE-----\n"
    

    并将其与您的 PEM 文件进行比较

    如您所见,它以新行结束,而我尝试导入的文件中缺少该行。

    【讨论】:

    • 对我来说,我没有在最后和每个块之后包含 '\n's。一旦我的字符串看起来像你的,它就起作用了。
    • 谢谢!完全相同的问题.. 必须在 BEGIN 块之后显式添加 \n 并围绕 END 块。
    【解决方案2】:

    当您忘记签署新生成的证书时,也可能发生这种情况。我想使用自签名证书,但忘记了签名部分。

    # Create key
    key = OpenSSL::PKey::RSA.new(2048)
    open("key.pem", "w") do |io| io.write(key.to_pem) end
    
    # Generate certificate
    name = OpenSSL::X509::Name.parse("CN=example.com/C=EE")
    cert = OpenSSL::X509::Certificate.new
    cert.version     = 2
    cert.serial      = 0
    cert.not_before  = Time.now
    cert.not_after   = cert.not_before + 1 * 365 * 24 * 60 * 60 # 1 year validity
    cert.public_key  = key.public_key
    cert.subject     = name
    

    这部分代码是我错过的:

    cert.issuer = name
    cert.sign key, OpenSSL::Digest::SHA1.new
    open "cert.pem", 'w' do |io| io.write cert.to_pem end
    

    【讨论】:

      【解决方案3】:

      我也遇到了同样的问题,我需要用 Base64 解码文件内容。

      require 'openssl'
      require 'base64'
      
      encoded_content = File.read('apple_push_notification_development.pem')
      decoded_content = Base64.decode64(encoded_content)
      certificate = OpenSSL::X509::Certificate.new(decoded_content)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多