2011-03-11 6 views
20

SSH 키 쌍을 생성해야하는 Ruby/Rack 응용 프로그램에서 작업 중입니다. 응용 프로그램에서 ssh-keygen이라고 부르는만큼 Heroku에서 실행되도록 설계되었으므로 명령을 호출 할 수 없으므로 실행할 수 없습니다. , ssh-keygen없이 SSH 키 쌍 (개인/공개) 생성

key = OpenSSL::PKey::RSA.generate(2048) 
# => -----BEGIN RSA PRIVATE KEY----- .... 
key.public_key 
# => -----BEGIN RSA PUBLIC KEY----- .... 

불행하게도 RSA 공개 키와 SSH 공개 키가 동일한 것이 아니다 :

나는 다음과 같은 루비 표준 라이브러리에는 OpenSSL을 사용하여 공개/개인 RSA 키는 일을 얻을 수있었습니다 동일한 RSA 키로 생성 할 수 있습니다. SSH를 공개 키는 다음과 같은 :

ssh-rsa AAAAB3NzaC1yc2EAAAABIwA..... 

는 SSH 키를 생성하거나 ssh-keygen를 사용하지 않고 루비에 SSH를 RSA 키를 변환 할 수 있습니까?

답변

15

이 내가 예상했던 것보다 훨씬 더 복잡 밝혀졌습니다. 나는 그것을 끝내기 위해 SSHKey gem을 작성했다 (소스 코드 on GitHub). SSH 공개 키는 제공된 RSA 공개 키와 완전히 다른 방식으로 인코딩됩니다. SSH 키의 데이터 유형 인코딩은 # 5 RFC#4251 섹션에 정의되어 있습니다. 을 반환 - - "ssh-rsa" 또는

#to_blob 적절 "ssh-dss" 반환

#ssh_type :

1
key.public_key.to_pem 

키 암호화를 포함하는 전체 과정은 여기에 설명되어 있습니다 : http://stuff-things.net/2009/12/11/generating-rsa-key-pairs-in-ruby/

+0

OpenSSL :: PKey :: RSA # to_pem은 SSH 공개 키 형식으로 변환하지 않고 문자열 출력을 제공하는 것 같습니다. – bensie

+0

또한 단순히 "ssh-rsa"를 추가하고 문자열에 주석 구문을 추가하려고 시도했지만 동일한 것이 아니며 유효한 공개 키로 인식되지 않습니다. – bensie

25

그것은 두 가지 방법으로 net-ssh 라이브러리 패치 OpenSSL::PKey::RSA::DSA 문제를했을 때 케이스를하고 있지만 않았을 수 있습니다 OpenSSH 바이너리 형식의 공개 키. base64-encode하면 원하는 형식입니다.

require 'net/ssh' 

key = OpenSSL::PKey::RSA.new 2048 

type = key.ssh_type 
data = [ key.to_blob ].pack('m0') 

openssh_format = "#{type} #{data}" 
+2

이것은 정말 멋지고 간결한 해결책입니다. – sethvargo

+0

note, net/ssh는 원숭이 패치와 같이 꽤 큰 보석입니다. @ bensie의 답변은 훨씬 가벼운 접근 방식입니다. –