macOS Ubuntu FreeBSD に続いてCygwinとGit for Windowsでed25519-sk鍵タイプを試していきます。 GnuPGは2021-11-17現在-sk鍵タイプに対応していないので、YubiKeyのOpenPGPモジュールにてEd25519の認証鍵と署名鍵を作ってGitHubで使うための操作です。
1 2 |
$ uname -a CYGWIN_NT-10.0 gatherum 3.2.0(0.340/5/3) 2021-03-29 08:42 x86_64 Cygwin |
Contents
Windows: 調査
WindowsではPuTTYとPageantが広く使われていたので Cygwin や MSYS2 にも ssh-pageant という Pageant と Cygwin のソケット $SSH_AUTH_SOCK のプロキシがあります。さらにWSL, WSL2が登場してすごいことになっているようです。Windows についてる OpenSSH for Windows、WSLまたはWSL2, MSYS2, Cygwinです。使わないものまで一気にやると沼にはまりそうなので適当に。
- OpenSSH for Windows: OpenSSH_for_Windows_8.1p1, LibreSSL 3.0.2 (Windows 10 21H1 as of 2021-10-28)
- WSL, WSL2: 利用するディストロ次第。
- Git for Windows(MSYS2): OpenSSH_8.8p1, OpenSSL 1.1.1l 24 Aug 2021 (as of 2021-10-28)
- Cygwin: OpenSSH_8.8p1, OpenSSL 1.1.1l 24 Aug 2021 (as of 2021-10-28)
- Pageant: -sk 未対応 (as of 2021-11-17)
- gpg-agent: -sk 未対応 (as of 2021-11-17)
- KeePassXC: SSH Agent: Support OpenSSH 8.2 security key (FIDO/U2F) backed SSH keys -sk 対応済み。OpenSSH for Windows の ssh-agent とお話ししてくれるようですが、そちらが -sk に対応するまで使えないはず。
Cygwin: 準備
YubiKeyの選択の仕方は前置きをご覧ください。青いYubiKeyでもFIDO U2FかFIDO2の機能があれば使えるはずです。今回はfirmware 5.2.4の青いSecurity Keyシリーズで確認しています。5.2.3未満の場合はecdsa-skでお試しください。ecdsa-skはP-256楕円曲線だけなので使う理由があるのかは謎です。
各OpenSSHが使っているssh-agentのプロキシで頑張ると今回のように鍵タイプが増えた場合に使えないパスが出てきて悩みが増えそうなので、使うものに限定して ~/.ssh/ をjunctionで共有するにとどめることにします。
OpenSSH for Windows | %USERPROFILE% /.ssh |
Git for Windows(MSYS2) | %USERPROFILE% /.ssh |
Cygwin | (c:/cygwin64)/home/username/.ssh |
Gpg4win | %APPDATA%/gnupg ( HKCU/Software/GNU/GnuPG/HomeDir, $GNUPGHOME, gpgconf.ctl & gpgconf.exe) |
Git for Windows(MSYS2) | %USERPROFILE% /.gnupg |
Cygwin | (c:/cygwin64)/home/username/.gnupg |
1 2 3 4 5 |
$ sssss=$(cygpath "$USERPROFILE/.ssh") $ ln -s "$sssss" ~/.ssh $ ggggg=$(cygpath "$APPDATA/gnupg") $ ln -s "$ggggg" ~/.gnupg $ chmod go= ~/.ssh ~/.gnupg |
setup-x86_64.exe で openssh をインストールします。
1 2 3 4 5 6 7 8 9 |
$ ssh -V OpenSSH_8.8p1, OpenSSL 1.1.1l 24 Aug 2021 $ where ssh C:\cygwin64\bin\ssh.exe C:\Windows\System32\OpenSSH\ssh.exe $ /cygdrive/c/Windows/System32/OpenSSH/ssh -V OpenSSH_for_Windows_8.1p1, LibreSSL 3.0.2 |
libfido2がインストールされますが hid.dll 利用のためU2F, FIDO2を利用する際に権限の昇格が必要になります。
2022-10-03追記: 下の追記の通りopenssh-sk-winhello無しのlibfido2だけで権限の昇格不要になっています。
2021-11-22追記: libfido2にWindowsのWebAuthnライブラリ利用の変更が入っています。各パッケージが新しくなれば openssh-sk-winhello は不要になるかもしれません。
openssh-sk-winhelloの導入は不要になっています。ssh-keygenはワンショットなのでどうにかなりますが、sshするたびに権限を昇格させたり、ssh-agentはdaemonなので昇格させたまま動かしておくことになります。一方でOpenSSHにミドルウェアを置き換える仕組みも作りこまれていて、それを用いてlibfido2の代わりに権限の昇格不要なWebAuthnライブラリによる実装をしてくれた方がいます。UACのお世話にならないで済むのは非常にありがたいので利用させてもらいます。
Cygwin: 期待通りにならない場合は
openssh-sk-winhelloの導入は不要になっています。<strike>libfido2を通常のユーザ権限で使うとエラーメッセージを出してもらえないので何も起きていないように見えます。権限を昇格させるか、 openssh-sk-winhello の導入 のようにします。</strike>
一方で例えば2021-11-17現在だと以下のようなエラーが起きるかもしれません。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
$ ssh ::1 sign_and_send_pubkey: signing failed for ED25519-SK "/home/omnium/.ssh/id_ed25519_sk" from agent: agent refused operation $ ssh-add -D All identities removed. $ ssh -F /dev/null -i ~/.ssh/id_ed25519_sk -oSecurityKeyProvider=/usr/lib/winhello.dll ::1 Enter passphrase for key '/home/omnium/.ssh/id_ed25519_sk': Confirm user presence for key ED25519-SK SHA256:OsoK+0+MGGD5FrGmIBHwHVXEKJYlTLdML+5H4+6PJ/M ssh_msg_recv: read header: Software caused connection abort client_converse: receive: unexpected internal error C:/cygwin64/usr/sbin/ssh-sk-helper.exe: error while loading shared libraries: ?: cannot open shared object file: No such file or directory reap_helper: helper exited with non-zero exit status sign_and_send_pubkey: signing failed for ED25519-SK "/home/omnium/.ssh/id_ed25519_sk": unexpected internal error |
ssh-agentでエラーが起こっていてデバッグログを吐かせるにはssh-agentを起動しなおさないといけないので、先にssh単体ではどうなるのか確認してしまいます。同様にエラーとなりますが error while loading shared libraries: ?: cannot open shared object file: No such file or directory というどのライブラリがロードできないのかわからないつれないメッセージなので strace かけます。
1 2 3 4 5 6 7 8 |
$ strace /usr/sbin/ssh-sk-helper --- Process 2668 created --- Process 2668 loaded C:\Windows\System32\ntdll.dll at 00007ff8ab8d0000 ... --- Process 2668 loaded C:\cygwin64\bin\cygfido2-1.dll at 00000003fa040000 ... --- Process 2668 loaded C:\Windows\System32\msvcp_win.dll at 00007ff8a9050000 --- Process 2668 loaded C:\cygwin64\bin\cygz.dll at 00000003ff0d0000 |
というわけでlibfido2が使っているCBORライブラリが読めなくてエラーが発生しています。パッケージ作成時にバージョン条件の指定がないとかでしょうか。openssh-sk-winhello利用でlibfido2は使わない場合でもssh-sk-helperが起動できないのでエラーとなります。早々に解消されると思いますが今はサクッと setup-x86_64.exe でlibcborをダウングレードしてしまいます。
Cygwin: openssh-sk-winhello の導入
2022-10-03追記: 下の追記の通りopenssh-sk-winhelloの導入は不要になっています。ここはスキップしてください。
2021-11-22追記: 前記の通り libfido2 にWindowsのWebAuthnライブラリを使う変更が入っています。パッケージが更新されればこの手順は不要になるかもしれません。
releasesよりOpenSSHに合ったSource codeをダウンロードし、伸長展開します。README.mdのBuildの項を見てビルドしていきます。ビルド環境が出来上がっていない場合はエラーメッセージに応じてREADME.mdを参照に適宜パッケージを追加してください。
1 2 3 4 5 6 7 |
$ cd ~/tmp $ wget https://github.com/tavrez/openssh-sk-winhello/releases/download/v2.0.0/winhello-2.0.0.tar.gz $ tar xzvf winhello-2.0.0.tar.gz $ cd winhello-2.0.0 $ ./configure -v $ make $ make install |
/usr/lib/winhello.{dll,dll.a,la} がインストールされるので、.profileなり.xxxshrcなりCygwinなのでログインシェルだらけかと思うので気にせず適当なスクリプトで環境変数に設定します。
1 |
export SSH_SK_PROVIDER=/usr/lib/winhello.dll |
Cygwin: クライアント側
クライアント側を整えていきます。以下openssh-sk-winhelloを使用していますが、libfido2だけでも流れは同様です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
$ ssh-keygen -t ed25519-sk Generating public/private ed25519-sk key pair. You may need to touch your authenticator to authorize key generation. init_winhello: WARNING! This should not be like this! WinHello API Error: Is user available=0, User=0. Enter file in which to save the key (/home/omnium/.ssh/id_ed25519_sk): /home/omnium/.ssh/id_ed25519_sk already exists. Overwrite (y/n)? y Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in /home/omnium/.ssh/id_ed25519_sk Your public key has been saved in /home/omnium/.ssh/id_ed25519_sk.pub The key fingerprint is: SHA256:7wGoY7BrHGXtbdVzdZbaVp3WnViVEQN1BrMrpBODJfw omnium@gatherum The key's randomart image is: +[ED25519-SK 256]-+ | .. . .BB/| | .+ . X@| | . ..o.. =oo| | o .. E=o..+ | | .o ...S.o .oo | | .o .. oo . . | | ...+ . o | | oo . . . | | .. . | +----[SHA256]-----+ |
何もしないとSK_DEBUGが定義されていて警告が出ますが、32bit版のアプリケーションがWebAuthnを使ったときに起こるエラーに対するメッセージのようです。webブラウザでのWebAuthnでおなじみの雰囲気のダイアログが出ます。winhello.dllを呼び出した c:/cygwin64/usr/sbin/ssh-sk-helper.exe からと表示されています。
OKで進めるとFIDO2 PINを訊かれ、入力するとダイアログ及びピカピカ光ってタッチを要求されます。タッチすると鍵情報を保存するファイル名を訊かれます。入力すると鍵情報ファイルを暗号化するためのパスフレーズを訊かれます。このパスフレーズは-O residentを指定した場合のFIDO2(YubiKey)内の鍵情報には適用されません。あくまでもファイル(ここでは鍵ハンドルが格納されている~/.ssh/id_ed25519_sk)の暗号化のためのものです。またFIDO2の -O verify-required については後日検証にしてしまいます。今回は -O オプションの指定はしないで進行します。
Cygwin: ssh-agent
ssh-agentの情報の共有はsetxを使ってみます。お使いの$SHELLに合わせて .profile などのログインスクリプトに次のような記述を追加します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
ssh_sock_ok () { [ -n "$2" -a -S "$1" ] || return 1 ps -p "$2" >/dev/null || return 1 SSH_AUTH_SOCK="$1" ssh-add -l >/dev/null [ 2 -eq "$?" ] && return 1 return 0 } if ssh_sock_ok "$CYGSSH_AUTH_SOCK" "$CYGSSH_AGENT_PID"; then export SSH_AUTH_SOCK="$CYGSSH_AUTH_SOCK" export SSH_AGENT_PID="$CYGSSH_AGENT_PID" else mkdir -p "$HOME/tmp"; chmod go= "$HOME/tmp" eval $(TMPDIR="$HOME/tmp" ssh-agent) echo "Wait a moment..." setx CYGSSH_AUTH_SOCK "$SSH_AUTH_SOCK" setx CYGSSH_AGENT_PID "$SSH_AGENT_PID" # unsetx: reg delete HKCU\Environment /V CYGSSH_AUTH_SOCK /F # unsetx: reg delete HKCU\Environment /V CYGSSH_AGENT_PID /F fi |
時折 setx にえらい時間がかかりますが、こんな感じにしておけば Cygwin 以外のOpenSSHの邪魔をすることもなく複数minttyで使えるかと思います。
Cygwin: サーバ側
公開鍵をサーバまで持っていきログインするユーザの ~/.ssh/authorized_keys に追加、無ければ作成して追加します。
1 2 3 4 |
% mkdir -p ~/.ssh % chmod go= ~/.ssh % echo >>~/.ssh/authorized_keys % cat id_ed25519_sk.pub >>~/.ssh/authorized_keys |
設定はこれだけで、既に8.2以降のOpenSSHサーバが動いている場合はそのまま利用できるので接続までスキップしてください。
Cygwin: サーバも同じ機械で動かす
クライアントOSでわざわざsshdを自力でインストールして動かし続けるのを強くお勧めはしないので簡単に。
1 2 |
$ ssh-host-config ... |
hostキーや/etc/sshd_configを作成してくれます。メッセージをよく読んで進めます。サービスにはしないことをお勧めします。 /etc/sshd_config を適切に設定したのち、起動します。止め忘れないようにフォアグラウンドで動かします。
1 |
$ /usr/sbin/sshd -D |
別のminttyから確認します。何か大昔に書いたのを思い出しながら…
1 2 3 4 5 6 |
$ netstat -ano | fgrep ':22 ' TCP 0.0.0.0:22 0.0.0.0:0 LISTENING 21824 TCP [::]:22 [::]:0 LISTENING 21824 $ tasklist /svc | fgrep 21824 sshd.exe 21824 N/A |
Cygwin: 接続
接続です。
1 2 3 4 5 6 7 8 9 10 11 |
$ ssh -V OpenSSH_8.8p1, OpenSSL 1.1.1l 24 Aug 2021 $ ssh -i ~/.ssh/id_ed25519_sk -F /dev/null -oSecurityKeyProvider=/usr/lib/winhello.dll ::1 Enter passphrase for key '/home/omnium/.ssh/id_ed25519_sk': Confirm user presence for key ED25519-SK SHA256:OsoK+0+MGGD5FrGmIBHwHVXEKJYlTLdML+5H4+6PJ/M init_winhello: WARNING! This should not be like this! WinHello API Error: Is user available=0, User=0. User presence confirmed ... $ exit Connection to ::1 closed. |
まず鍵ハンドルファイルのパスフレーズを訊かれ、入力するとダイアログの表示とYubiKeyがピカピカし始めるので、タッチすればログインできます。続いてssh-agentを試します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
$ ps -elll | fgrep ssh- 5688 1 5688 8612 ? 197608 19:36:53 /usr/bin/ssh-agent $ ssh-add -l The agent has no identities. $ ssh-add ~/.ssh/id_ed25519_sk Enter passphrase for /home/omnium/.ssh/id_ed25519_sk: Identity added: /home/omnium/.ssh/id_ed25519_sk (omnium@gatherum) $ ssh-add -l 256 SHA256:OsoK+0+MGGD5FrGmIBHwHVXEKJYlTLdML+5H4+6PJ/M omnium@gatherum (ED25519-SK) $ ssh -i ~/.ssh/id_ed25519_sk -F /dev/null ::1 Last login: Mon Nov 1 20:18:24 2021 from ::1 ... $ exit Connection to ::1 closed. |
ssh-add した際に訊かれたパスフレーズを最後に、あとはYubiKeyをタッチするように言われるだけです。署名は ssh-agent にお任せしたので ssh コマンドには SecurityKeyProvider を指定する必要がなくなります。あと WebAuthn ではタッチしなければいけない時にはWindowsのダイアログが出るので、わかりやすいです。
Git for Windows(MSYS2): 準備
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
$ uname -a MINGW64_NT-10.0-19043 delain 3.1.7-340.x86_64 2021-10-12 16:29 UTC x86_64 Msys $ ssh -V OpenSSH_8.8p1, OpenSSL 1.1.1l 24 Aug 2021 $ ldd /usr/lib/ssh/ssh-sk-helper.exe ntdll.dll => /c/WINDOWS/SYSTEM32/ntdll.dll (0x7ffe0bd70000) KERNEL32.DLL => /c/WINDOWS/System32/KERNEL32.DLL (0x7ffe09e10000) KERNELBASE.dll => /c/WINDOWS/System32/KERNELBASE.dll (0x7ffe09830000) ... msys-2.0.dll => /usr/bin/msys-2.0.dll (0x180040000) ... msys-fido2-1.dll => /usr/bin/msys-fido2-1.dll (0x4b48d0000) ... HID.DLL => /c/WINDOWS/SYSTEM32/HID.DLL (0x7ffe07d20000) $ where ssh C:\Program Files\Git\usr\bin\ssh.exe C:\Windows\System32\OpenSSH\ssh.exe |
Git for Windows: openssh-sk-winhello の導入
2021-11-22追記: 前記の通り libfido2 にWindowsのWebAuthnライブラリを使う変更が入っています。パッケージが更新されればこの手順は不要になるかもしれません。
Cygwin同様にlibfido2がhid.dllを使用しているので権限の昇格を不要にするためにopen-sk-winhelloを利用します。Install に書かれている通り releases からwinhello.dllをダウンロードします。デフォルトで /usr/lib か /usr/local/lib にある SKプロバイダしかロードされない ので、Cygwin同様に (C:/Program Files/Git)/usr/lib にコピーします。ここだけGit Bashを管理者権限で起動します。
1 2 3 4 5 6 7 |
$ cd /tmp $ curl -o winhello.dll --location 'https://github.com/tavrez/openssh-sk-winhello/releases/download/v2.0.0/winhello.dll' $ file winhello.dll winhello.dll: PE32+ executable (DLL) (console) x86-64, for MS Windows $ cp -p winhello.dll /usr/lib/ |
SKプロバイダーの指定はCygwinと同様にできるので、ssh-agentも合わせて同じように .bashrc あたりに記述します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
ssh_sock_ok () { [ -n "$2" -a -S "$1" ] || return 1 ps -p "$2" >/dev/null || return 1 SSH_AUTH_SOCK="$1" ssh-add -l >/dev/null [ 2 -eq "$?" ] && return 1 return 0 } export SSH_SK_PROVIDER=/usr/lib/winhello.dll if ssh_sock_ok "$MSYS2SSH_AUTH_SOCK" "$MSYS2SSH_AGENT_PID"; then export SSH_AUTH_SOCK="$MSYS2SSH_AUTH_SOCK" export SSH_AGENT_PID="$MSYS2SSH_AGENT_PID" else mkdir -p ~/tmp; chmod go= ~/tmp eval $(TMPDIR=~/tmp ssh-agent) echo "Wait a moment..." setx MSYS2SSH_AUTH_SOCK "$SSH_AUTH_SOCK" setx MSYS2SSH_AGENT_PID "$SSH_AGENT_PID" # unsetx: reg delete HKCU\Environment /V MSYS2SSH_AUTH_SOCK /F # unsetx: reg delete HKCU\Environment /V MSYS2SSH_AGENT_PID /F fi |
Git for Windows: クライアント側
以降は同様なのでざっくりと。ssh-keygenした後に ~/.ssh/id_ed25519_sk.pub の内容を GitHub にコピペしてます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 |
$ source ~/.bashrc Agent pid 830 Wait a moment... 成功: 指定した値は保存されました。 成功: 指定した値は保存されました。 $ echo $SSH_SK_PROVIDER /usr/lib/winhello.dll $ ssh-keygen -t ed25519-sk Generating public/private ed25519-sk key pair. You may need to touch your authenticator to authorize key generation. init_winhello: WARNING! This should not be like this! WinHello API Error: Is user available=0, User=0. Enter file in which to save the key (/c/Users/agonist/.ssh/id_ed25519_sk): Enter passphrase (empty for no passphrase): Enter same passphrase again: Passphrases do not match. Try again. Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in /c/Users/agonist/.ssh/id_ed25519_sk Your public key has been saved in /c/Users/agonist/.ssh/id_ed25519_sk.pub The key fingerprint is: SHA256:Cw7zl2c11/9b3UrSy26joNXvZdWnLAmOE3p1XIKrMVM agonist@delain The key's randomart image is: +[ED25519-SK 256]-+ | | | . | | E . . | | . o o ..| | o . S + = . =| | = o % = * .*| | + O * = = B| | o * . *o=o| | . .=Boo| +----[SHA256]-----+ ### add contents of ~/.ssh/id_ed25519_sk.pub to SSH keys on GitHub. $ ssh-add ~/.ssh/id_ed25519_sk Enter passphrase for /c/Users/agonist/.ssh/id_ed25519_sk: Identity added: /c/Users/agonist/.ssh/id_ed25519_sk (agonist@delain) $ ssh git@github.com PTY allocation request failed on channel 0 Hi fmrns! You've successfully authenticated, but GitHub does not provide shell access. Connection to github.com closed. |
ssh-agentがタッチを要求する際にWebAuthnだけではなくGit for Windowsのダイアログも出ますが、タッチで両方とも消えます。ssh-agentを使わない場合はsshコマンド用に SecurityKeyProvider /usr/lib/winhello.dll を ~/.ssh/config に書くか、 -o SecurityKeyProvider=/usr/lib/winhello.dll のように -o オプションで指定します。
GnuPG
OpenPGPモジュールだけで閉じた場合 FIDO U2Fモジュールは不要です。また前述のとおりgpg-agentがまだ-sk鍵タイプに対応していないため、-skを使う場合はgpg-agentをssh-agentの代替にできないです。以下昔ながらの使い方です。以降はOpenPGPモジュールを搭載していない青いSecurity Keyシリーズでは実施できません。
dev.yubico SSH authentication やそこからリンクされている Using Your YubiKey with OpenPGP そしてさらにそこからリンクされている YubiKey-Guide が主要な情報源です。主鍵、副鍵、それぞれ認証、署名、暗号化に使えたりとOpenPGPの仕組みに慣れてもややこしいです。
GnuPGをCygwinだけで使うということは今どきは無いはずなので、WindowsではGpg4winを使うのが簡単です。今回はインストールするのも面倒なのでPortableAppsのGPG Plugin Portableを利用させてもらいました。~/.gnupg の位置は前述のとおりです。
各ドキュメント、特にYubiKey-Guideは多岐にわたって詳細に書かれているので、どこをちゃんと読めばよいのかの一助に。
- 鍵の作成や保管はBitLockerを有効にしたUSBドライブやSDカード上でやればDislockerを使ってLinuxなどでもそのまま読めます。
- Pageantは不要です。設定でgpg-agentがPageantの代替になるので、Pageantを前提とするプログラムもPageant無しで動作します。ただしPageantもgpg-agentもまだ-sk鍵タイプには対応していません。
- gpg –export-ssh-key KEYID でOpenSSH用の公開鍵を出力できます。gpg-agent + MSYS2やCygwinならばssh-pageant、WSLならばweasel-pageantを動かして ssh-add -L するという手もあります。
- OpenPGPでやり取りする必要がある場合でもキーサーバーに登録する必要はないです。キーサイニングパーティーに参加しましょう(たぶんやってない)。
- RSA, ECDSA, Ed25519どれを使えばよいのかはセキュリティービットなどでググってください。Ed25519はセキュリティービット以外にもECDSAに存在するような弱点を気にして設計されているのでEd25519、firmwareが古くて使えない場合はRSA 4096ビット、としておけば良いかと思います。ECDSAならばP-521楕円曲線を使うのが良さそうですが、RSA 4096ビットでパフォーマンスが気になる場面に出会わないので使う理由がいまいち無いかもです。-skはともかくEd25519を扱えるOpenSSHは2014-01-30リリースの6.5以降なので、OpenSSHが理由でEd25519が選択できない場面は少なそうです。
GnuPG: 主鍵の新規作成
~/.gnupg (以下ではC:/Users/omnium/AppData/Roaming/gnupg) はシステムドライブのBitLockerが有効でない場合は BitLockerが有効なドライブからジャンクションを作成するとかEFSを有効にしておくなどで自衛します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
>c:\PortableApps\CommonFiles\GPG\bin\gpg --pinentry-mode loopback --expert --full-gen-key gpg (GnuPG) 2.2.32; Copyright (C) 2021 g10 Code GmbH This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. gpg: keybox'C:/Users/omnium/AppData/Roaming/gnupg/pubring.kbx'が作成されました ご希望の鍵の種類を選択してください: (1) RSA と RSA (デフォルト) (2) DSA と Elgamal (3) DSA (署名のみ) (4) RSA (署名のみ) (7) DSA (機能をあなた自身で設定) (8) RSA (機能をあなた自身で設定) (9) ECC と ECC (10) ECC (署名のみ) (11) ECC (機能をあなた自身で設定) (13) 既存の鍵 (14) カードに存在する鍵 あなたの選択は? 11 鍵ECDSA/EdDSAに認められた操作: Sign Certify Authenticate 現在の認められた操作: Sign Certify (S) 署名機能を反転する (A) 認証機能を反転する (Q) 完了 あなたの選択は? q |
YubiKeyのOpenPGPモジュールの鍵保管場所の数の関係で主鍵の「現在の認められた操作」をSignとCertifyにします。途中入力するパスフレーズはこの鍵を利用するときのパスフレーズです。主鍵と紐づけるメールアドレスは後から複数追加できますが、今回は簡単のためGitHubで使う場合はここでGitHub確認済みのメールアドレスを指定します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
ご希望の楕円曲線を選択してください: (1) Curve 25519 (3) NIST P-256 (4) NIST P-384 (5) NIST P-521 (6) Brainpool P-256 (7) Brainpool P-384 (8) Brainpool P-512 (9) secp256k1 あなたの選択は? 1 鍵の有効期限を指定してください。 0 = 鍵は無期限 <n> = 鍵は n 日間で期限切れ <n>w = 鍵は n 週間で期限切れ <n>m = 鍵は n か月間で期限切れ <n>y = 鍵は n 年間で期限切れ 鍵の有効期間は? (0) 鍵は無期限です これで正しいですか? (y/N) y GnuPGはあなたの鍵を識別するためにユーザIDを構成する必要があります。 本名: Fumiyuki Shimizu 電子メール・アドレス: fmsmz@aposke.com コメント: 次のユーザIDを選択しました: "Fumiyuki Shimizu <fmsmz@aposke.com>" 名前(N)、コメント(C)、電子メール(E)の変更、またはOK(O)か終了(Q)? o たくさんのランダム・バイトの生成が必要です。キーボードを打つ、マウスを動か す、ディスクにアクセスするなどの他の操作を素数生成の間に行うことで、乱数生 成器に十分なエントロピーを供給する機会を与えることができます。 gpg: C:/Users/omnium/AppData/Roaming/gnupg/trustdb.gpg: 信用データベースができました gpg: 鍵E88022FECFF571EEを究極的に信用するよう記録しました gpg: ディレクトリ'C:/Users/omnium/AppData/Roaming/gnupg/openpgp-revocs.d'が作成されました gpg: 失効証明書を 'C:/Users/abct/AppData/Roaming/gnupg/openpgp-revocs.d\0FC78A9B84618040A64404EDE88022FECFF571EE.rev' に保管しました。 公開鍵と秘密鍵を作成し、署名しました。 pub ed25519 2021-11-19 [SC] 0FC78A9B84618040A64404EDE88022FECFF571EE uid Fumiyuki Shimizu <fmsmz@aposke.com> |
主鍵出来上がりです。0FC7…. が主鍵のkey idで、途中の表示でも使われていますが尻尾の8バイト(16桁)や、4バイト(8桁)でも指定できます。今回は鍵数個しか作らないので8桁でも十分です。
続けます。なにやらgpgが突然日本語を話してくれなくなりました。
GnuPG: 認証用の副鍵の新規作成
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 |
>c:\PortableApps\CommonFiles\GPG\bin\gpg --pinentry-mode loopback --expert --edit-key CFF571EE gpg (GnuPG) 2.2.32; Copyright (C) 2021 g10 Code GmbH This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. Secret key is available. sec ed25519/E88022FECFF571EE created: 2021-11-19 expires: never usage: SC trust: ultimate validity: ultimate [ultimate] (1). Fumiyuki Shimizu <fmsmz@aposke.com> gpg> addkey Please select what kind of key you want: (3) DSA (sign only) (4) RSA (sign only) (5) Elgamal (encrypt only) (6) RSA (encrypt only) (7) DSA (set your own capabilities) (8) RSA (set your own capabilities) (10) ECC (sign only) (11) ECC (set your own capabilities) (12) ECC (encrypt only) (13) Existing key (14) Existing key from card Your selection? 11 Possible actions for a ECDSA/EdDSA key: Sign Authenticate Current allowed actions: Sign (S) Toggle the sign capability (A) Toggle the authenticate capability (Q) Finished Your selection? s Possible actions for a ECDSA/EdDSA key: Sign Authenticate Current allowed actions: (S) Toggle the sign capability (A) Toggle the authenticate capability (Q) Finished Your selection? a Possible actions for a ECDSA/EdDSA key: Sign Authenticate Current allowed actions: Authenticate (S) Toggle the sign capability (A) Toggle the authenticate capability (Q) Finished Your selection? q Please select which elliptic curve you want: (1) Curve 25519 (3) NIST P-256 (4) NIST P-384 (5) NIST P-521 (6) Brainpool P-256 (7) Brainpool P-384 (8) Brainpool P-512 (9) secp256k1 Your selection? 1 Please specify how long the key should be valid. 0 = key does not expire <n> = key expires in n days <n>w = key expires in n weeks <n>m = key expires in n months <n>y = key expires in n years Key is valid for? (0) Key does not expire at all Is this correct? (y/N) y Really create? (y/N) y We need to generate a lot of random bytes. It is a good idea to perform some other action (type on the keyboard, move the mouse, utilize the disks) during the prime generation; this gives the random number generator a better chance to gain enough entropy. sec ed25519/E88022FECFF571EE created: 2021-11-19 expires: never usage: SC trust: ultimate validity: ultimate ssb ed25519/B3549E2395351668 created: 2021-11-19 expires: never usage: A [ultimate] (1). Fumiyuki Shimizu <fmsmz@aposke.com> gpg> quit Save changes? (y/N) y |
主鍵で署名された認証用の副鍵が作成されました。まだYubiKeyが登場していませんがOpenSSHで利用する場合はここまでで一旦完了なので試します。主鍵が署名にも使えるので、GitHub用の鍵の準備も全部完了しています。省略しますがOpenPGPで秘密のやり取りをする場合は同様に[E]の副鍵を、これは1,2年の有効期限を付けて作成すればOKです。
1 2 |
>c:\PortableApps\CommonFiles\GPG\bin\gpg --export-ssh-key CFF571EE ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIKuPePuJoTLe+vmFJcUvm/16SJ/RXASODV3e/k2yYfxJ openpgp:0x95368 |
これをOpenSSHサーバ側の ~/.ssh/authorized_keys に追記します。GitHubのSSH keysに追加するのもこれです。
OpenSSHはGnuPGの鍵のことは知らないのでGnuPGの鍵でOpenSSH用に署名してくれるようにgpg-agentを設定します。やり方としては GPG4Win の gpg-agent を Pageant 機能を有効にして起動して、Cygwin, MSYS2, WSL側で Pageant と $SSH_AUTH_SOCK のプロクシを動作させる、あるいはCygwin, MSYS2, WSL側で ~/.gnupg を参照できるようにして gpg-agent を ssh-agent機能を有効にして起動する、となるかと思います。今回は好みで後者のやり方でGitHub用にGit for Windowsで使うという体でやってみますが、 ~/.gnupg を使うアプリケーションが複数バージョンになるので安全のためには前者のプロクシを使うやり方が良いかと思います。特にGnuPGはメジャーバージョンが異なるとデータベース形式が異なります。
GnuPG: Git for Windowsのgpg-agentを動かす
Windowsのコマンドプロンプトからジャンクションを作ります。
1 2 3 4 |
>cd \Users\omnium >mklink /J .gnupg AppData\Roaming\gnupg Junction created for .gnupg <<===>> AppData\Roaming\gnupg |
Git Bashを起動します。使っているといきなりlsがディレクトリが黒バックに青という過酷な視力検査を始めるので好みに合わせます。前景ではなくて背景を青にしてみます。(現在は青が薄紫になるGit Bash用のWindowsコンソールのプロファイルをインストール時に導入できるようになったようです。)
1 |
$ export LS_COLORS="di=00;44" |
それはともかくMSYS2のgpgで先ほど作成した鍵が見えることを確認します。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
$ which gpg /usr/bin/gpg $ gpg --version gpg (GnuPG) 2.2.29-unknown $ gpg --list-secret-keys /c/Users/abct/.gnupg/pubring.kbx -------------------------------- sec ed25519 2021-11-19 [SC] 0FC78A9B84618040A64404EDE88022FECFF571EE uid [ultimate] Fumiyuki Shimizu <fmsmz@aposke.com> ssb ed25519 2021-11-19 [A] |
よさそうなのでgpg-agentを設定していきます。~/.gnupg/gpg-agent.conf に次のように記載します。
1 2 3 4 5 6 7 8 9 10 11 12 |
$ cat >>~/.gnupg/gpg-agent.conf default-cache-ttl 60 max-cache-ttl 120 enable-ssh-support ###enable-putty-support ^D $ cat ~/.gnupg/gpg-agent.conf default-cache-ttl 60 max-cache-ttl 120 enable-ssh-support ###enable-putty-support |
TTLは良いように修正してください。すでに~/.gnupg/gpg-agent.confがあった場合は重複行などを調整してください。gpg-agentを起動します。
1 2 3 4 5 6 7 8 9 |
$ export SSH_AUTH_SOCK=$(gpgconf --list-dirs agent-ssh-socket) $ echo $SSH_AUTH_SOCK /c/Users/omnium/.gnupg/S.gpg-agent.ssh $ gpgconf --launch gpg-agent $ ssh-add -L The agent has no identities. |
ssh-agentとして動作しているようでなので ~/.bashrc に同様のコマンドを追加しておきます。ところで鍵の追加を忘れています。~/.gnupg/sshcontrolファイルにkeygripなるものを記述します。keygripの表示オプションをつけます。
1 2 3 4 5 6 7 8 9 |
$ gpg --with-keygrip --list-secret-keys /c/Users/omnium/.gnupg/pubring.kbx -------------------------------- sec ed25519 2021-11-19 [SC] 0FC78A9B84618040A64404EDE88022FECFF571EE Keygrip = 0DAB7097A46804B1065AACDCAC65596EE1692577 uid [ultimate] Fumiyuki Shimizu <fmsmz@aposke.com> ssb ed25519 2021-11-19 [A] Keygrip = 208F6C29CADB7C9BE411F00D796FE8149E47D347 |
認証用[A]のkeygripが分かったので ~/.gnupg/sshcontrol に追記します。
1 2 3 4 5 6 7 |
$ echo "208F6C29CADB7C9BE411F00D796FE8149E47D347 0" >> ~/.gnupg/sshcontrol $ ssh-add -L ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIKuPePuJoTLe+vmFJcUvm/16SJ/RXASODV3e/k2yYfxJ (none) $ ssh -T git@github.com Hi fmrns! You've successfully authenticated, but GitHub does not provide shell access. |
gpg-agent.conf でTTLを指定しているので、特に上書きする理由が無いので keygrip の後ろのTTLは0です。ssh-add -Lの返答はファイルの更新とともに変わって gpg –export-ssh-key と同じ公開鍵であることが確認できます。まだでしたらGitHubにログインしてSSH keysに ssh-ed25519 …の行を張り付けます。
GitHub用には[S]の鍵もできているので、このままGit BashでGnuPGの署名用の公開鍵を表示させます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
$ gpg --list-secret-keys gpg: invalid size of lockfile '/c/Users/omnium/.gnupg/pubring.kbx.lock' gpg: cannot read lockfile gpg: can't lock '/c/Users/omnuim/.gnupg/pubring.kbx' /c/Users/omnium/.gnupg/pubring.kbx -------------------------------- sec ed25519 2021-11-19 [SC] 0FC78A9B84618040A64404EDE88022FECFF571EE uid [ultimate] Fumiyuki Shimizu <fmsmz@aposke.com> ssb ed25519 2021-11-19 [A] $ gpg --armor --export CFF571EE gpg: invalid size of lockfile '/c/Users/omnium/.gnupg/pubring.kbx.lock' gpg: cannot read lockfile gpg: can't lock '/c/Users/omnium/.gnupg/pubring.kbx' -----BEGIN PGP PUBLIC KEY BLOCK----- V9RIVSO0I0Z1bWl5dWtpIFNoaW1penUgPGZtc216QGFwb3NrZS5jb20+iJAEExYI FgIDAQIeAQIXgAAKCRDogCL+z/Vx7r+kAP4wM2FhP4vHVy3HulhM+ghR6hshc43r lzngFgkrBgEEAdpHDwEBB0Crj3j7iaEy3vr5hSXFL5v9ekif0VwEjg1d3v5NsmH8 /s/1ce6uTAEAryXcjpln93aX2epHfZVfoI3wvjmJDsxfQ8TY9RCw5nQBAJKXjPgB =lQ2j -----END PGP PUBLIC KEY BLOCK----- |
表示させたGnuPGの公開鍵をGitHubのGPG keysに追加します。引き続きGit Bashで
1 2 3 |
$ git config --global commit.gpgsign true $ git config --global gpg.program "/c/PortableApps/CommonFiles/GPG/bin/gpg.exe" $ git config --global user.signingkey E88022FECFF571EE |
あとは通常のGitの使い方と同じで、commitの際に署名を付けるために先ほど指定したパスフレーズを訊かれます。gpg-agentが動いているので以降はTTLの間は訊かれません。pushしてcommit履歴にVerifiedが付くことを確認できます。Unverifiedの場合はUnverifiedをクリックすると理由が表示されます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
$ git clone 'https://github.com/fmrns/denosftdbtise.git' Cloning into 'denosftdbtise'... warning: You appear to have cloned an empty repository. $ cat >README.md # stoically facing the dark battle... $ git commit [main (root-commit) 5b219a7] test commit 1 file changed, 1 insertion(+) create mode 100644 README.md $ git push Enumerating objects: 3, done. Counting objects: 100% (3/3), done. Writing objects: 100% (3/3), 437 bytes | 218.00 KiB/s, done. Total 3 (delta 0), reused 0 (delta 0), pack-reused 0 To ssh://github.com/fmrns/denosftdbtise.git * [new branch] main -> main |
GnuPG: YubiKeyに鍵を移動する
回り道をしました。作成した主鍵と副鍵をYubiKeyに引っ越します。ここまでYubiKey無しで作業してきましたが、各鍵ペアはYubiKey内で作成することもできます。YubiKeyを無くしたり壊した場合に暗号化したものを生きている間に復号する手段が無くなってしまうため、YubicoもOpenPGPの鍵はYubiKey外で作成して安全にバックアップを取り、YubiKeyの中に移動するというやり方を推奨しています。バックアップは ~/.gnupg を丸ごと保管するか、以下のように出力がバージョンに依存しにくい正統派のやり方で安全に保管してから鍵をYubiKeyに移動します。まずは ~/.gnupg を利用中の gpg-agent を止めます。
1 2 3 |
$ gpgconf --kill gpg-agent $ ps auxwww | fgrep gpg |
ふたたびWindowsのコマンドプロンプトを使います。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
>c:\PortableApps\CommonFiles\GPG\bin\gpg --list-secret-keys C:/Users/omnium/AppData/Roaming/gnupg/pubring.kbx ----------------------------------------------- sec ed25519 2021-11-19 [SC] 0FC78A9B84618040A64404EDE88022FECFF571EE uid [ultimate] Fumiyuki Shimizu <fmsmz@aposke.com> ssb ed25519 2021-11-19 [A] >c:\PortableApps\CommonFiles\GPG\bin\gpg --armor --export-secret-key CFF571EE > C:/Users/omnium/AppData/Roaming/gnupg/openpgp-private-keys-backup-on-the-safe-place.txt >c:\PortableApps\CommonFiles\GPG\bin\gpg --armor --export > C:/Users/omnium/AppData/Roaming/gnupg/openpgp-public-keys-backup-on-the-safe-place.txt >c:\PortableApps\CommonFiles\GPG\bin\gpg --export-ownertrust > C:/Users/omnium/AppData/Roaming/gnupg/openpgp-ownertrust-on-the-safe-place.txt |
このバックアップを別の機械でインポートして同じような状態になるかを確認します。バックアップ完了したのでYubiKeyを整えていきます。まずOpenPGP用のPINとAdmin PINをそれぞれのデフォルトの 123456, 12345678 から変更します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 |
>c:\PortableApps\CommonFiles\GPG\bin\gpg --card-edit Reader ...........: Yubico YubiKey OTP FIDO CCID 0 Application ID ...: Application type .: OpenPGP Version ..........: 3.4 Manufacturer .....: Yubico Serial number ....: Name of cardholder: [not set] Language prefs ...: [not set] Salutation .......: URL of public key : [not set] Login data .......: [not set] Signature PIN ....: not forced Key attributes ...: rsa2048 rsa2048 rsa2048 Max. PIN lengths .: 127 127 127 PIN retry counter : 2 0 3 Signature counter : 0 KDF setting ......: off Signature key ....: [none] Encryption key....: [none] Authentication key: [none] General key info..: [none] gpg/card> admin Admin commands are allowed gpg/card> passwd gpg: OpenPGP card no. detected 1 - change PIN 2 - unblock PIN 3 - change Admin PIN 4 - set the Reset Code Q - quit Your selection? 1 PIN changed. 1 - change PIN 2 - unblock PIN 3 - change Admin PIN 4 - set the Reset Code Q - quit Your selection? 3 PIN changed. 1 - change PIN 2 - unblock PIN 3 - change Admin PIN 4 - set the Reset Code Q - quit Your selection? q gpg/card> quit |
続けて各鍵をYubiKey内に移動します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 |
>c:\PortableApps\CommonFiles\GPG\bin\gpg --edit-key CFF571EE gpg (GnuPG) 2.2.32; Copyright (C) 2021 g10 Code GmbH This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. Secret key is available. sec ed25519/E88022FECFF571EE created: 2021-11-19 expires: never usage: SC trust: ultimate validity: ultimate ssb ed25519/B3549E2395351668 created: 2021-11-19 expires: never usage: A [ultimate] (1). Fumiyuki Shimizu <fmsmz@aposke.com> gpg> keytocard Really move the primary key? (y/N) y Please select where to store the key: (1) Signature key (3) Authentication key Your selection? 1 sec ed25519/E88022FECFF571EE created: 2021-11-19 expires: never usage: SC trust: ultimate validity: ultimate ssb ed25519/B3549E2395351668 created: 2021-11-19 expires: never usage: A [ultimate] (1). Fumiyuki Shimizu gpg> key 1 sec ed25519/E88022FECFF571EE created: 2021-11-19 expires: never usage: SC trust: ultimate validity: ultimate ssb* ed25519/B3549E2395351668 created: 2021-11-19 expires: never usage: A [ultimate] (1). Fumiyuki Shimizu <fmsmz@aposke.com> gpg> keytocard Please select where to store the key: (3) Authentication key Your selection? 3 sec ed25519/E88022FECFF571EE created: 2021-11-19 expires: never usage: SC trust: ultimate validity: ultimate ssb* ed25519/B3549E2395351668 created: 2021-11-19 expires: never usage: A [ultimate] (1). Fumiyuki Shimizu <fmsmz@aposke.com> gpg> quit Save changes? (y/N) y >c:\PortableApps\CommonFiles\GPG\bin\gpg --list-secret-keys C:/Users/omnium/AppData/Roaming/gnupg/pubring.kbx ----------------------------------------------- sec> ed25519 2021-11-19 [SC] 0FC78A9B84618040A64404EDE88022FECFF571EE Card serial no. = uid [ultimate] Fumiyuki Shimizu <fmsmz@aposke.com> ssb> ed25519 2021-11-19 [A] >c:\PortableApps\CommonFiles\GPG\bin\gpg --card-status Reader ...........: Yubico YubiKey OTP FIDO CCID 0 Application ID ...: Application type .: OpenPGP Version ..........: 3.4 Manufacturer .....: Yubico Serial number ....: Name of cardholder: [not set] Language prefs ...: [not set] Salutation .......: URL of public key : [not set] Login data .......: [not set] Signature PIN ....: not forced Key attributes ...: ed25519 rsa2048 ed25519 Max. PIN lengths .: 127 127 127 PIN retry counter : 3 0 3 Signature counter : 0 KDF setting ......: off Signature key ....: 0FC7 8A9B 8461 8040 A644 04ED E880 22FE CFF5 71EE created ....: 2021-11-19 05:36:35 Encryption key....: [none] Authentication key: F155 6188 954F 7C1D 563F 7EAF B354 9E23 9535 1668 created ....: 2021-11-19 05:45:04 General key info..: pub ed25519/E88022FECFF571EE 2021-11-19 Fumiyuki Shimizu <fmsmz@aposke.com> sec> ed25519/E88022FECFF571EE created: 2021-11-19 expires: never card-no: ssb> ed25519/B3549E2395351668 created: 2021-11-19 expires: never card-no: |
YubiKeyに移動した鍵は>マークが付くようになっています。 ~/.gnupg から秘密鍵は消えているので、この状態で –export-secret-key しても使えないものが出力されるので、正常なバックアップを上書きしてしまうと泣けるかと思います。またYubiKey無しでSSHのログインや署名をすると、YubiKeyを刺すようにダイアログが表示されるようになります。すべて完了です。お疲れさまでした。
GnuPG: さらにおまけ: YubiKey内で鍵ペアを作成する
前述のとおりGitHubだけで使うということであればYubiKey内で鍵を作成させるというのもありになるので試してみます。いったんYubiKeyのOpenPGPモジュールをリセットします。~/.gnupgも丸ごと削除しています。以下YubiKeyのOpenPGPモジュールのリセットの仕方です。YubiKeyの中のOpenPGPの鍵消えます。危険です。そのままデフォルトに戻ったPINも変更します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 |
>c:\PortableApps\CommonFiles\GPG\bin\gpg --card-edit Reader ...........: Yubico YubiKey OTP FIDO CCID 0 Application ID ...: Application type .: OpenPGP Version ..........: 3.4 Manufacturer .....: Yubico Serial number ....: Name of cardholder: [not set] Language prefs ...: [not set] Salutation .......: URL of public key : [not set] Login data .......: [not set] Signature PIN ....: not forced Key attributes ...: ed25519 rsa2048 ed25519 Max. PIN lengths .: 127 127 127 PIN retry counter : 3 0 3 Signature counter : 0 KDF setting ......: off Signature key ....: 0FC7 8A9B 8461 8040 A644 04ED E880 22FE CFF5 71EE created ....: 2021-11-19 05:36:35 Encryption key....: [none] Authentication key: F155 6188 954F 7C1D 563F 7EAF B354 9E23 9535 1668 created ....: 2021-11-19 05:45:04 General key info..: [none] gpg/card> admin Admin commands are allowed gpg/card> factory-reset gpg: OpenPGP card no. detected gpg: Note: This command destroys all keys stored on the card! Continue? (y/N) y Really do a factory reset? (enter "yes") yes gpg/card> list Reader ...........: Yubico YubiKey OTP FIDO CCID 0 Application ID ...: Application type .: OpenPGP Version ..........: 3.4 Manufacturer .....: Yubico Serial number ....: Name of cardholder: [not set] Language prefs ...: [not set] Salutation .......: URL of public key : [not set] Login data .......: [not set] Signature PIN ....: not forced Key attributes ...: rsa2048 rsa2048 rsa2048 Max. PIN lengths .: 127 127 127 PIN retry counter : 3 0 3 Signature counter : 0 KDF setting ......: off Signature key ....: [none] Encryption key....: [none] Authentication key: [none] General key info..: [none] gpg/card> passwd 1 - change PIN 2 - unblock PIN 3 - change Admin PIN 4 - set the Reset Code Q - quit Your selection? 1 PIN changed. 1 - change PIN 2 - unblock PIN 3 - change Admin PIN 4 - set the Reset Code Q - quit Your selection? 3 PIN changed. 1 - change PIN 2 - unblock PIN 3 - change Admin PIN 4 - set the Reset Code Q - quit Your selection? q gpg/card> quit |
まっさらになったYubiKeyの中で署名用と認証用のOpenPGP鍵を作成していきます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 |
>c:\PortableApps\CommonFiles\GPG\bin\gpg --card-edit Reader ...........: Yubico YubiKey OTP FIDO CCID 0 Application ID ...: Application type .: OpenPGP Version ..........: 3.4 Manufacturer .....: Yubico Serial number ....: Name of cardholder: [not set] Language prefs ...: [not set] Salutation .......: URL of public key : [not set] Login data .......: [not set] Signature PIN ....: not forced Key attributes ...: rsa2048 rsa2048 rsa2048 Max. PIN lengths .: 127 127 127 PIN retry counter : 3 0 3 Signature counter : 0 KDF setting ......: off Signature key ....: [none] Encryption key....: [none] Authentication key: [none] General key info..: [none] gpg/card> admin Admin commands are allowed gpg/card> key-attr Changing card key attribute for: Signature key Please select what kind of key you want: (1) RSA (2) ECC Your selection? 2 Please select which elliptic curve you want: (1) Curve 25519 (4) NIST P-384 Your selection? 1 The card will now be re-configured to generate a key of type: ed25519 Note: There is no guarantee that the card supports the requested size. If the key generation does not succeed, please check the documentation of your card to see what sizes are allowed. Changing card key attribute for: Encryption key Please select what kind of key you want: (1) RSA (2) ECC Your selection? 2 Please select which elliptic curve you want: (1) Curve 25519 (4) NIST P-384 Your selection? 1 The card will now be re-configured to generate a key of type: cv25519 Changing card key attribute for: Authentication key Please select what kind of key you want: (1) RSA (2) ECC Your selection? 2 Please select which elliptic curve you want: (1) Curve 25519 (4) NIST P-384 Your selection? 1 The card will now be re-configured to generate a key of type: ed25519 gpg/card> generate Make off-card backup of encryption key? (Y/n) n Please note that the factory settings of the PINs are PIN = '123456' Admin PIN = '12345678' You should change them using the command --change-pin Please specify how long the key should be valid. 0 = key does not expire <n> = key expires in n days <n>w = key expires in n weeks <n>m = key expires in n months <n>y = key expires in n years Key is valid for? (0) Key does not expire at all Is this correct? (y/N) y GnuPG needs to construct a user ID to identify your key. Real name: Fumiyuki Shimizu Email address: fmsmz@aposke.com Comment: You selected this USER-ID: "Fumiyuki Shimizu <fmsmz@aposke.com>" Change (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit? o gpg: key 5AC917D761361C6D marked as ultimately trusted gpg: directory 'C:/Users/omnium/AppData/Roaming/gnupg/openpgp-revocs.d' created gpg: revocation certificate stored as 'C:/Users/omnium/AppData/Roaming/gnupg/openpgp-revocs.d\675F3BC990AD7F54A038DE375AC917D761361C6D.rev' public and secret key created and signed. gpg/card> list Reader ...........: Yubico YubiKey OTP FIDO CCID 0 Application ID ...: Application type .: OpenPGP Version ..........: 3.4 Manufacturer .....: Yubico Serial number ....: Name of cardholder: [not set] Language prefs ...: [not set] Salutation .......: URL of public key : [not set] Login data .......: [not set] Signature PIN ....: not forced Key attributes ...: ed25519 cv25519 ed25519 Max. PIN lengths .: 127 127 127 PIN retry counter : 3 0 3 Signature counter : 4 KDF setting ......: off Signature key ....: 675F 3BC9 90AD 7F54 A038 DE37 5AC9 17D7 6136 1C6D created ....: 2021-11-19 07:20:14 Encryption key....: 00B0 33F0 83AF C0E6 778C 5323 38BB D2DE 667D 6607 created ....: 2021-11-19 07:20:14 Authentication key: 6812 3A8A C849 0A2A AD14 BDFD F2FC 2096 E8D8 A19A created ....: 2021-11-19 07:20:14 General key info..: pub ed25519/5AC917D761361C6D 2021-11-19 Fumiyuki Shimizu <fmsmz@aposke.com> sec> ed25519/5AC917D761361C6D created: 2021-11-19 expires: never card-no: ssb> ed25519/F2FC2096E8D8A19A created: 2021-11-19 expires: never card-no: ssb> cv25519/38BBD2DE667D6607 created: 2021-11-19 expires: never card-no: gpg/card> quit |
さくっと出来上がりました。途中バックアップについて訊かれました。本当に取れるのであればセキュリティーキーの存在を脅かすゆゆしさですが、ちゃんと秘密鍵は入っていないということなのでここで保存する意味がありません。ユーザ情報はGnuPGだけが持っているもののようです。ところで暗号化用の鍵もできているので、間違えて使わないように消します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 |
>c:\PortableApps\CommonFiles\GPG\bin\gpg --edit-key 61361C6D gpg (GnuPG) 2.2.32; Copyright (C) 2021 g10 Code GmbH This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. gpg: checking the trustdb gpg: marginals needed: 3 completes needed: 1 trust model: pgp gpg: depth: 0 valid: 1 signed: 0 trust: 0-, 0q, 0n, 0m, 0f, 1u Secret key is available. sec ed25519/5AC917D761361C6D created: 2021-11-19 expires: never usage: SC card-no: 0006 15411083 trust: ultimate validity: ultimate ssb ed25519/F2FC2096E8D8A19A created: 2021-11-19 expires: never usage: A card-no: 0006 15411083 ssb cv25519/38BBD2DE667D6607 created: 2021-11-19 expires: never usage: E card-no: 0006 15411083 [ultimate] (1). Fumiyuki Shimizu <fmsmz@aposke.com> gpg> key 2 sec ed25519/5AC917D761361C6D created: 2021-11-19 expires: never usage: SC card-no: 0006 15411083 trust: ultimate validity: ultimate ssb ed25519/F2FC2096E8D8A19A created: 2021-11-19 expires: never usage: A card-no: 0006 15411083 ssb* cv25519/38BBD2DE667D6607 created: 2021-11-19 expires: never usage: E card-no: 0006 15411083 [ultimate] (1). Fumiyuki Shimizu <fmsmz@aposke.com> gpg> delkey Do you really want to delete this key? (y/N) y sec ed25519/5AC917D761361C6D created: 2021-11-19 expires: never usage: SC card-no: 0006 15411083 trust: ultimate validity: ultimate ssb ed25519/F2FC2096E8D8A19A created: 2021-11-19 expires: never usage: A card-no: 0006 15411083 [ultimate] (1). Fumiyuki Shimizu <fmsmz@aposke.com> gpg> quit Save changes? (y/N) y >c:\PortableApps\CommonFiles\GPG\bin\gpg --list-secret-keys C:/Users/omnium/AppData/Roaming/gnupg/pubring.kbx ----------------------------------------------- sec> ed25519 2021-11-19 [SC] 675F3BC990AD7F54A038DE375AC917D761361C6D Card serial no. = uid [ultimate] Fumiyuki Shimizu <fmsmz@aposke.com> ssb> ed25519 2021-11-19 [A] >c:\PortableApps\CommonFiles\GPG\bin\gpg --card-status Reader ...........: Yubico YubiKey OTP FIDO CCID 0 Application ID ...: Application type .: OpenPGP Version ..........: 3.4 Manufacturer .....: Yubico Serial number ....: Name of cardholder: [not set] Language prefs ...: [not set] Salutation .......: URL of public key : [not set] Login data .......: [not set] Signature PIN ....: not forced Key attributes ...: ed25519 cv25519 ed25519 Max. PIN lengths .: 127 127 127 PIN retry counter : 3 0 3 Signature counter : 4 KDF setting ......: off Signature key ....: 675F 3BC9 90AD 7F54 A038 DE37 5AC9 17D7 6136 1C6D created ....: 2021-11-19 07:20:14 Encryption key....: 00B0 33F0 83AF C0E6 778C 5323 38BB D2DE 667D 6607 created ....: 2021-11-19 07:20:14 Authentication key: 6812 3A8A C849 0A2A AD14 BDFD F2FC 2096 E8D8 A19A created ....: 2021-11-19 07:20:14 General key info..: pub ed25519/5AC917D761361C6D 2021-11-19 Fumiyuki Shimizu <fmsmz@aposke.com> sec> ed25519/5AC917D761361C6D created: 2021-11-19 expires: never card-no: ssb> ed25519/F2FC2096E8D8A19A created: 2021-11-19 expires: never card-no: |
YubiKey内には残っているようですが、GnuPGからYubiKeyへのポインタは消えたので、間違えて使うことはなさそうです。あとは公開鍵を各フォーマットで表示できれば完了です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
>c:\PortableApps\CommonFiles\GPG\bin\gpg --with-keygrip --list-secret-keys C:/Users/omnium/AppData/Roaming/gnupg/pubring.kbx ----------------------------------------------- sec> ed25519 2021-11-19 [SC] 675F3BC990AD7F54A038DE375AC917D761361C6D Keygrip = 747AB7D5DE8D7B3886E6B4F2A671BA390F8ED03E Card serial no. = uid [ultimate] Fumiyuki Shimizu <fmsmz@aposke.com> ssb> ed25519 2021-11-19 [A] Keygrip = FA0F8EA53DBB16F48FB6A8C06CD7DDE357651855 >echo "FA0F8EA53DBB16F48FB6A8C06CD7DDE357651855 0" >> c:\Users\omnium\.gnupg\sshcontrol >c:\PortableApps\CommonFiles\GPG\bin\gpg --export-ssh-key F2FC2096E8D8A19A ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIK3ogFPXY1fC91rmt4H8TJY8eUKMkku/e7UiFa3vtf2Y openpgp:0xE881A >c:\PortableApps\CommonFiles\GPG\bin\gpg --armor --export 5AC917D761361C6D -----BEGIN PGP PUBLIC KEY BLOCK----- erW2e3S0I0Z1bWl5dWtpIFNoaW1penUgPGZtc216QGFwb3NrZS5jb20+iJAEExYI FgIDAQIeAQIXgAAKCRBayRfXYTYcbfneAP40fSgUr26YhZ4e5BfP2HBgRFAv73N1 l1AuFgkrBgEEAdpHDwEBB0Ct6IBT12NXwvda5reB/EyWPHlCjJJLv3u1IhWt77X9 12E2HG3JWwEAkIofPEa3rnn6rGNPhUrq+0R6PWmEewznqBxy4ushbLUA+wfXyhmm =68e1 -----END PGP PUBLIC KEY BLOCK----- |
完了です。ファイルとしてはYubiKeyへのポインタと公開鍵が残るのでこれらのバックアップが依然として必要ですが、BitLockerが有効でない場所に置いてもYubiKeyが安全に保管されていてシリアルで結びつけるのが困難であれば問題になることもないです。GitHub用YubiKeyとして入社時に配るとかいうのも良いかもしれません。
最後は-skから大幅にずれましたが、他に気になるOSがあったらまたお試しするかもしれません。ありがとうございました。