2011-01-05 11 views
0

Ich habe gerade fertig mit dem Schreiben einiger OpenSSL/PKCS7 digitalen Signatur-Code und haben jetzt eine funktionierende PEM-codierte PKCS7-Datei. Nach einem kleinen Kampf muss ich das PEM in das DER-Format konvertieren. Das ist schwieriger als ich gehofft hatte.PEM-Konvertierung (PKCS7) zu DER - AKA Base64 C++ - Probleme

Es gibt einige bequeme Methoden in OpenSSL wie "PEM_write_bio_PKCS7_stream", um Ihr PKCS7-Objekt zu schreiben. Aber nach einigem googeln und Durchsuchen einiger Header-Dateien, kann ich anscheinend nichts finden, um ein PKCS7-Objekt zu nehmen und es in irgendetwas (BIO, FILE, char *) im DER-Format zu schreiben.

So fühlte ich mich geschlagen, wandte ich mich an den Header & Fußzeile in der PEM-Datei und Base64 entschlüsseln den Inhalt. Als Kontrolle habe ich das mit Java & BouncyCastle gemacht und genau das bekommen was ich will.

Hier ist mein Code dafür. Mit fast jedem Base64 Decoder ich versuche ich so etwas wie dieses drehen ...

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

in ...

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

Hier ist der Code ...

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; 

Irgendwelche Gedanken?

Antwort

0

i2d_PKCS7_fp() und i2d_PKCS7_bio() Von <openssl/pkcs7.h> wird eine PKCS7 Struktur im DER-Format in einen Dateistream bzw. BIO geschrieben.

3

Eine PEM-Datei ist nur eine Base64-codierte Version der DER-Datei mit den -----BEGIN PKCS7----- & -----END PKCS7----- Kopf- und Fußzeilen.
Also nicht ganz sicher, was Sie nach Base64 Decodierung es zu erwarten ...

Als Test nur:

  1. Paket ein Zertifikat in PKCS # 7-PEM-Format: $ openssl crl2pkcs7 -nocrl -out outfile.pem.p7b -certfile server.crt -outform pem

  2. Paket das gleiche Zertifikat in PKCS # 7 DER-Format: $ openssl crl2pkcs7 -nocrl -out outfile.der.p7b -certfile server.crt -outform der

  3. Base64 entschlüsseln den Körper der PEM-Datei (outfile.pem.p7b) mit dem Decoder o f Ihre Wahl & vergleicht den Binärausgang mit dem DER-Datei (outfile.der.p7b)

Nun, ich fürchte, das sein kann, was Sie gefragt, aber nicht das, was man wollte ...

Verwandte Themen