Trích xuất khóa chung / riêng từ tệp PKCS12 để sử dụng sau này trong Xác thực SSH-PK


194

Tôi muốn trích xuất khóa chung và khóa riêng từ PKCS#12tệp của mình để sử dụng sau này trong SSH-Public-Key-xác thực.

Ngay bây giờ, tôi đang tạo khóa thông qua ssh-keygen mà tôi đặt vào .ssh/authorized_key, tương ứng ở đâu đó ở phía máy khách.

Trong tương lai, tôi muốn sử dụng các khóa từ một PKCS#12thùng chứa, vì vậy trước tiên tôi phải trích xuất khóa công khai PKCS#12và sau đó đưa chúng vào .ssh/authorized_keystệp. Có bất kỳ cơ hội để có được điều này làm việc thông qua openssl? Các khóa có PKCS#12tương thích với xác thực ssh-public-key không?

Câu trả lời:


282

Bạn có thể sử dụng các lệnh sau để trích xuất khóa chung / riêng từ bộ chứa PKCS # 12:

  • Khóa riêng PKCS # 1

    openssl pkcs12 -in yourP12File.pfx -nocerts -out privateKey.pem
    
  • Giấy chứng nhận:

    openssl pkcs12 -in yourP12File.pfx -clcerts -nokeys -out publicCert.pem
    

7
các lệnh hoạt động, nhưng khóa riêng được xuất dưới định dạng PKCS1 và tôi cần PKCS8 ... Có tùy chọn nào tôi thiếu để có được điều này không? Ví dụ: nó xuất '----- BEGIN RSA PRIVATE KEY -----' nhưng tôi cần '----- BEGIN PRIVATE KEY -----'
edthethird

4
Để làm điều đó bạn có thể thửopenssl rsa -in privateKey.pem -out private.pem
Francois

27
@edthethird: Để có PKCS8, hãy thêm cờ -nodes
Christopher K.

7
Để xuất mà không cần mật khẩu, thêm -passout pass:. Nó hy vọng tham số sẽ ở dạng vượt qua: mypassword. stackoverflow.com/a/27497899/206277
nidheeshdas 7/2/2016

2
@ChristopherK. cảm ơn! đó là một trong những tốt cho tôi thêm -nodeskhóa xuất chính xác
TecHunter 17/2/2017

85

Điều này là có thể với một chút chuyển đổi định dạng.

Để trích xuất khóa riêng ở định dạng openssh có thể sử dụng:

openssl pkcs12 -in pkcs12.pfx -nocerts -nodes | openssl rsa > id_rsa

Để chuyển đổi khóa riêng thành khóa chung:

openssl rsa -in id_rsa -pubout | ssh-keygen -f /dev/stdin -i -m PKCS8

Để trích xuất khóa công khai ở định dạng openssh có thể sử dụng:

openssl pkcs12 -in pkcs12.pfx -clcerts -nokeys | openssl x509 -pubkey -noout | ssh-keygen -f /dev/stdin -i -m PKCS8

2
Cảm ơn bạn! Dòng đầu tiên là dòng tôi cần. Chỉ là khóa, không được mã hóa, vì vậy nó có thể được cài đặt qua hầu hết các hệ thống tự động CDN.
BTC

1
@PhilipRego Tôi nghĩ bạn có nhầm lẫn khóa công khai và riêng tư. Khóa công khai RSA là hai giá trị, 'e' số mũ công khai và 'n' mô-đun - cả hai đều được lưu trữ dọc theo các phần riêng tư của khóa.
ryanc

16

OpenSSH không thể sử dụng các tệp PKCS # 12 trong hộp. Như những người khác đã đề xuất, bạn phải trích xuất khóa riêng ở định dạng PEM đưa bạn từ vùng đất của OpenSSL sang OpenSSH. Các giải pháp khác được đề cập ở đây không làm việc cho tôi. Tôi sử dụng OS X 10.9 Mavericks (10.9.3 vào lúc này) với các tiện ích đã được đóng gói sẵn của Google (OpenSSL 0.9.8y, OpenSSH 6.2p2).

Đầu tiên, trích xuất một khóa riêng ở định dạng PEM sẽ được OpenSSH sử dụng trực tiếp:

openssl pkcs12 -in filename.p12 -clcerts -nodes -nocerts | openssl rsa > ~/.ssh/id_rsa

Tôi thực sự khuyên bạn nên mã hóa khóa riêng bằng mật khẩu:

openssl pkcs12 -in filename.p12 -clcerts -nodes -nocerts | openssl rsa -passout 'pass:Passw0rd!' > ~/.ssh/id_rsa

Rõ ràng, viết mật khẩu văn bản đơn giản trên dòng lệnh cũng không an toàn, vì vậy bạn nên xóa lệnh cuối cùng khỏi lịch sử hoặc chỉ cần đảm bảo rằng nó không đạt được điều đó. Vỏ khác nhau có cách khác nhau. Bạn có thể tiền tố lệnh của bạn với không gian để ngăn không cho nó được lưu vào lịch sử trong Bash và nhiều shell khác. Đây cũng là cách xóa lệnh khỏi lịch sử trong Bash:

history -d $(history | tail -n 2 | awk 'NR == 1 { print $1 }')

Ngoài ra, bạn có thể sử dụng một cách khác nhau để chuyển mật khẩu khóa riêng cho OpenSSL - tham khảo tài liệu OpenSSL để biết các đối số cụm từ .

Sau đó, tạo khóa công khai OpenSSH có thể được thêm vào tệp ủy quyền:

ssh-keygen -y -f ~/.ssh/id_rsa > ~/.ssh/id_rsa.pub

Những | openssl rsathứ đó để làm gì?
Snekse

1
@Snekse nó đảm bảo chỉ có khóa riêng trong đầu ra. Trong trường hợp của tôi, nó tạo ra tệp nhận dạng ( ~/.ssh/id_rsa) với một số thuộc tính của cru cru giống như Bag Attribution mà không có `| openssl rsa`. Tôi đoán OpenSSH và các tiện ích khác sử dụng tệp nhận dạng có thể xử lý hành trình đó (tôi chưa thử), nhưng tôi chỉ đơn giản được sử dụng để chỉ cung cấp dữ liệu cần thiết và không có gì khác, đặc biệt là nếu đó là vấn đề bảo mật.
frzng

1
Câu trả lời này đã giúp tôi có được quyền truy cập vào khóa riêng định dạng PEM trong thiết bị đầu cuối mà tôi có thể sao chép / dán: openssl pkcs12 -in filename.p12 -clcerts -nodes -nocerts
BillyRayCyrus

7

Giải pháp 1:

Trích xuất P12 từ jks

keytool -importkeystore -srckeystore MyRootCA.jks -destkeystore MyRootCA.p12 -deststoretype PKCS12

Trích xuất PEM từ P12 và Chỉnh sửa tệp và pem từ tệp crt

openssl pkcs12 -in MyRootCA.p12 -clcerts -nokeys -out MyRootCA.crt

Trích xuất khóa từ jks

openssl pkcs12 -in MyRootCA.p12 -nocerts -out encryptedPrivateKey.pem
openssl rsa -in encryptedPrivateKey.pem -out decryptedPrivateKey.key

Giải pháp 2:

Trích xuất PEM và mã hóaPrivateKey vào tệp txt```

openssl pkcs12 -in MyRootCA.p12 -out keys_out.txt

Giải mã privateKey

openssl rsa -in encryptedPrivateKey.key [-outform PEM] -out decryptedPrivateKey.key

1
Khi trả lời các câu hỏi, nó giúp làm nổi bật các lệnh là gì. Bạn có thể làm điều đó bằng cách thêm ba backquote trước và sau lệnh để `` `echo hello``` trở thành echo hello.
PatS

2

Cập nhật: Tôi nhận thấy rằng câu trả lời của tôi chỉ là một bản sao kém của một câu hỏi được giải thích rõ trên https: //unix.stackexchange.com / ... của BryKKan

Đây là một trích từ nó:

openssl pkcs12 -in <filename.pfx> -nocerts -nodes | sed -ne '/-BEGIN PRIVATE KEY-/,/-END PRIVATE KEY-/p' > <clientcert.key>

openssl pkcs12 -in <filename.pfx> -clcerts -nokeys | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > <clientcert.cer>

openssl pkcs12 -in <filename.pfx> -cacerts -nokeys -chain | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > <cacerts.cer>

3
Thêm một số giải thích sẽ làm cho câu trả lời này hữu ích hơn.
mx0

0

Theo tôi biết PKCS # 12 chỉ là một kho lưu trữ chứng chỉ / khóa công khai / riêng tư. Nếu bạn trích xuất khóa công khai từ tệp PKCS # 12, OpenSSH sẽ có thể sử dụng nó miễn là nó được trích xuất ở định dạng PEM . Có lẽ bạn đã biết rằng bạn cũng cần một khóa riêng tương ứng (cũng trong PEM ) để sử dụng nó để xác thực khóa ssh-public-key.


0

Câu trả lời được chấp nhận là lệnh chính xác, tôi chỉ muốn thêm một điều nữa, khi giải nén khóa nếu bạn để "Enter PEM pass phrase:"trống mật khẩu PEM ( ) thì khóa hoàn chỉnh sẽ không được trích xuất mà chỉ trích xuấtlocalKeyID trích xuất. Để có được khóa hoàn chỉnh, bạn phải chỉ định mật khẩu PEM khi chạy lệnh sau.

Xin lưu ý rằng khi nói đến Nhập mật khẩu, bạn có thể chỉ định mật khẩu thực tế cho "Enter Import Password:"hoặc có thể để trống mật khẩu này:

openssl pkcs12 -in yourP12File.pfx -nocerts -out privateKey.pem

1
Đó phải là một nhận xét để trả lời được chấp nhận, không phải là câu trả lời.
Styx
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.