2015-02-17 13 views
7

Ich habe eine .pem-Datei (Base64-kodierte Kryptografie-Informationen). Welche OpenSSL-Befehlszeile sollte ich verwenden, um festzustellen, ob sie einen öffentlichen Schlüssel oder einen privaten Schlüssel enthält?Wie kann ich feststellen, ob eine .pem-Datei einen öffentlichen oder privaten Schlüssel enthält?

Wie in this StackOverflow question erläutert, kann ein .pem beides enthalten.

Da der Inhalt der Datei juste verstümmelt base64 ist, wenn ich ein .pem-Zertifikat an eine andere Maschine senden möchte, möchte ich sicherstellen, dass ich den öffentlichen Schlüssel exportieren und nicht meinen privaten Schlüssel ausgeben.

Antwort

1

Ich habe eine .pem-Datei (base64-codierte Kryptographie-Informationen). Welche OpenSSL-Befehlszeile sollte ich verwenden, um festzustellen, ob sie einen öffentlichen Schlüssel oder einen privaten Schlüssel enthält?

Im Allgemeinen müssen Sie die erste Zeile der PEM-Datei überprüfen, um festzustellen, was vorhanden ist.

OpenSSL kann eine Teilmenge der verfügbaren codierten Dinge erkennen (aus Mangel an einem besseren Begriff). Sie können die Liste der OpenSSL-Komponenten anzeigen, indem Sie <openssl src>/crypto/pem/pem.h untersuchen. Aus der Datei:

#define PEM_STRING_X509_OLD "X509 CERTIFICATE" 
#define PEM_STRING_X509  "CERTIFICATE" 
#define PEM_STRING_X509_PAIR "CERTIFICATE PAIR" 
#define PEM_STRING_X509_TRUSTED "TRUSTED CERTIFICATE" 
#define PEM_STRING_X509_REQ_OLD "NEW CERTIFICATE REQUEST" 
#define PEM_STRING_X509_REQ "CERTIFICATE REQUEST" 
#define PEM_STRING_X509_CRL "X509 CRL" 
#define PEM_STRING_EVP_PKEY "ANY PRIVATE KEY" 
#define PEM_STRING_PUBLIC "PUBLIC KEY" 
#define PEM_STRING_RSA  "RSA PRIVATE KEY" 
#define PEM_STRING_RSA_PUBLIC "RSA PUBLIC KEY" 
#define PEM_STRING_DSA  "DSA PRIVATE KEY" 
#define PEM_STRING_DSA_PUBLIC "DSA PUBLIC KEY" 
#define PEM_STRING_PKCS7 "PKCS7" 
#define PEM_STRING_PKCS7_SIGNED "PKCS #7 SIGNED DATA" 
#define PEM_STRING_PKCS8 "ENCRYPTED PRIVATE KEY" 
#define PEM_STRING_PKCS8INF "PRIVATE KEY" 
#define PEM_STRING_DHPARAMS "DH PARAMETERS" 
#define PEM_STRING_SSL_SESSION "SSL SESSION PARAMETERS" 
#define PEM_STRING_DSAPARAMS "DSA PARAMETERS" 
#define PEM_STRING_ECDSA_PUBLIC "ECDSA PUBLIC KEY" 
#define PEM_STRING_ECPARAMETERS "EC PARAMETERS" 
#define PEM_STRING_ECPRIVATEKEY "EC PRIVATE KEY" 
#define PEM_STRING_PARAMETERS "PARAMETERS" 
#define PEM_STRING_CMS  "CMS" 

Einige Dinge werden schwieriger sein als andere. Zum Beispiel ist es offensichtlich, was ein RSA PUBLIC KEY ist, aber es ist nicht so offensichtlich, was ein PUBLIC KEY ist. In diesem Fall machst du eines von zwei Dingen. Zuerst decodieren Sie ASN.1/DER und suchen dann nach ihrer OID, falls verfügbar. Zweitens versuchen Sie, in eine Datenstruktur zu laden, die Sie erwarten, dass die Sache ist.

Als Beispiel für die zweite Strategie würden Sie versuchen, ein PEM-Blob in einen privaten RSA-Schlüssel mit PEM_read_bio_RSAPrivateKey zu laden. Wenn es gelingt, dann ist es ein privater RSA-Schlüssel. Wenn es fehlschlägt, kann es sich um einen beschädigten privaten RSA-Schlüssel oder einen privaten EC-Schlüssel handeln, oder es ist möglicherweise kein PEM-Blob.


Im Jahr 2006 wurde ein Antrag gestellt, die Namen der Dinge mit der PKIX-Arbeitsgruppe zu standardisieren. Es stieß innerhalb der IETF auf taube Ohren. Siehe PEM file format rfc draft request. (? Alle)

2

Als eine praktische Annäherung, die meisten menschlichen Fehler, die ich würde empfehlen, nur file und grep fangen sollte:

(file $KEYFILE | grep -i private >/dev/null) && echo Private || echo Public-or-unknown 

Um einige Schlüsselmaterial Bildschirm, bevor es erlischt:

for f in *; do (file $f | grep -i private >/dev/null) && file $f; done 

Leere Ausgabe = hoffentlich keine Geheimnisse, kann weitergehen.

Verwandte Themen