はじめに
個人番号カード(マイナンバーカード)を早い段階で入手していたので、
OpenSSHでログインするために利用したいと思っていたのだが、
NetBSD上でのOpenSCなどの使い方が理解できずに放っておいてしまっていた。
ICカードリーダーを確定申告でしか使わないのはもったいないので、再度挑戦して、それなりに使えたので書いておく。
使っているICカードリーダーは、Gemalto (VID: 0x08e6)の接触式SmartCard Reader PC USB-TR (PID: 0x0307)である。
また、NetBSDは、NetBSD/amd64 9.99.8である。
ソフトウェアの準備
pkgsrcを使って以下のようにインストールする。
# cd /usr/pkgsrc/security/opensc
# make install
# cd /usr/pkgsrc/security/ccid
# make install
過去に試した際には
security/ccidをインストールしていなかったので、
pcscdでICカードを認識させられなかったようだ。
他にはNetBSD baseの
ssh-keygenと
sshコマンドを利用する。
公開鍵の抽出とログイン
マイナンバーカードでSSHするの記事には、あまり詳しい操作方法が書かれたいないのだが、
man pageなどを読んでみると、pcscdを起動しておくことが必要だと分かった。
ただし、初回はpkgsrc/security/ccidをインストールしていなかったので、/etc/rc.d/pcscdから起動させても
メッセージを見ることができないのもあって、状況が把握できなかった。
infoレベルでメッセージを出しつつ、フォアグラウンドでpcscdを実行してみた。
ICカードリーダーを接続した上で、以下のように起動させる。
# /usr/pkg/sbin/pcscd -f --info
その上で個人番号カードを
ICカードリーダーに挿入すると、以下のように認識された。
00000124 Card ATR: 3B E0 00 FF 81 31 FE 45 14
元記事によると、以下のように実行することで利用者証明電子証明書の公開鍵をOpenSSHで使える形式で抽出できるはずであった。
$ pkcs15-tool --read-ssh-key 1 > id_rsa.pub
だが、以下のようにデコードすべきデータが取得できないためかエラーとなり抽出できない。
$ pkcs15-tool --read-ssh-key 1 > id_rsa.pub
Using reader with a card: Gemalto PC Twin Reader (6C55990E) 00 00
Public key enumeration failed: Required ASN.1 object not found
同じことをDebian GNU/Linux 10のOpenSCで試しても同じエラーになるし、Debian GNU/Linux 10で同じpkgsrcのOpenSCを使っても同じエラーになるので、
私の個人番号カードがそういう仕様なのか、OpenSCの方が変わったのかもしれない。
検索してみると、
ssh-keygenコマンドもSmartCardを扱えるようなので、以下のように実行してみた。
これによって、4行のテキストファイルとして、OpenSSH形式の公開鍵を抽出できた。
$ ssh-keygen -D /usr/pkg/lib/opensc-pkcs11.so > mynum.pub
Enter PIN for 'User Authentication PIN (JPKI)':
Enter PIN for 'Digital Signature PIN (JPKI)':
私は電子署名用の鍵は使う予定はないのだが、なぜかそれ用のパスワードも入力させられてしまった。
この4つの公開鍵のうち、利用したいものは1行目のみであったので、それをログイン先の
~/.ssh/authorized_keysに追記しておく。
その上で以下のように実行すれば良い。
$ ssh -I /usr/pkg/lib/opensc-pkcs11.so REMOTEHOST
Enter PIN for 'User Authentication PIN (JPKI)':
Enter PIN for 'Digital Signature PIN (JPKI)':
やはり、電子署名用の鍵のパスワードも必要になってしまう。