2010-07-01 9 views

ответ

28

Если вы используете SSH-кейген для генерации ключа:

$ ssh-keygen 

Тогда вы можете просто использовать OpenSSL, чтобы вытащить открытый ключ и записать его в формате DER, как это:

$ openssl rsa -in id_rsa -out pub.der -outform DER -pubout 
writing RSA key 

Вы можете просмотреть вывод МЭД, как PEM, как это:

$ openssl rsa -in pub.der -inform DER -pubin -text 

Я не использую рубин, так что я не знаю, как легко использовать OpenSSL от Ruby.

Редактировать: я ответил слишком быстро - вы написали id_rsa.pub, и у вас может не быть самого id_rsa. Другой вопрос переполнения стека - это обратное преобразование, но исходный код, который там найден, может помочь: Convert pem key to ssh-rsa format Как только вы используете PEM, вы можете использовать openssl для преобразования PEM в DER.

Редактировать, май 2014: Ruby стал моим любимым языком программирования, и оригинальный вопрос (с тех пор отредактированный) спросил о Ruby. Вот код для чтения id_rsa.pub (открытый ключ) и написать OpenSSL-генерируемый, DER-формате открытого ключа:

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 } 

Вы можете проверить вывод этих OpenSSL команд в оболочке:

$ openssl rsa -pubin -text -in id_rsa.pem 
$ openssl rsa -pubin -text -inform DER -in id_rsa.der 
+0

Хорошее решение, спасибо! –

2

Если у вас есть доступ только к открытому ключу, порожденного SSH-серийник, и хотите, чтобы преобразовать его в формат DER, следующие работы:

ssh-keygen -f id_rsa.pub -e -m PKCS8 | openssl pkey -pubin -outform DER

Thi s сначала использует ssh-keygen для преобразования ключа в PEMC-формат PKCS8, затем использует openssl pkey, чтобы преобразовать его в формат DER.

(Это выполняет то же самое, как ответ Джим Флад, но не касаясь файл закрытого ключа.)

+0

Он сказал * «Как я могу программно преобразовать файлы id_rsa.pub в форматированные ключи RSA DER?» *. Он не просил об этом команды. – jww

+0

Плюс, не работает на всех дистрибутивах –

Смежные вопросы