YubiKey Managerを使用した鍵ペア(秘密鍵)と自己署名証明書の作成方法

  1. YubiKey Managerを開き、Applications から [ PIV ]メニューをクリックして証明書発行へ移動
  2. YubiKey Managerのインストールがまだの方はこちらからインストールをお願いします。
    YubiKey Managerをインストール

  1. Certificates ー [ Configure Certificates ] ボタンをクリックして証明書発行選択画面へ移動
  1. 証明書を作成と格納するスロットのタブの右下の [ Generate ] ボタンをクリック

    ※この記事では「Authentication(Slot 9a)」に秘密鍵を作成します

  1. [ Self-signed certificate ] ラジオボタンを選択して [ Next ] をクリック
  1. Algorithmを [ RSA2048 ] を選択して [ Next ] をクリック

    ※この記事では RSA 2048bit で公開鍵&秘密鍵を作成します。
    RSA 2048bit 鍵長で証明書が多くのソリューションで利用できます。 この他に RSA1024bit / ECC P256bit / ECC P386bit 鍵長を選択することができます。 楕円曲線暗号 ECCアルゴリズムを選択する場合は 対象アプリケーションが ECCをサポートしているか確認してから選択してください。

  1. 鍵の名前 Subject nameを入力して [ Next ] をクリック

    例) yamadatarou

  1. 証明書の有効期限 Expiration date をカレンダーで選択して [ Next ] をクリック

    ※証明書の有効期限は一般的にはあまり長い期間を選択しませんが、YubiKeyに格納されている証明書はデバイス内部格納で安全ですからある程度長期の有効期限を設定して運用することもできます。
    証明書を更新することになった際に、更新した証明書に差し替えられる場合とそうで無い場合とで、有効期限を選択してください。

  1. 設定した内容に間違いがないか確認したら [ Generate ] をクリック
  1. YubiKeyにあらかじめ設定してある [ Management Key ] を入力

    [ PIN ] も同様に入力します

以上で対象スロットに秘密鍵と公開鍵を含む自己署名証明書の作成ができます。

ykmanコマンドを使用した鍵ペア(秘密鍵)と自己署名証明書の作成方法

①コマンドラインツールをインストールします

Mac

ターミナルを開いて、「brew install ykman」と入力するとコマンドラインツールがインストールされてコマンドラインでYubiKeyの設定を行えるようになります。

Windows

Windows環境では、YubiKey Managerをインストールすると、一緒にコマンドラインツールもインストールされています。Windowsのコマンド環境を管理者として開いて、C:\Program Files\Yubico\YubiKey Manager> にディレクトリを移動することでコマンドラインでYubiKeyの設定を行えます。

②鍵ペア(秘密鍵と公開鍵)の生成をします

$ ykman piv generate-key -P123456 -
m010203040506070801020304050607080102030405060708 9a yamadatarou

<動作結果表示なし>
(例:Management Keyを「010203040506070801020304050607080102030405060708」、PINを「123456」に設定していたときに、「スロット9a」に「yamadatarou」という名前の鍵ペアを生成)

③自己署名証明書の生成をします

$ ykman piv generate-certificate -P123456 -
m010203040506070801020304050607080102030405060708 -s "yamadatarou" 9a
yamadatarou

<動作結果表示なし>
(例:Management Keyを「010203040506070801020304050607080102030405060708」、PINを「123456」に設定していたときに、Subject nameが「yamadatarou」で「スロット9a」に「yamadatarou」という名前の鍵ペアをもつ自己証明書を生成)

※証明書の有効期限(デフォルト365日後まで)を変えたい場合はオプションで「-d」を加えることで変更できます。
(例:証明書の有効期限を400日後に設定)

$ ykman piv generate-certificate -P123456 -
m010203040506070801020304050607080102030405060708 -d400 -s "yamadatarou" 9a
yamadatarou

以上で鍵ペア(秘密鍵と公開鍵)と自己署名証明書の作成は完了です。

公開鍵の入った自己署名証明書の情報はykmanコマンドでも確認できます。

$ ykman piv info
PIV version: 5.2.7
PIN tries remaining: 3
CHUID:
3019d4e739da739ced39ce739d836858210842108421c84210c3eb3410170452da7c41e01c578
8e7f6effcad7f350832303330303130313e00fe00
CCC: No data available.
Slot 9a:
Algorithm: RSA2048
Subject DN: CN=yamadatarou
Issuer DN: CN=yamadatarou
Serial: 355906469862366400514395928992499109154174450941
Not before: 2021-02-02 02:58:39
Not after: 2022-02-02 02:58:39

Algorithmはデフォルトで「RSA2048」になっています。
証明書の有効期限はデフォルトで「365日」になっています。

YubiKey内の秘密鍵でSSHログイン接続方法

YubiKey内の秘密鍵を利用してリモートサーバーにSSH接続する手順です。

検証環境

  • YubiKeyはYubiKey 5 NFC
  • SSH認証用Linuxサーバー(CentOS7)

OpenSCをインストール

OpenSCをインストールします。

$ brew install opensc

homebrewでインストールすればインストール先は/usr/local/opt/openscになります。

$ brew --prefix opensc 
/usr/local/opt/opensc

でインストール先が確認できます。

公開鍵をサーバーに登録

①OpenSCが正常にインストールされていれば、ローカルで以下のコマンドを実行するとYubiKey内の公開鍵が出力されます

$ ssh-keygen -D /usr/local/opt/opensc/lib/opensc-pkcs11.so
ssh-rsa
AAAAB3NzaC1yc2EAAAADAQABAAABAQDFq2+YX0RP93cA9gYXs+0+LVNdQU4epTtzhrVZyl+M
Y0jg1b5kxaIc0wtnpE5Gn0ip96WzeZjWUQP/DXHaylcVGvuFhufQoa6llYiQgwFYlxrcET898Y/Yo2ZB
Q7fdzViEzVFdRYx5XSjPXJNc/oigehZ+Qt3ZPtnDe8+KJl0Ocqv2sIErZl4Pqj58GhHhVkFzuPgtk7sCY
BKDR7FgLK+bUQDSe+pPr56Mq8g3PhVrVm6YQRZBZQv1HiW24ss5dAFlh8B1rvkDVjXLrFN5Uli/W
W8Uq/oxWmaNizrkY3j+t3H4RrMYC0DjV4PkmwWh9DTOsPOTE4eAPIz4cHqqDDzM

②公開鍵をLinuxサーバーに転送する必要があるので、「id_rsa.pub」と名前をつけたファイルに出力します

$ ssh-keygen -D /usr/local/opt/opensc/lib/opensc-pkcs11.so >>id_rsa.pub

<動作結果表示なし>

③出力に使ったファイルをサーバーに転送します

必要要素 項目
SSHサーバー認証用の既存ログイン鍵 SSH_with_YubiKey.pem
YubiKeyから取り出した公開鍵ファイル /Users/yamadatarou/id_rsa.pub
転送したいSSHサーバー内のパス centos@18.480.167.226:~/
$ scp -i SSH_with_YubiKey.pem /Users/yamadatarou/id_rsa.pub centos@18.480.167.226:~/
id_rsa.pub
100% 381 37.8KB/s 00:00

「id_rsa.pub」公開鍵がSSHサーバーに転送されました。

④Linuxサーバーにログインし、利用したい公開鍵を所定のユーザーディレクトリへ書き込みます

$ cat id_rsa.pub >> /home/centos/.ssh/authorized_keys

<動作結果表示なし>

⑤以下のコマンドを実行して公開鍵の内容が出力されていれば、既存の公開鍵の下にサーバーに転送された公開鍵の内容が確認できます

$ cat /home/centos/.ssh/authorized_keys
ssh-rsa
AAAAB3NzaC1yc2EAAAADAQABAAABAQDPoh9eleJBCqWD2aQGV1/7Mrov212+5/lRvJwpo6+nV/
MQeiG3H1Cv1dkn2krag+SjxjknPkLd/w9ISvvp07u0X5GW7p1GmfTUZKmEDYs0agzIcWjBkMWfFyp
QTrGRjoc1lKqBqC2sDemYLGjnu+6XVIuiXUgVe7tCPHcImMODbScbB2XcyC9Oh+aBquI9VPnMruar
fTuQcrjm2cZtivLnM5lVDmDEMimOeHMU+xddP4O9PZzu56XTu01CRAmgaeF8+hLNZg6TN2Qof6
vLtRSN7I/b6CZ9KCD9oklh0ZkCHtf+Gqt1BX7nLdewKS7Z6+zgXVttCGhij9l7d7bEMC3Xsa.
ssh-rsa
AAAAB3NzaC1yc2EAAAADAQABAAABAQDFq2+YX0RP93cA9gYXs+0+LVNdQU4epTtzhrVZyl+M
Y0jg1b5kxaIc0wtnpE5Gn0ip96WzeZjWUQP/DXHaylcVGvuFhufQoa6llYiQgwFYlxrcET898Y/Yo2ZB
Q7fdzViEzVFdRYx5XSjPXJNc/oigehZ+Qt3ZPtnDe8+KJl0Ocqv2sIErZl4Pqj58GhHhVkFzuPgtk7sCY
BKDR7FgLK+bUQDSe+pPr56Mq8g3PhVrVm6YQRZBZQv1HiW24ss5dAFlh8B1rvkDVjXLrFN5Uli/W
W8Uq/oxWmaNizrkY3j+t3H4RrMYC0DjV4PkmwWh9DTOsPOTE4eAPIz4cHqqDDzM

上半分はSSHサーバー認証用の既存ログイン鍵の内容、下半分はYubiKeyで生成した公開鍵(id_rsa.pub)の内容です。

YubiKey クライアントユーザーでログインする

ローカルで作成したYubiKey内の秘密鍵を利用してSSHログインします。

$ ssh -I /usr/local/opt/opensc/lib/opensc-pkcs11.so ユーザー名@サーバーのIP
Enter PIN for 'yamadatarou(鍵の名前)':

「Enter PIN for 'yamadatarou'」でYubiKeyのPINを入力するとSSHログインが完了します。

YubiKeyの他サポートページについてはこちらをご覧ください