Ssh-keygenによって生成されたid_rsa.pubキーがあります。 id_rsa.pubファイルをRSADER形式のキーにプログラムで変換するにはどうすればよいですか?
Ssh-keygenを使用してキーを生成する場合:
$ ssh-keygen
次に、opensslを使用して公開鍵を引き出し、次のようにDER形式で書き込むことができます。
$ openssl rsa -in id_rsa -out pub.der -outform DER -pubout
writing RSA key
DER出力は次のようにPEMとして表示できます。
$ openssl rsa -in pub.der -inform DER -pubin -text
私はRubyを使用していないので、RubyからOpenSSLを使用するのがどれほど簡単かわかりません。
編集:私はあまりにも早く答えました-あなたはid_rsa.pubを書きました、そしてあなたはid_rsa自体を持っていないかもしれません。別のスタックオーバーフローの質問は逆変換に関するものですが、そこで見つかったソースコードが役立つ場合があります: pemキーをssh-rsa形式に変換 PEMを取得したら、opensslを使用してPEMをDERに変換できます。
編集、2014年5月: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
Ssh-keygenによって生成された公開鍵にのみアクセスでき、それをDER形式に変換する場合は、次のように機能します。
ssh-keygen -f id_rsa.pub -e -m PKCS8 | openssl pkey -pubin -outform DER
これは、最初にssh-keygen
を使用してキーをPKCS8PEM形式に変換し、次にopenssl pkey
を使用してそれをDER形式に変換します。
(これにより、Jim Floodの回答と同じことが達成されますが、秘密鍵ファイルには触れません。)