在Erlang中从RSA私钥生成x509公钥

4
我正在使用Erlang创建一个应用程序,该程序可以在给定RSA私钥的情况下返回与该私钥相关的RSA公钥和x509公钥。我知道只需从私钥获取模数和公共指数即可生成RSA公钥。
--from OTP-PUB-KEY.hrl
-record('RSAPrivateKey',{
version, modulus, publicExponent, privateExponent, prime1, prime2, exponent1, exponent2,     coefficient, otherPrimeInfos = asn1_NOVALUE}).

-record('RSAPublicKey',{
modulus, publicExponent}).  

但是我该如何生成x509公钥呢?

我知道这是可能的,因为我的旧的Perl代码曾通过类似于以下方式来调用此功能:

$private = Crypt::OpenSSL::RSA->new_private_key( $hash_ref->{'private'} );
{rsa  => $private->get_public_key_string(),
 x509 => $private->get_public_key_x509_string()};

有人知道如何做到这一点吗?

----- 仅更新 ----

在花费一些时间学习x509和阅读Erlang public_key文档后,我找到了解决方案:

由于只需获取模数和publicExponent即可从RSAPrivateKey生成RSAPublicKey,因此生成两个密钥的代码如下:

getPublicKeysFromPrivateKey(#'RSAPrivateKey'{modulus = M, publicExponent = PE}) ->
    RSAPub = #'RSAPublicKey'{modulus = M, publicExponent = PE},

    %% Encoding the keys
    RSAPublicKey = public_key:pem_encode([public_key:pem_entry_encode('RSAPublicKey', RSAPub)]),
    X509PublicKey = public_key:pem_encode([public_key:pem_entry_encode('SubjectPublicKeyInfo', RSAPub)]),

    [{rsa, RSAPublicKey},{x509, X509PublicKey}].

这将生成:

[{rsa,<<"-----BEGIN RSA PUBLIC KEY----- \nMIGJAoGBAMU8ZcQ4S+gHDuZd6cEdqbf9l1Hw4fxQrJ455B2kJRUwyKidVbCH2omy\nI0SLNu92"...>>},
 {x509,<<"-----BEGIN PUBLIC KEY-----\nMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDFPGXEOEvoBw7mXenBHam3/ZdR\n8OH8UKye"...>>}]

感谢您的信任。

你是指x509证书吗?为什么认为你需要这样的东西? - President James K. Polk
我真的想要x509公钥。这是RASPublicKey的另一种格式,如果以'PEM'格式呈现,则为'BEGIN PUBLIC KEY'而不是'BEGIN RSA PUBLIC KEY'。 - RobisonSantos
1个回答

1

显而易见的事情是:

public_key(#'RSAPrivateKey'{modulus = Mod, publicExponent = Exp}) ->
    #'RSAPublicKey'{modulus = Mod, publicExponent = Exp}.

从哪里似乎生成了一个有效的记录:

public_key(public_key:pem_entry_decode(hd(public_key:pem_decode(element(2, file:read_file("<OTP Src Dir>/lib/public_key/test/public_key_SUITE_data/server_key.pem")))))).

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接