(Erlang)以pem格式从证书中提取公钥

(Erlang)以pem格式从证书中提取公钥,erlang,certificate,rsa,public-key,pem,Erlang,Certificate,Rsa,Public Key,Pem,我有一个pem格式的证书,我想提取公钥(RSA)。我已经走了这么远: {ok, PemBin} = file:read_file("/path/to/certificate.pem"). [Certificate] = public_key:pem_decode(PemBin). 现在,我可以做以下工作: public_key:pem_entry_decode(Certificate). rr(public_key). 这给了我一个包含证书上各种细节的元组,但我在任何地方都看不到公钥的条目

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

{ok, PemBin} = file:read_file("/path/to/certificate.pem").
[Certificate] = public_key:pem_decode(PemBin).
现在,我可以做以下工作:

public_key:pem_entry_decode(Certificate).
rr(public_key).

这给了我一个包含证书上各种细节的元组,但我在任何地方都看不到公钥的条目。如何从该证书获取公钥?应该是直截了当的,但我在公钥模块中找不到任何函数。

公钥:pem\u条目解码(证书)返回一个
证书
记录。要从中提取公钥,需要加载记录定义。在Erlang shell中,键入以下内容:

public_key:pem_entry_decode(Certificate).
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.
然后您可以像这样提取公钥信息:

-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,...>>}
#'SubjectPublicKeyInfo'{
算法=
#“算法识别器”{
算法={1,2840113549,1,1,1},
参数=},
subjectPublicKey=
}
或者再往下挖一层以获得钥匙:

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,...>>
DecodedCertificate#“Certificate”.tbsCertificate
#“TBSCertificate”。主题PublicKeyInfo
#“SubjectPublicKeyInfo”。subjectPublicKey。

好的,下面是模块中的完整功能:

-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),
PublicKey=crypto\u helper:从证书(“/usr/admin/myServer/priv/certificate.pem”)获取公钥,
EncryptedMsg=公钥:加密公钥(,公钥),

谢谢,这对我帮助很大。只缺少最后一步,即解码公钥并获取必须在公钥中使用的rsa_public_key()-类型:decrypt_public/2。subjectPublicKey可能是
{0,KeyDer}=DecodedCertificate#'Certificate'.tbsCertificate#'tbsCertificate'.subjectPublicKeyInfo#'subjectPublicKeyInfo'.subjectPublicKey.
其中,如果密钥类型为RSA
RSPublicKey=public\u-key:decode('RSPublicKey',-key.),则密钥为R。
现在RSPublicKey类型为RSA\u-key()