2015-02-17 16 views
7

Tôi có tệp .pem (thông tin mật mã được mã hóa base64). Tôi nên sử dụng dòng lệnh OpenSSL nào để phát hiện xem nó có chứa khóa công khai hay khóa riêng?Làm cách nào để biết tệp .pem có chứa khóa công cộng hoặc khóa riêng tư không?

Như được giải thích trong this StackOverflow question, a .pem có thể chứa cả hai.

Vì nội dung của tệp là juste bị cắt xén base64, khi gửi chứng chỉ .pem đến một số máy khác, tôi muốn đảm bảo rằng tôi đang xuất khóa công khai và không đưa ra khóa riêng của mình.

Trả lời

1

Tôi có tệp .pem (thông tin mã hóa được mã hóa base64). Tôi nên sử dụng dòng lệnh OpenSSL nào để phát hiện xem nó có chứa khóa công khai hay khóa riêng?

Nói chung, bạn phải kiểm tra dòng đầu tiên của tệp PEM để xác định nội dung hiện có.

OpenSSL có thể phát hiện tập con của những thứ được mã hóa sẵn có (vì thiếu thuật ngữ tốt hơn). Bạn có thể xem danh sách những gì OpenSSL có thể giải mã bằng cách kiểm tra <openssl src>/crypto/pem/pem.h. Từ tệp:

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

Một số điều sẽ khó khăn hơn những thứ khác. Ví dụ, rõ ràng những gì một RSA PUBLIC KEY là, nhưng nó không phải như vậy rõ ràng những gì một PUBLIC KEY là. Trong trường hợp này, bạn làm một trong hai điều. Đầu tiên, bạn ASN.1/DER giải mã và sau đó tra cứu OID nếu có. Thứ hai, bạn hãy thử và tải vào một cấu trúc dữ liệu mà bạn mong đợi.

Làm ví dụ về chiến lược thứ hai, bạn sẽ cố gắng tải một đốm màu PEM vào khóa riêng RSA với PEM_read_bio_RSAPrivateKey. Nếu thành công, thì đó là khóa riêng RSA của nó. Nếu nó không thành công, thì đó có thể là khóa riêng RSA bị hỏng, hoặc nó có thể là khóa riêng của EC hoặc nó có thể không phải là đốm màu PEM.


Năm 2006, một yêu cầu được thực hiện để chuẩn hóa tên của những thứ với nhóm làm việc PKIX. Nó rơi vào tai điếc bên trong IETF. Xem PEM file format rfc draft request. (? Tất cả)

2

Như một xấp xỉ thực tế rằng nên bắt hầu hết các sai lầm của con người tôi muốn giới thiệu chỉ filegrep:

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

Để sàng lọc một số tài liệu quan trọng trước khi nó đi ra ngoài:

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

Sản lượng trống = hy vọng không có bí mật, có thể tiến hành.

Các vấn đề liên quan