yubikeyでsshする with ECDSA key

Created: 2018/08/26
Last Update: 2019/04/17

yubikeyを使うと、sshの鍵をハードウエア的に安全に持ち運びできます。 Authentication(9a)スロットに、アルゴリズムをRSA(2048bit)にしているときは、普通にsshでopensc-pkcs11.soをモジュール指定すればよいのですが、 ECC(P-256)にした場合、署名はECDSA-SHA256となり、現在のデフォルトopensshではsmart card内の鍵としては認識されなくなります。

opensshにパッチを当てる

smart card内の証明書であっても、楕円暗号ECDSAに対応させるパッチのやり方が、 https://framkant.org/2015/11/openssh-ecdsa-keys-on-yubikey-smart-card/ で紹介されています。

リンク先のやり方で基本的にはうまく行きますが、現在のバージョンでは少しうまく行かない部分があるので、パッチを修正しました。 ecdsa.patch

Ubuntu 18.01 LTSでのコンパイルの方法

Ubuntu 18.01では、opensslのバージョンが1.1.0系になっており、openssh-7.8p1のそのままではコンパイルが通りません。 ここでは、システムとは別にopenssl 1.0.2系をコンパイルし、opensshのライブラリとして指定する方法でこれを回避します。


$ git clone https://github.com/openssl/openssl
$ cd openssl
$ git checkout OpenSSL_1_0_2p
$ ./config
$ make
$ sudo make install

$ wget ftp://ftp.riken.jp/pub/OpenBSD/OpenSSH/portable/openssh-7.8p1.tar.gz
$ tar xvf openssh-7.8p1.tar.gz
$ wget https://lithium03.info/yubikey/ecdsa.patch
$ cd openssh-7.8p1
$ patch -s < ../ecdsa.patch
$ ./configure --with-ssl-dir=/usr/local/ssl/
$ make
$ sudo make install

デフォルトの/usr/bin/ssh-keygenではなく、/usr/local/bin/ssh-keygenを呼び出すと、ecdsa-ssh2-nistp256の鍵が読み込めていることがわかります。


$ /usr/bin/ssh-keygen -D /usr/lib/x86_64-linux-gnu/opensc-pkcs11.so 
C_GetAttributeValue failed: 18
C_GetAttributeValue failed: 18
cannot read public key from pkcs11


$ /usr/local/bin/ssh-keygen -D /usr/lib/x86_64-linux-gnu/opensc-pkcs11.so
C_GetAttributeValue failed: 18
C_GetAttributeValue failed: 18
ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBKeT5lV60kIk2A3uwdPupRTlwFYqjteYwEubNc9+UtQRbUoqd41iyu5Pis8D5WI0Zxc/QNjlC8KgXiUyOp3Ect0=
ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBD00l6i4Q+870FeuY/cQMC4cAjKc1ZXdudszxNPflJniPN5ZoJ5FBGYhthgKTS6gLrAD0iZ2NUCvddT3PZafacE=

最後に、PKCS11Providerの指定をconfigに書き込んでおくと、git等でも利用できて便利です。

~/.ssh/config


Host *
 PKCS11Provider /usr/lib/x86_64-linux-gnu/opensc-pkcs11.so

内容について何か問題やご意見がございましたら、contact@lithium03.infoまで連絡ください。

トップへ戻る