【问题标题】:(Erlang) extracting public key from certificate in pem format(Erlang) 从 pem 格式的证书中提取公钥
【发布时间】:2016-06-02 23:09:12
【问题描述】:

我有一个 pem 格式的证书,我想提取公钥 (RSA)。我已经到这一步了:

{ok, PemBin} = file:read_file("/path/to/certificate.pem").
[Certificate] = public_key:pem_decode(PemBin).

现在,我可以执行以下操作:

public_key:pem_entry_decode(Certificate).

这给了我一个包含证书各种详细信息的元组,但我在任何地方都看不到公钥的条目。如何从此证书中获取公钥?应该是直截了当的,但我在 public_key-module 中找不到任何功能。

【问题讨论】:

    标签: erlang certificate rsa public-key pem


    【解决方案1】:

    好的,这是一个模块中的完整功能:

    -module(crypto_helper).
    -include_lib("public_key/include/public_key.hrl").
    -export([get_public_key_from_cert/1]).
    
    get_public_key_from_cert(PathToCert) ->
       {ok, PemBin} = file:read_file(PathToCert),
       PemEntries = public_key:pem_decode(PemBin),
       {value, CertEntry} = lists:keysearch(‘Certificate’, 1, PemEntries)
       {_, DerCert, _} = CertEntry,
       Decoded = public_key:pkix_decode_cert(DerCert, otp),
       PublicKey = Decoded#'OTPCertificate'.tbsCertificate#'OTPTBSCertificate'.subjectPublicKeyInfo#'OTPSubjectPublicKeyInfo'.subjectPublicKey,
       PublicKey.
    

    现在你可以按如下方式使用它:

    PublicKey = crypto_helper:get_public_key_from_cert("/usr/admin/myServer/priv/certificate.pem"),
    EncryptedMsg = public_key:encrypt_public(<<"Hallo">>, PublicKey),
    

    【讨论】:

      【解决方案2】:

      public_key:pem_entry_decode(Certificate) 返回一个Certificate 记录。要从中提取公钥,您需要加载记录定义。在 Erlang shell 中,键入以下内容:

      rr(public_key).
      

      在将记录定义加载到 shell 后,返回值将包含字段名称以及字段值,这应该会让事情更清楚一些。

      在 Erlang 模块中,像这样加载头文件:

      -include_lib("public_key/include/public_key.hrl").
      

      然后你可以像这样提取公钥信息:

      DecodedCertificate = public_key:pem_entry_decode(Certificate).
      DecodedCertificate#'Certificate'.tbsCertificate#'TBSCertificate'.subjectPublicKeyInfo.
      

      返回:

      #'SubjectPublicKeyInfo'{
          algorithm = 
              #'AlgorithmIdentifier'{
                  algorithm = {1,2,840,113549,1,1,1},
                  parameters = <<5,0>>},
          subjectPublicKey = 
              <<48,130,2,10,2,130,2,1,0,195,76,200,181,90,146,51,183,
                39,91,176,28,95,117,241,28,140,...>>}
      

      或者再深入一层得到密钥本身:

      DecodedCertificate#'Certificate'.tbsCertificate
          #'TBSCertificate'.subjectPublicKeyInfo
          #'SubjectPublicKeyInfo'.subjectPublicKey.
      <<48,130,2,10,2,130,2,1,0,195,76,200,181,90,146,51,183,39,
        91,176,28,95,117,241,28,140,212,223,132,...>>
      

      【讨论】:

      • 谢谢,这对我帮助很大。只缺少最后一步,您解码公钥并获取您必须在 public_key:decrypt_public/2 中使用的 rsa_public_key() 类型。
      • 如果密钥的类型为 RSA RsaPublicKey = public_key:der_decode('RSAPublicKey', KeyDer).,则 subjectPublicKey 可能为 {0, KeyDer} = DecodedCertificate#'Certificate'.tbsCertificate #'TBSCertificate'.subjectPublicKeyInfo #'SubjectPublicKeyInfo'.subjectPublicKey. 其中 KeyDer 是 Der 编码的,现在 RsaPublicKey 的类型为 rsa_public_key()
      猜你喜欢
      • 2015-05-16
      • 2022-10-19
      • 1970-01-01
      • 1970-01-01
      • 2014-12-01
      • 2012-11-12
      • 2020-03-06
      • 2013-06-13
      • 1970-01-01
      相关资源
      最近更新 更多