Pergunta

Acabei de escrever um código de assinatura digital OpenSSL/PKCS7 e agora tenho um arquivo PKCS7 codificado por PEM funcionando. Então, depois de pouca batalha, preciso converter esse PEM para o formato Der. Isso está se mostrando mais difícil do que eu esperava.

Existem alguns métodos de conveniência no OpenSSL, como "PEM_WRITE_BIO_PKCS7_STREAM" para escrever seu objeto PKCS7. Mas, depois de alguns pesquisando e navegando em alguns arquivos de cabeçalho, não consigo encontrar nada para pegar um objeto PKCS7 e escrevê -lo em qualquer coisa (bio, arquivo, char*) no formato.

Então, sentindo -me derrotado por lá, voltei -me para analisar o cabeçalho e o rodapé do arquivo PEM e a Base64 decodificando o conteúdo. Como cheque, fiz isso com Java & Bouncycastle e consegui exatamente o que quero.

Aqui está o meu código para isso. Com quase todos os decodificadores Base64, eu tento, viro algo assim ...

MIIHmwYJKoZIhvcNAQcCoIIHjDCCB4gCAQExCzAJBgUrDgMCGgUAMIIBrQYJKoZI
hvcNAQc ... Lots More stuff
... +8L5ad45D/7ZGJWafaSw==

em...

0\202\233   *\367\367
\240\202\2140\202\21010 +

Aqui está esse código ...

    string PKCS7String(starting_point);

    string PEM_PKCS7_HEADER("-----BEGIN PKCS7-----\n");
    string PEM_PKCS7_FOOTER("\n-----END PKCS7-----");

    string::size_type pos = 0;
    while ( (pos = PKCS7String.find(PEM_PKCS7_HEADER, pos)) != string::npos ) {
        PKCS7String.replace( pos, PEM_PKCS7_HEADER.length(), "" );
        pos++;
    }

    pos = 0;
    while ( (pos = PKCS7String.find(PEM_PKCS7_FOOTER, pos)) != string::npos ) {
        PKCS7String.replace( pos, PEM_PKCS7_FOOTER.length(), "" );
        pos++;
    }
    //Take your pick of decoders, they all do the same thing. Here's just the most recent
    auto_ptr< uint8_t > decoded = decode(PKCS7String);
    uint8_t* array = decoded.get();
    cout << array << endl;

Alguma ideia?

Foi útil?

Solução

i2d_PKCS7_fp() e i2d_PKCS7_bio() a partir de <openssl/pkcs7.h> vai escrever um PKCS7 estrutura no formato Der para um fluxo de arquivos ou bio, respectivamente.

Outras dicas

Um arquivo PEM é apenas uma versão codificada base64 do arquivo Der com o -----BEGIN PKCS7----- & -----END PKCS7----- Linhas de cabeçalho e rodapé.
Portanto, não exatamente ao certo o que você espera ver após a base64 decodificando ...

Como um teste apenas:

  1. Pacote um certificado no formato PKCS#7 PEM: $ openssl crl2pkcs7 -nocrl -out outfile.pem.p7b -certfile server.crt -outform pem

  2. Pacote o mesmo certificado no formato PKCS#7 Der: $ openssl crl2pkcs7 -nocrl -out outfile.der.p7b -certfile server.crt -outform der

  3. Base64 decodifique o corpo do arquivo PEM (outfile.pem.p7b) com o decodificador de sua escolha e compare a saída binária com o arquivo DER (outfile.der.p7b)

Agora, receio que seja isso que você pediu, mas não o que você queria ...

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top