2015-02-17 12 views
7

Mam plik .pem (informacje o kryptografii zakodowane w 64-bitach). Jakiej linii poleceń OpenSSL powinienem użyć, aby wykryć, czy zawiera on klucz publiczny czy klucz prywatny?Skąd wiadomo, czy plik .pem zawiera klucz publiczny czy prywatny?

Jak wyjaśniono w this StackOverflow question, .pem może zawierać oba.

Ponieważ zawartość pliku jest po prostu zniekształcona base64, podczas wysyłania certyfikatu .pem na inny komputer, chciałbym się upewnić, że eksportuję klucz publiczny i nie wydaję mojego klucza prywatnego.

Odpowiedz

1

Mam plik .pem (informacje kryptograficzne zakodowane na podstawie 64). Jakiej linii poleceń OpenSSL powinienem użyć, aby wykryć, czy zawiera on klucz publiczny czy klucz prywatny?

Ogólnie rzecz biorąc, należy sprawdzić pierwszą linię pliku PEM, aby określić, co jest obecne.

OpenSSL może wykryć podzbiór dostępnych zakodowanych rzeczy (z powodu braku lepszego terminu). Możesz zobaczyć listę tego, co OpenSSL może dekodować, badając <openssl src>/crypto/pem/pem.h. Z pliku:

#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" 

Niektóre rzeczy będą trudniejsze niż inne. Na przykład, jest oczywiste, co to jest, ale nie jest tak oczywiste, co to jest PUBLIC KEY. W takim przypadku robisz jedną z dwóch rzeczy. Najpierw ASN.1/DER dekoduje obiekt, a następnie sprawdza jego OID, jeśli jest dostępny. Po drugie, próbujesz załadować do struktury danych, której oczekujesz.

Jako przykład drugiej strategii, próbujesz załadować element blob PEM do klucza prywatnego RSA z numerem PEM_read_bio_RSAPrivateKey. Jeśli się powiedzie, to jest klucz prywatny RSA. Jeśli się nie powiedzie, może to być uszkodzony prywatny klucz RSA lub klucz prywatny WE, lub nie może to być blob PEM.


W 2006 r. Złożono wniosek o standaryzację nazw rzeczy za pomocą grupy roboczej PKIX. Wewnątrz IETF padł głuchy. Zobacz PEM file format rfc draft request. (? Wszystko)

2

Jako praktyczny zbliżenia, które powinno złapać najbardziej ludzkie błędy Polecam tylko file i grep:

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

Do przeszukiwania jakąś kluczową materiał zanim zgaśnie:

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

Pusty wynik = mam nadzieję, że nie ma tajemnic, może kontynuować.

Powiązane problemy