2016-02-21 7 views
3

У меня есть сертификат в формате pem, и я хочу извлечь открытый ключ (RSA). Я уже далеко:(Erlang) извлечение открытого ключа из сертификата в формате pem

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

Теперь, я могу сделать следующее:

public_key:pem_entry_decode(Certificate). 

Это дает мне кортеж со всеми видами деталей на сертификате, но я не могу увидеть везде, где запись для открытого ключа. Как получить открытый ключ из этого сертификата? Должно быть прямо, но я не могу найти какую-либо функцию в public_key-модуле для этого.

ответ

4

Ok, вот полный функция в модуле:

-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), 
3

public_key:pem_entry_decode(Certificate) возвращает Certificate запись. Чтобы извлечь открытый ключ из него, вам необходимо загрузить определения записи. В оболочке Эрланга, введите следующую команду:

rr(public_key). 

После загрузки определения записи в оболочку, возвращаемые значения будут содержать имена полей, а также значения полей, которые должны сделать вещи немного яснее.

В модуле 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,...>> 
+0

Спасибо, что помогли мне. Остается только последний шаг, где вы декодируете открытый ключ и получаете тип rsa_public_key(), который вы должны использовать в public_key: decrypt_public/2. – Jeyhey

+0

Существует вероятность того, что subjectPublicKey может быть '{0, KeyDer} = DecodedCertificate # 'Certificate'.tbsCertificate #' TBSCertificate'.subjectPublicKeyInfo # 'SubjectPublicKeyInfo'.subjectPublicKey.' Где KeyDer является Der кодировкой, если ключ имеет тип RSA 'RsaPublicKey = public_key: der_decode ('RSAPublicKey', KeyDer). Теперь RsaPublicKey имеет тип rsa_public_key() –

 Смежные вопросы

  • Нет связанных вопросов^_^