YubiKey を使って git の ssh 接続を構築する（Windows編）

## ことの発端

社内で２要素認証・多要素認証で ```YubiKey``` を採用しました。
で、購入した ```YubiKey5シリーズ``` には ```FIDO2 (WebAuthn)``` のみならず ```PIV``` 即ち ```ICカード``` の機能を持っているので、 ssh の公開鍵暗号で使うことにしましたので、　Windowsでの導入手順を示します。

なお、この記事では以下を前提とします。

* 既に ssh の公開鍵暗号方式を使って git のクローンやプッシュを経験している。
* ```PIV``` 機能がある ```YubiKey``` を所有している。
* ```SouceTree``` での設定例。 [^1]

[^1]: コマンドラインを使っても可能です。しかし、 ```GitHub Desktop``` はトークンによる ```https``` アクセスを使用するため使用できません。


## 1. ```YubiKey``` の設定

下記の記事を参考に ```YubiKey``` を設定してください。

https://qiita.com/terukazu/items/c97de5024f089997ae29

※　この記事で説明している取得した公開鍵を ```GitHub``` や ```Bitbucket``` に設定してください。


## 2. ```Yubico PIV Tool``` をインストール

PKCS11 の認証モジュールが必要になりますので、インストールしておきましょう。
インストール後、インストール先の ```bin``` フォルダ内に ```libykcs11.dll``` へのパスをメモしておきましょう。 （後で登場します）

https://developers.yubico.com/yubico-piv-tool/Releases/


## 3. ```PuTTY-CAC``` をインストール

一般的な ```pageant``` はスマートカードに対応しておりませんので、 ```PuTTY-CAC``` を下記 URL よりダウンロードしてインストールしましょう。

https://github.com/NoMoreFood/putty-cac/releases

スタートアップに登録して先に ```PuTTY-CAC``` の ```pageant``` を起動させておくと便利です。スタートアップへの登録方法は下記を参考にしましょう。

https://support.microsoft.com/ja-jp/windows/windows-10-%E3%81%AE%E8%B5%B7%E5%8B%95%E6%99%82%E3%81%AB%E8%87%AA%E5%8B%95%E7%9A%84%E3%81%AB%E5%AE%9F%E8%A1%8C%E3%81%99%E3%82%8B%E3%82%A2%E3%83%97%E3%83%AA%E3%82%92%E8%BF%BD%E5%8A%A0%E3%81%99%E3%82%8B-150da165-dcd9-7230-517b-cf3c295d89dd

```SourceTree``` では ```SSH クライアントの設定``` で ```SourceTree 起動時に SSH エージェントを起動します``` のチェックを外しておきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1038343/96834d34-e018-988e-b1c1-28c5857a1e84.png)


## 4. ```pageant``` に証明書を登録

既に ssh で運用されている方はご存じだと思いますが、Windows 起動後に毎回やらないといけないやつです。

1. タスクトレイの ```pageant``` アイコンを右クリックします。<br>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1038343/e333e861-d96d-adf3-eaa6-b36698995422.png)
1. ```Add PKCS Cert``` を選択します。（秘密鍵ファイルの場合は ```Add PuTTY Key``` ですが、今回インストールした ```PuTTY-CAC``` のお陰でスマートカードを使用できるようになり、スマートカードの場合は ```Add PKSC Cert``` を選択します。）<br>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1038343/61bb5751-cd36-8984-1558-1dc87d97a690.png)
1. ファイル選択を ```All Library Files (*.dll)``` に変更します。<br>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1038343/bd51d494-a1e4-ad2d-6353-bdce318fdcf0.png)
1. ```Yubico PIV Tools``` のインストール先の ```bin``` フォルダにある ```libkcs11.dll``` を開きます。
1. 公開鍵の選択画面が表示されるので、 ```その他``` をクリックして、今回は ```SLOT 9A``` の証明書を選択します。（スロットについては [「ssh の公開鍵認証方式で YubiKey を使うための準備」](https://qiita.com/terukazu/items/c97de5024f089997ae29#5-%E8%A8%BC%E6%98%8E%E6%9B%B8%E3%82%92%E7%99%BB%E9%8C%B2) を参照してください）<br>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1038343/dbefd73f-2f81-482d-86c0-ea426558587e.png)


## 5. SourceTree を使ってみる

既に設定は終わっていますので、いつものように git でクローンやプッシュを行います。
その際、下記のような ```PuTTY Authentication``` が表示されるので、 ```YubiKey``` の ```PIN``` を入力します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1038343/711b1545-51b0-c21b-eb05-2ac3455dd24b.png)


## 6. コマンドラインを使ってみる

おまけで、コマンドラインからも使用する場合を説明しておきます。
（SourceTree でうまく接続できない場合、問題の切り分けとして試行する際に使えます）

ssh のコンフィグファイルに下記を追加します。

```config:.ssh/config
Host github.com
  PKCS11Provider "D:\Program Files\Yubico\Yubico PIV Tool\bin\libykcs11.dll"
```

```github``` に接続してみましょう。

```shell
ssh git@github.com
```

すると下記の表示がされますので、 ```YubiKey``` の ```PIN``` を入力し ```Enter``` を押下します。

```shell
Enter PIN for 'YubiKey PIV #15801817': 
```

その後、下記のような表示になれば成功です。

```shell
PTY allocation request failed on channel 0
Hi terukazu-inoue! You've successfully authenticated, but GitHub does not provide shell access.
Connection to github.com closed.
```

ちなみに、 windows の git では、デフォルトshell が sigwin の ssh なので、 windows 標準に変更します。（この変更により ```SourceTree``` が使えなくなるので注意）

```shell:設定する
git config --global core.sshCommand "C:/Windows/System32/OpenSSH/ssh.exe"
```

```shell:やっぱりやめる
git config --global --unset core.sshCommand
```