Làm cách nào để chuyển đổi khóa công khai ssh-keygen thành định dạng hàm opensl PEM_read_bio_RSA_PUBKEY () sẽ tiêu thụ?


49

Tôi đang gặp sự cố khi tạo khóa công khai mà PEM_read_bio_RSA_PUBKEY()hàm openssl có thể sử dụng. Tôi cứ bị lỗi.

Rõ ràng tôi không thể đơn giản sử dụng chuỗi ASCII trong ssh-keygen <>.pubtệp chính vì nó ở định dạng tệp SSH hoặc có lẽ tôi có SubjectPublicKeyInfocấu trúc.

Đây là mã gen chính: ssh-keygen -t rsa -b 1024 -C "Test Key"

Tôi đã tìm thấy một trình chuyển đổi bằng php trên web, nó sẽ chuyển đổi nội dung của khóa chung thành định dạng chuỗi PEM ASCII cơ sở64. Tuy nhiên chức năng vẫn không thích nó.

Tài liệu Openssl nêu rõ:

  1. Hàm RSA_PUBKEY () xử lý khóa chung bằng cấu trúc EVP_PKEY
  2. Các chức năng của RSA_PUBKEY cũng xử lý khóa công khai RSA bằng cấu trúc RSA

Làm cách nào để có được khóa công khai OpenSSH của tôi thành một trong hai định dạng mà hàm OpenSSL sẽ sử dụng nó?


Chỉ ra điều này: chỉ sử dụng công cụ openssl như sau:
PeteP

Tạo khóa riêng: openssl genrsa -out test.priv.key 2048; Đầu ra Khóa công khai có cùng định dạng (PEM?): Openssl rsa -in test.priv.key -pubout -out test.pub.key
PeteP

Câu trả lời:


56

ĐỒNG Ý!

Vì vậy, tôi bước vào suy nghĩ này "Dễ thôi, tôi hiểu rồi." Hóa ra có rất nhiều thứ hơn nó nghĩ.

Vì vậy, vấn đề đầu tiên là (theo các trang man cho OpenSSL (man 3 pem)), OpenSSL đang mong đợi khóa RSA có định dạng PKCS # 1. Rõ ràng đây không phải là những gì ssh-keygen đang làm việc với. Bạn có hai lựa chọn (từ tìm kiếm xung quanh).

Nếu bạn có OpenSSH v. 5.6 trở lên (tôi không có trên máy tính xách tay của mình), bạn có thể chạy nó:

ssh-keygen -f key.pub -e -m pem

Phương pháp dài hơn để thực hiện việc này là tách khóa SSH của bạn thành các thành phần khác nhau ( mục blog tôi đã tìm thấy một số điều này để buộc tội OpenSSH là "độc quyền", tôi thích gọi nó là "duy nhất") và sau đó sử dụng thư viện ASN1 để trao đổi những thứ xung quanh.

May mắn cho bạn, ai đó đã viết mã để làm điều này:

https://gist.github.com/1024558


9
Các ssh-keygenphương pháp dường như làm việc trên Linux nhưng không phải Mac OS X.
nắp

3
Nắp, xem ghi chú trong câu trả lời về phiên bản SSH. OS X không phát hành phiên bản OpenSSH gần đây. Chạy lệnh ssh -V.
Brian Redbeard

3
Không làm việc trong OpenSSH_6.2p2. Có làm việc trong OpenSSH_6.6p1.
Old Pro

-mkhông làm việc cho tôi ... công việc xung quanh là gì?
pstanton

2
Làm việc cho tôi trên mac!
Greg Hornby

18

Giả sử bạn có khóa riêng SSH id_rsa, bạn có thể trích xuất khóa chung từ đó như sau:

openssl rsa -in id_rsa -pubout -out id_rsa.pub.pem

Tôi nhận ra OP đã hỏi về việc chuyển đổi khóa công khai, vì vậy điều này không hoàn toàn trả lời câu hỏi, tuy nhiên tôi nghĩ rằng dù sao nó cũng sẽ hữu ích với một số người.

Cũng lưu ý rằng lệnh này dẫn đến định dạng khóa công khai PEM, thường là những gì OpenSSL mong đợi. Câu trả lời của Brian, mặt khác, dẫn đến một tệp ở định dạng RSAPublicKey, không phải là định dạng bình thường mà OpenSSL mong đợi (mặc dù các phiên bản sau này rõ ràng có thể đọc nó qua -RSAPublicKey_incờ). Để chuyển đổi bạn có thể làm điều này:

openssl rsa -RSAPublicKey_in -in id_rsa.rsapub.pem -pubout -out id_rsa.pub.pem

Cảm ơn, -pubout từ khóa riêng đã lừa tôi.
Shaun Dewberry

openssl rsa -in id_rsa.pem -pubout -out id_rsa.pub.pemcũng hoạt động (tức là đầu vào là khóa riêng định dạng pem). Câu trả lời tốt.
Johnny Wong

1
Cập nhật: Câu trả lời của Brian đã được sửa chữa -m pkcs8, mặc dù những người OpenSSH sử dụng tên sai sẽ tạo ra X.509 'PUBKEY'. Ngoài ra, kể từ OpenSSH 6.5 vào năm 2014-01 nếu người tạo chỉ định 'định dạng mới' -ođể bảo mật tốt hơn, phương thức này sẽ không hoạt động và kể từ 7.8 năm 2018-08 'định dạng mới' hiện là mặc định, ditto.
dave_thndry_085

11

Các định dạng bạn muốn là những gì ssh-keygengọi PKCS8. Vì vậy, lệnh sau sẽ tạo ra đầu ra mong muốn:

ssh-keygen -f key.pub -e -m pkcs8

Từ ssh-keygentrang người đàn ông:

-m key_format
         Specify a key format for the -i (import) or -e (export) conversion 
         options.  The supported key formats are: 
         ``RFC4716'' (RFC 4716/SSH2 public or private key), 
         ``PKCS8'' (PEM PKCS8 public key) or 
         ``PEM'' (PEM public key).  
         The default conversion format is ``RFC4716''.

Cái này thực sự hoạt động trên cả Linux và macOS.
Jay Taylor

để trích xuất khóa công khai được tạo tương đương từ khóa riêng trong OpenSSL openssl rsa -in key -pubout -out key.pub.openssl.pkcs8
Mohannd

6

Tương tự như phương pháp của Amal Chaudhuri dưới đây, đây là cách làm việc với tôi. Tôi cần tạo một tệp pem từ khóa công khai ssh mà tôi đã tạo cho ứng dụng khách SFTP của mình (Cyberduck).

openssl rsa -in ~/.ssh/id_rsa -outform pem > id_rsa.pem

Điều này dường như không thực sự hoạt động.
bên ngoài2344

5
CHỈ này hoạt động cho khóa RSA riêng KHÔNG phải là khóa công khai mà OP đã yêu cầu. Vậy trả lời sai.
Devy

3
Trên thực tế, id_rsađã ở đúng định dạng, bạn có thể tự kiểm tra, kết quả id_rsa.pemlà giống hệt 100%.
Miro Kropacek

-2

Một cách khác để làm điều này từ một trang web khác. Đăng bài này trong trường hợp bạn cần một phương pháp khác. Hoạt động rất tốt. http://www.chatur.com.np/2011/01/convert-openssh-rsa-key-to-pem-format.html

openssl dsa -in ~/.ssh/id_dsa -outform pem > id_dsa.pem

Phương pháp đó dường như không thực sự hiệu quả.
Sean

7
id_rsakhông phải là một khóa công khai. Câu trả lời sai.
Ahmet Alp Balkan
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.