Chuyển đổi chứng chỉ PKCS # 12 thành PEM bằng OpenSSL


212

Tôi có OpenSSL x64 trên Windows 7 mà tôi đã tải xuống từ openssl-for-windows trên Google Code . Tôi đang cố chạy:

openssl pkcs12 -export -in "path.p12" -out "newfile.pem" 

nhưng tôi gặp lỗi

unable to load private key

Làm cách nào để trích xuất chứng chỉ trong PEM từ cửa hàng PKCS # 12 bằng OpenSSL?


@jww Tôi nghĩ rằng câu hỏi này đã quá 3 tuổi và hơi muộn để báo hiệu cờ ngoài chủ đề.
Dean MacGregor

Chỉ là một hình thức để mọi người biết lạc đề của nó. Mọi người đang hỏi những câu hỏi ngoài chủ đề tương tự, và trích dẫn câu hỏi này. Nếu mọi người không nói với chủ đề ngoài chủ đề của họ, thì họ sẽ tiếp tục hỏi về Stack Overflow.
jww

2
@jww câu trả lời được bình chọn cao nhất cho câu hỏi meta mà bạn liên kết nói rằng "câu hỏi DevOps nên được cho phép trên Stack Overflow." Tôi sẽ nâng cao, vì câu trả lời đáp ứng nhu cầu của tôi (mặc dù, đối với tôi, tôi không lập trình, tôi có thể dễ dàng kết hợp câu trả lời trong một chương trình nếu tôi muốn)
dcorking

Câu trả lời:


534

Thử:

openssl pkcs12 -in path.p12 -out newfile.crt.pem -clcerts -nokeys
openssl pkcs12 -in path.p12 -out newfile.key.pem -nocerts -nodes

Sau đó, bạn có:

  • chứng chỉ trong newfile.crt.pem
  • khóa riêng trong newfile.key.pem

Để đặt chứng chỉ và khóa trong cùng một tệp, sử dụng như sau

openssl pkcs12 -in path.p12 -out newfile.pem

Nếu bạn cần nhập mật khẩu PKCS # 12 trực tiếp từ dòng lệnh (ví dụ: tập lệnh), chỉ cần thêm -passin pass:${PASSWORD}:

openssl pkcs12 -in path.p12 -out newfile.crt.pem -clcerts -nokeys -passin 'pass:P@s5w0rD'

2
Có thể khóa riêng và chứng chỉ sẽ được lưu trong cùng một tệp * .pem không?
Ramis

18
vâng, đó là:openssl pkcs12 -in path.p12 -out newfile.pem
Gee-Bee

2
yêu cầu nhập mật khẩu. đó là gì ?
Saurabh Chandra Patel

4
@SaurabhChandraPatel bạn phải biết mật khẩu cho chứng chỉ của mình. Đây không phải là một phương tiện để khôi phục mật khẩu đã quên
Dean MacGregor

2
bỏ qua -nodes, khóa riêng không được trích xuất.
Meixner

22

Bạn chỉ cần cung cấp một mật khẩu. Bạn có thể làm điều đó trong cùng một dòng lệnh với cú pháp sau:

openssl pkcs12 -export -in "path.p12" -out "newfile.pem" -passin pass:[password]

Sau đó, bạn sẽ được nhắc nhập mật khẩu để mã hóa khóa riêng trong tệp đầu ra của mình. Bao gồm tùy chọn "nút" trong dòng trên nếu bạn muốn xuất khóa riêng không được mã hóa (bản rõ):

openssl pkcs12 -export -in "path.p12" -out "newfile.pem" -passin pass:[password] -nodes

Thông tin thêm: http://www.openssl.org/docs/apps/pkcs12.html


16

Nếu bạn có thể sử dụng Python, thậm chí còn dễ dàng hơn nếu bạn có pyopensslmô-đun. Đây là:

from OpenSSL import crypto

# May require "" for empty password depending on version

with open("push.p12", "rb") as file:
    p12 = crypto.load_pkcs12(file.read(), "my_passphrase")

# PEM formatted private key
print crypto.dump_privatekey(crypto.FILETYPE_PEM, p12.get_privatekey())

# PEM formatted certificate
print crypto.dump_certificate(crypto.FILETYPE_PEM, p12.get_certificate())

Có bất kỳ lý do để mở tập tin bằng cách sử dụng filevà không open? Tôi chỉ muốn hiểu nó vì tôi sẽ sử dụng nó trong tương lai (để đơn giản hóa giải pháp của tôi bằng cách gọi openssh như lệnh)
Jan Vlcinsky

Không, không có sự khác biệt. Bạn chỉ có thể làm open("push.p12", 'rb').read().
KVISH

2
Nếu sử dụng python 3, có lẽ bạn sẽ muốn ghi nội dung vào tệp: with open("push.pem", "wb") as fobj: fobj.write(crypto.dump_certificate(crypto.FILETYPE_PEM, p12.get_certificate()))để viết chứng chỉ và with open("push.key", "wb") as fobj: fobj.write(crypto.dump_privatekey(crypto.FILETYPE_PEM, p12.get_privatekey()))cho khóa.
Adam Parkin

Tôi đang sử dụng python 3.7, khi chạy ví dụ trên, tôi nhận được thông tin sau: "TypeError: bộ khởi tạo cho ctype 'char' phải là một byte có độ dài 1, không phải str" Có gì đó không đúng với mật khẩu của tôi
getaglow

Tại sao việc tạo một tệp, nhập mã, lưu mã và chạy nó lại "dễ dàng hơn" - thay vì chỉ thực hiện một lệnh?
Torben Gundtofte-Bruun

3

Tôi đã có tệp PFX và cần tạo tệp KEY cho NGINX, vì vậy tôi đã làm điều này:

openssl pkcs12 -in file.pfx -out file.key -nocerts -nodes

Sau đó, tôi phải chỉnh sửa tệp KEY và xóa tất cả nội dung lên -----BEGIN PRIVATE KEY-----. Sau đó NGINX chấp nhận tệp KEY.


0

Nếu bạn cần một tệp PEM mà không cần bất kỳ mật khẩu nào, bạn có thể sử dụng giải pháp này .

Chỉ cần sao chép và dán khóa riêng và chứng chỉ vào cùng một tệp và lưu dưới dạng .pem.

Các tập tin sẽ trông như:

-----BEGIN PRIVATE KEY-----
............................
............................
-----END PRIVATE KEY-----
-----BEGIN CERTIFICATE-----
...........................
...........................
-----END CERTIFICATE-----

Đó là cách duy nhất tôi tìm thấy để tải chứng chỉ lên các thiết bị của Cisco cho HTTPS.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.