2010-07-01 36 views

Trả lời

28

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 
+0

Giải pháp tốt, cảm ơn bạn! –

2

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ư.)

+0

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

+0

Plus, không hoạt động trên tất cả các bản phân phối –

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