Gitのコミット署名の有効期限を更新するために行ったことメモ

約2年前、コミット署名を行うための準備メモを投稿しました。

https://qiita.com/cocoabreak/items/d96cd0ba56cdcbf62d32

PCのクリーンインストールついでに、署名用サブ鍵の有効期限を更新したので記録として残します。
なおこの記事を引用する場合「前回の記事」と記載します。

## ソフトウェアのセットアップ
以前のメモではScoopを使ってGPGをインストールしましたが、今回はwingetを用いました。
```powershell
❯ winget search gpg
名前              ID              バージョン 一致         ソース
-----------------------------------------------------------------
GPG ICT Summit    9NBLGGH4XT16    Unknown                 msstore
GNU Privacy Guard GnuPG.GnuPG     2.3.4      Command: gpg winget
Keybase           Keybase.Keybase 5.9.0.13   Tag: gpg     winget
Gpg4win           GnuPG.Gpg4win   4.0.0                   winget

❯ winget install --id GnuPG.GnuPG
```

wingetでインストールしたGPGの場合、鍵情報は ``%APPDATA%\gnupg`` に格納されます。

## 以前バックアップで退避した情報を復元する

前回の記事、[マスター鍵を安全な場所に退避させ、秘密鍵を削除する](
https://qiita.com/cocoabreak/items/d96cd0ba56cdcbf62d32#%E3%83%9E%E3%82%B9%E3%82%BF%E3%83%BC%E9%8D%B5%E3%82%92%E5%AE%89%E5%85%A8%E3%81%AA%E5%A0%B4%E6%89%80%E3%81%AB%E9%80%80%E9%81%BF%E3%81%95%E3%81%9B%E7%A7%98%E5%AF%86%E9%8D%B5%E3%82%92%E5%89%8A%E9%99%A4%E3%81%99%E3%82%8B) でバックアップしたファイルを``%APPDATA%\gnupg`` に格納します。

この状態で ``gpg --with-keygrip --list-key`` コマンドを実行すると次のように表示されます。

```powershell
❯  gpg --with-keygrip --list-key
C:\Users\cocoabreak\AppData\Roaming\gnupg\pubring.kbx
------------------------------------------------
pub   nistp521 2019-12-23 [C]
      ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
      Keygrip = KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK
uid           [ultimate] Hirofumi Akiyama <cocoabreak.git@gmail.com>
```
署名用のサブ鍵が表示されていませんが復元完了です。

## サブ鍵の有効期限を更新する

ここからが本題となります。
フィンガープリントを指定して ``gpg --edit-key --expert`` コマンドを実行すると、署名用のサブ鍵（有効期限2022年1月2日）が表示されます（3ヶ月も放置してたんかー:scream:）。
```powershell
❯ gpg --edit-key --expert ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
gpg (GnuPG) 2.3.4; 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  nistp521/XXXXXXXXXXXXXXXX
     created: 2019-12-23  expires: never       usage: C
     trust: ultimate      validity: ultimate
ssb  ed25519/YYYYYYYYYYYYYYYY
     created: 2019-12-23  expired: 2022-01-02  usage: S
[ultimate] (1). Hirofumi Akiyama <cocoabreak.git@gmail.com>
```
``key`` コマンドでサブ鍵を指定し、``expire`` コマンドで有効期限の変更モードにします。

```powershell
gpg> key YYYYYYYYYYYYYYYY

sec  nistp521/XXXXXXXXXXXXXXXX
     created: 2019-12-23  expires: never       usage: C
     trust: ultimate      validity: ultimate
ssb* ed25519/YYYYYYYYYYYYYYYY
     created: 2019-12-23  expired: 2022-01-02  usage: S
[ultimate] (1). Hirofumi Akiyama <cocoabreak.git@gmail.com>

gpg> expire
Changing expiration time for a subkey.
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)
```

今回は2年にしました。
メイン鍵のパスフレーズを入力し、``save`` コマンドを実行すれば有効期限の更新は完了です。

![タイトルなし.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51808/911d0c6d-5ec7-c6ba-7fb8-b5073c7f3148.png)

```powershell
gpg> expire
Changing expiration time for a subkey.
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) 2y
Key expires at 2024/04/02 12:03:18      ( W    )
Is this correct? (y/N) y

sec  nistp521/XXXXXXXXXXXXXXXX
     created: 2019-12-23  expires: never       usage: C
     trust: ultimate      validity: ultimate
ssb* ed25519/YYYYYYYYYYYYYYYY
     created: 2019-12-23  expires: 2024-04-02  usage: S
[ultimate] (1). Hirofumi Akiyama <cocoabreak.git@gmail.com>

gpg> save
```
有効期限が2024年4月2日に延長されました！
あとは前回の記事同様、バックアップとマスター鍵の秘密鍵を削除すれば終わりです。

更新したサブ鍵で署名をすれば、GitHubではVerified状態となります。
![github_history.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51808/249d2c67-5663-9a6b-0def-5d110894f187.png)

## ※重要な補足
Verified状態にはなりますが、Verifiedの詳細を見るとこのような表示がありました。

> This commit was signed with the commiter's verified signature. The key expired after the commit was signed.

解消するためには、冒頭に掲載した「前回の記事」に記載している、公開鍵のエクスポートとGitHubへの登録を行い、
公開鍵の更新を行ってください。

### おまけ
GitKrakenの場合、有効期限が切れたサブ鍵で署名を行うとこんな感じになります。
![gitkraken_expired.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51808/4673736b-6084-53ca-8b43-32cb17774858.png)