Tôi có khóa id_rsa.pub được tạo bởi ssh-keygen. Làm cách nào để chuyển đổi các tệp id_rsa.pub thành các khóa được định dạng RSA DER theo chương trình?Chuyển khóa công cộng RSA thành RSA DER
Trả lời
Nếu bạn sử dụng ssh-keygen để tạo ra một chìa khóa:
$ ssh-keygen
Sau đó, bạn chỉ có thể sử dụng openssl để kéo ra khóa công khai và viết nó trong định dạng DER như thế này:
$ openssl rsa -in id_rsa -out pub.der -outform DER -pubout
writing RSA key
Bạn có thể xem đầu ra DER như PEM như thế này:
$ openssl rsa -in pub.der -inform DER -pubin -text
tôi không sử dụng Ruby, vì vậy tôi không biết làm thế nào dễ dàng là để sử dụng OpenSSL từ Ruby.
Chỉnh sửa: Tôi đã trả lời quá nhanh - bạn đã viết id_rsa.pub và bạn có thể không có chính id_rsa. Một câu hỏi Stack Overflow khác là chuyển đổi ngược, nhưng mã nguồn được tìm thấy ở đó có thể giúp: Convert pem key to ssh-rsa format Khi bạn có PEM, bạn có thể sử dụng openssl để chuyển đổi PEM thành DER.
Chỉnh sửa, tháng 5 năm 2014: Ruby đã trở thành ngôn ngữ lập trình yêu thích của tôi và câu hỏi gốc (kể từ khi được chỉnh sửa) hỏi về Ruby. Dưới đây là code để đọc id_rsa.pub (public key) và viết một OpenSSL tạo, DER định dạng khóa công khai:
require 'openssl'
require 'base64'
def read_length(s)
# four bytes, big-endian
length = s[0..3].unpack('N')[0]
end
def read_integer(s, length)
# shift all bytes into one integer
s[4..3 + length].unpack('C*').inject { |n, b| (n << 8) + b }
end
def cut(s, length)
s[4 + length..-1]
end
def decode_pub(pub)
# the second field is the Base64 piece needed
s = Base64.decode64(pub.split[1])
# first field reading "ssh-rsa" is ignored
i = read_length(s)
s = cut(s, i)
# public exponent e
i = read_length(s)
e = read_integer(s, i)
s = cut(s, i)
# modulus n
i = read_length(s)
n = read_integer(s, i)
[ e, n ]
end
def make_asn1(e, n)
# Simple RSA public key in ASN.1
e0 = OpenSSL::ASN1::Integer.new(e)
n1 = OpenSSL::ASN1::Integer.new(n)
OpenSSL::ASN1::Sequence.new([ e0, n1 ])
end
pub = File.read('id_rsa.pub')
asn1 = make_asn1(*decode_pub(pub))
# Let OpenSSL deal with converting from the simple ASN.1
key = OpenSSL::PKey::RSA.new(asn1.to_der)
# Write out the public key in both PEM and DER formats
File.open('id_rsa.pem', 'w') { |f| f.write key.to_pem }
File.open('id_rsa.der', 'w') { |f| f.write key.to_der }
Bạn có thể kiểm tra đầu ra với các lệnh openssl trong vỏ:
$ openssl rsa -pubin -text -in id_rsa.pem
$ openssl rsa -pubin -text -inform DER -in id_rsa.der
Nếu bạn chỉ có quyền truy cập vào các khóa công khai được tạo ra bởi ssh-keygen, và muốn chuyển nó sang định dạng der, các công việc sau:
ssh-keygen -f id_rsa.pub -e -m PKCS8 | openssl pkey -pubin -outform DER
Thị s sử dụng đầu tiên ssh-keygen
để chuyển đổi khóa sang định dạng PEM PKCS8, sau đó sử dụng openssl pkey
để chuyển đổi thành định dạng DER.
(Điều này hoàn thành tương tự như câu trả lời của Jim Flood nhưng không chạm vào tệp khóa riêng tư.)
Anh ấy nói * "Làm thế nào tôi có thể chuyển đổi các tập tin id_rsa.pub thành các khóa được định dạng RSA DER theo lập trình?" *. Anh ta không yêu cầu các lệnh để làm điều đó. – jww
Plus, không hoạt động trên tất cả các bản phân phối –
Giải pháp tốt, cảm ơn bạn! –