(Erlang)以pem格式从证书中提取公钥
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了(Erlang)以pem格式从证书中提取公钥相关的知识,希望对你有一定的参考价值。
我有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(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),
另一答案
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,...>>
以上是关于(Erlang)以pem格式从证书中提取公钥的主要内容,如果未能解决你的问题,请参考以下文章