YubikeyのPIVを使ってsshしてみる
YubikeyのPIVが気になったのでsshでの使い方を試してみたメモ。 PIV自体については何もわからない。
Yubikeyとはこんな感じのもの。
Yubikey PIV Manager をここから落とす。
https://developers.yubico.com/yubikey-piv-manager/Releases/
webサイトでは、以下のコマンドラインツールを使って説明される。
ただし、macOS上では(たぶん他のOSでも)、ビルドが非常に面倒(./configureが成功してからが勝負)で、ビルドできたとしてもwebサイト通り使っても動作しないため、今回は使わない。 とはいえ、コマンドラインからしか指定できないオプションもあるため、なんとかはしたい。
現時点でのPIVに対する認識は、PKCS#11 で定義されたインターフェースを通じてデバイス内の秘密鍵(今回はYubikey内の秘密鍵)へアクセスし、認証を行うやつ、くらいです。
ここら辺を読むとPIVのプロになれるっぽい。
秘密鍵を生成する
PIV Manager → Certificates を選ぶ。
Authentication → Generate new key…
設定してOKをする
PIN(6〜8桁の文字)を入力する。
これでYubikeyの設定完了。
Export certificate… と Delete certifiacte… が選択できるようになる。
Exportした証明書をみてみるとこんな感じ。
❯ openssl x509 -in yubikey_piv.pem -text -noout Certificate: Data: Version: 3 (0x2) Serial Number: cd:6f:bb:37:07:b4:d0:7f Signature Algorithm: sha256WithRSAEncryption Issuer: CN=saso Validity Not Before: May 21 04:36:59 2017 GMT Not After : May 21 04:36:59 2018 GMT Subject: CN=saso Subject Public Key Info: Public Key Algorithm: rsaEncryption RSA Public Key: (2048 bit) Modulus (2048 bit): 00:95:6c:78:ac:c5:56:73:bb:73:9b:c8:fa:04:2f: 32:ad:95:1a:96:ae:4e:41:5a:8d:09:6a:c9:d9:0e: fb:2f:37:fc:9e:81:ac:91:59:9d:59:52:92:d4:d9: d2:38:96:a9:3d:ed:88:ad:ee:a3:fd:a4:84:de:71: 7f:ee:65:50:75:32:72:aa:75:c2:ca:95:2c:9e:a5: ca:4c:cd:0b:3b:0b:d1:f9:58:00:5d:aa:ce:ec:30: 4b:42:57:f0:ec:92:34:9b:67:96:f5:8d:79:13:8b: c9:bf:2e:a5:8c:99:58:34:43:15:8a:3b:76:88:45: b0:8f:da:52:bc:8c:73:fb:1c:cd:05:47:34:6a:bb: 47:09:e9:8a:a4:cf:bb:58:ae:a7:60:3b:1c:cc:93: 98:fd:b3:9c:67:ee:44:0d:ce:dc:6e:c4:31:fe:c7: c7:98:dc:9b:e2:e0:b5:88:da:2e:e5:20:3f:73:c5: 2d:b4:7b:86:71:d1:81:8b:9e:83:04:46:ad:84:83: 5e:41:53:75:ae:29:b2:b7:5a:33:22:0c:bf:fa:8d: a2:ae:52:05:ae:e2:55:7c:4b:ee:41:38:e8:48:19: 7c:67:c0:09:45:21:b5:ab:c0:aa:33:44:c0:28:4d: 6e:36:53:2a:e0:5e:af:5b:b3:d6:63:9a:84:7a:39: 2a:2d Exponent: 65537 (0x10001)
PIVを使ってsshする
Yubikey内の秘密鍵へアクセスするためには、OpenSCというオープンソースのPKCS#11の実装を使う。
以下のコマンドで公開鍵を読み出せる。
❯ ssh-keygen -D /usr/local/opt/opensc/lib/opensc-pkcs11.so -e ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCVbHisxVZzu3ObyPoELzKtlRqWrk5BWo0JasnZDvsvN/yegayRWZ1ZUpLU2dI4lqk97Yit7qP9pITecX/uZVB1MnKqdcLKlSyepcpMzQs7C9H5WABdqs7sMEtCV/DskjSbZ5b1jXkTi8m/LqWMmVg0QxWKO3aIRbCP2lK8jHP7HM0FRzRqu0cJ6Yqkz7tYrqdgOxzMk5j9s5xn7kQNztxuxDH+x8eY3Jvi4LWI2i7lID9zxS20e4Zx0YGLnoMERq2Eg15BU3WuKbK3WjMiDL/6jaKuUgWu4lV8S+5BOOhIGXxnwAlFIbWrwKozRMAoTW42UyrgXq9bs9ZjmoR6OSot
公開鍵をログインしたい.ssh/authrorized_keysに追加する。
❯ ssh -I /usr/local/opt/opensc/lib/opensc-pkcs11.so test@ub.local Enter PIN for 'PIV_II (PIV Card Holder pin)': Last login: Sun May 21 13:06:18 2017 from 192.168.56.1 test@ubuntu:~$
PINを入力することでログインできる。
まとめ
YubikeyがサポートしているPIVを使って見た。
GUIでぽちぽちやってるだけで、基本的な設定が可能で、秘密鍵を安全に管理可能なのはよさそう。 また、sshで使うために特別大変な手順もなくて良い。
PINの入力を無くし、Yubikeyのタッチに変えられるらしいし試したい。
一部で話題のkryptcoも同様の仕組みを使っているし、何か違いがあるのか比較してみたい。 kryptcoは、以下に詳しく説明されている。 qiita.com