Apr 14, 2012

SSHとSSLとの間の鍵変換

■秘密鍵が有る場合
SSH秘密鍵=SSL鍵。
ssh-keygen -t rsa で鍵発行済み鍵は、SSL用の2048-bit RSA 秘密鍵となる。

SSL秘密鍵からSSH公開鍵を生成するには
ssh-keygen -f ssl_private_key_file -y > ssh.pub

SSH秘密鍵からSSL公開鍵を生成するには
openssl rsa -in ssh_private_key_file -pubout -out ssl.pub

■秘密鍵が無い場合
SSH公開鍵か、SSL certだけが有る場合は、より困難になる。
SSL certから、SSL公開鍵を抽出し、SSLと SSH公開鍵との交換が出来なけ
ればならない。

SSL certから、SSL公開鍵を抽出するには
openssl x509 -in cert_file -pubkey -noout > ssl.pub

第二段階は、より複雑。Debianでは以下の通り。

apt-get install lsh-utils

ssh-conv < ssh.pub | sexp-conv

もし、ssl.pub とssh.pubが同じ鍵を参照するなら、次の二つの出力は酷似し、明ら
かに相互変換可能な事が分かるだろう。
ssh-conv < ssh.pub | sexp-conv -s hex

openssl rsa -in ssl.pub -pubin -noout -text

スクリプト
sed -e'1d' -e'$d' < /tmp/test.pub | \
 pkcs1-conv --public-key-info --base-64 | \
 sexp-conv | \
 sed -e'1s/(rsa/(rsa-pkcs1-sha1/' | \
 sexp-conv -s transport

上記の出力は、次と同一である。
ssh-conv < ssh.pub | sexp-conv -s transport

而して、変換可能になった。フルパイプラインは
sed -e'1d' -e'$d' \< ssl.pub | \
 pkcs1-conv --public-key-info --base-64 | \
 sexp-conv | \
 sed -e'1s/(rsa/(rsa-pkcs1-sha1/' | \
 sexp-conv -s transport | \
    lsh-export-key --openssh > newssh.pub

備考
 上記はRSA鍵のみ。DSA鍵には使えない。
 また、悪い鍵に対する公開テストで、1024-bit RSA keyには使えない事が分かっ
ている。

  Debian "etch"システムで、レタータイプの鍵をつかっていたら、
 鍵を、2048-bit RSA に変えたほうが良い。

------------------------------------------------------
元ネタ

Converting keys between SSH and SSL (Mast Kalandar 2008/05/15)

Howto: Convert an OpenSSL key to a public/private OpenSSH key-pair (.bootstrap 2009/04/11)

How can I use the same key for SSH and SSL (https)  (serverfault.com 2010/02/18)

Convert keys between GnuPG, OpenSsh and OpenSSL (Sysmic.org  2010/03/24)

PKCS8秘密鍵→SSH2公開鍵変換ツール (kurushima @ 自堕落な技術者のヰキ(公開版))
> PKCS#8 RSA 秘密鍵(PINの無いもの)のPEM型式から
> SSH2公開鍵に変換したものをファイル出力するツールです。
//

No comments: