Edited at

Windowsでも楕円曲線DSAでgitのタグに署名したい

More than 1 year has passed since last update.

(2017-11-26) @spiegel-im-spiegel さんのコメントを受けて内容修正。

(2018-04-17) KleopatraのバージョンアップでEd25519鍵が作成可能になったので追記。


gitのタグに署名がしたかった

Windowsな環境でgitをTortoiseGitから使っていたので, TortoiseGitから署名付きのタグが打てたら便利だなぁ, と思っていたが, 実際にやってみるとなかなか上手くいきませんでした。

最近になってGpg4winが楕円曲線暗号に対応したGnuPG2.2系列を搭載するようになったので, 署名が出来るようになるまできちんとやってみました。

TortoiseGit


署名が出来るようになるまで

ここではGit for Windows及びTortoiseGitはインストール済みであるとします。


Gpg4winのインストール

gitのコミットやタグに対して署名を行うためにはOpenPGP形式の公開鍵/秘密鍵ペアが必要になります。

また実際の署名は, OpenPGP形式の鍵を扱うソフトウェアの中でも恐らく最も広く使われているオープンソース実装のGnu Privacy Guard (GnuPG)を利用することで行われています。

Windowsの場合はGpg4winがWindows用にビルドされたGnuPGを含んだツールセットになっていて, GnuPGに加えて鍵/証明書マネージャのKleopatra, Outlook用のメール暗号化プラグインGpgOL, GnuPGをシェルに統合するGnuEXをまとめてインストール出来ます。Kleopatraはアイコンもうちょっと何とかなりませんかね・・・・

基本的には公式サイトからインストーラをダウンロードして実行してインストールすればよいです。

Chocolateyを利用しているのであればPS> choco install gpg4win -yでインストールすることも出来ます。

普通にインストールすればGnuPGへのパスも自動的に追加されると思います。


鍵の作成

Kleopatra(インストール後にはタスクトレイに常駐していると思います)のウィンドウの左上, ファイルからNew Key Pairを選択し, 個人用のOpenPGP鍵ペアを作成を行います。

Kleopatra

作成する鍵の選択 - Kleopatra

今回は楕円曲線DSAで署名したいので, 詳細設定からECDSAを選択し, 使用する楕円曲線を選択します(2017/11/26現在, Ed25519曲線は選択出来ない模様 Ed25519鍵が選べるようになりました(ed25519 + cv25519))。

RSAで署名したい場合には同様にRSAを選択し, 楕円曲線を選ぶかわりに鍵長を選択します。

この際, 適宜鍵の有効期限を設定しておくことをお勧めします。

詳細設定 - Kleopatra

詳細設定を完了し, 名前とメールアドレスを入力して鍵の生成を行おうとすると鍵に設定するパスフレーズを尋ねられるので, 入力して設定することを推奨します。

作成した鍵は自動的にKleopatraに追加され, 管理されます。


gitで使用する鍵の指定

要するに$ git config --global --set user.signingkey "[key ID]"を実行すればよいわけですが, 折角なのでTortoiseGitから設定してみます。

TortoiseGitの設定から[Git]メニューを選択し, ローカルリポジトリに対する設定ならローカルの, グローバルな設定ならグローバルのユーザ情報の署名鍵IDにKleopatraで作成した鍵のKey-IDカラムの文字列を入力します。

Key ID - Kleopatra

署名鍵ID - TortoiseGit


Git for Windowsのgpg.exeを無効にする gitで使用するgpg.exeを指定する

さて, ここまでGpg4winをインストールするなどやってきたわけですが, 実はGit for WindowsにはGnuPGが含まれます

が, Git-Bashなどからgpgコマンドを実行してみれば分かるのですが, バージョンが非常に古い(git 2.15.0.windows.1と同時にインストールされるのがgpg 1.4.22)ものになっています。

$ git --version

git version 2.15.0.windows.1

$ gpg --version
gpg (GnuPG) 1.4.22
Copyright (C) 2015 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Home: ~/.gnupg
Supported algorithms:
Pubkey: RSA, RSA-E, RSA-S, ELG-E, DSA
Cipher: IDEA, 3DES, CAST5, BLOWFISH, AES, AES192, AES256, TWOFISH,
CAMELLIA128, CAMELLIA192, CAMELLIA256
Hash: MD5, SHA1, RIPEMD160, SHA256, SHA384, SHA512, SHA224
Compression: Uncompressed, ZIP, ZLIB, BZIP2

楕円曲線が利用可能になるのはGnuPGのver2.1からなので, このバージョンでは利用することが出来ません。

また, Gpg4winでインストールしたGnuPGは%AppData%\Roaming\GnuPG以下にキーリングが保存されますが, Git for WindowsにバンドルされたGnuPGは%USERPROFILE%\.gnupg以下に保存します。

このバージョンの差とデフォルトの参照場所の違いから, Kleopatra管理下の鍵はgitバンドルのGnuPGからは見えず, たとえ%USERPROFILE%\.gnupg以下のファイルを%AppData%\Roaming\GnuPG以下のファイルへのシンボリックリンクにしてもメジャーバージョンが違っているため読み込むことが出来ません。

通常, gitはバンドルされたGnuPGを使用するため, このままではKleopatra管理下の鍵を使うことが出来ません。

そこで, gitがバンドルされたGnuPGを使えないようにするため, {Git for Windowsインストールディレクトリ}\usr\bin\にあるgpg.exegp~.exeなどにリネームするか, 或いは削除してしまいましょう。

こうすることでパスの通った場所に存在するgpg.exeが代わりに使用され, 通常は上記でインストールしたGpg4winに含まれるGnuPGのgpg.exeが使用されることになります。

尚, このgpg.exeを無効にする作業はGit for Windowsのバージョンアップの度に行う必要があります

gitが使用するgpg.exeのパスをgit configでgpg.programに指定しましょう。 (thanks @spiegel-im-spiegel さん)

PS > git config --global gpg.program /path/to/GnuPG/bin/gpg.exe

先に書いていた方法より遥かにベターです。

Git for Windows更新の際にももちろん再設定は必要ありません。

Git for WindowsにGnuPG ver2.2以降をバンドルしてくれればいいんですが。 どうやら現在のGnuPGで使用されているpinentryがX11に依存しているため, MSYS2上では使えない, というのが理由のようです(Alexpux/MSYS2-packages#986)


タグに署名する

ここまで設定出来ればあとは簡単です。

TortoiseGitからタグを打つ際に, 署名のチェックボックスをチェックすれば署名付きタグが作成されます。

このとき鍵のパスフレーズを尋ねられますので, タグを打つ際に毎回入力してあげましょう。

現状, TortoiseGitで$ git commit -S相当のことを行う方法はちょっと分かりませんが, まぁ全てのコミットに署名する人は少ないでしょうからタグに署名が出来れば十分じゃないかと思います(偏見)。


(追記) Ed25519鍵を作成する

KleopatraからEd25519鍵を作成出来るようになりました!

下記の文章は残しますが, GUIから鍵を作成可能となったため, 積極的に適用する理由はなくなりました。

残念ながらKleopatraからはEd25519鍵を作ることは出来ませんが, コマンド操作を行うことで作成可能です。

また作成以外の管理についてはKleopatraで行うことが出来ます。

単純にgpg --gen-keygpg --full-gen-keyとしても楕円曲線は選択出来ませんが, --expertオプションを付加して--full-gen-keyを実行することで楕円曲線DSA/暗号を選ぶことが出来るようになります。

この場合は候補の楕円曲線リストにEd25519が普通に表示されるので, 後はプロンプトに従って鍵生成を行えばよいです。

PS > gpg --expert --full-gen-key

gpg (GnuPG) 2.2.3; Copyright (C) 2017 Free Software Foundation, Inc.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

ご希望の鍵の種類を選択してください:
(1) RSA と RSA (デフォルト)
(2) DSA と Elgamal
(3) DSA (署名のみ)
(4) RSA (署名のみ)
(7) DSA (機能をあなた自身で設定)
(8) RSA (機能をあなた自身で設定)
(9) ECC と ECC <- 楕円曲線DSAで署名し楕円曲線暗号で暗号化する鍵
(10) ECC (署名のみ)
(11) ECC (機能をあなた自身で設定)
(13) 既存の鍵
あなたの選択は? 9
ご希望の楕円曲線を選択してください:
(1) Curve 25519 <- Ed25519曲線
(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)5y
鍵は11/25/22 15:00:54 東京 (標準時)で期限切れとなります
これで正しいですか? (y/N) y

GnuPGはあなたの鍵を識別するためにユーザIDを構成する必要があります。

本名: [name]
電子メール・アドレス: example@example.com
コメント: <comment>
次のユーザIDを選択しました:
"[name] (<comment>) <example@example.com>"

名前(N)、コメント(C)、電子メール(E)の変更、またはOK(O)か終了(Q)? O
たくさんのランダム・バイトの生成が必要です。キーボードを打つ、マウスを動か
す、ディスクにアクセスするなどの他の操作を素数生成の間に行うことで、乱数生
成器に十分なエントロピーを供給する機会を与えることができます。
たくさんのランダム・バイトの生成が必要です。キーボードを打つ、マウスを動か
す、ディスクにアクセスするなどの他の操作を素数生成の間に行うことで、乱数生
成器に十分なエントロピーを供給する機会を与えることができます。
gpg: 鍵0000000000000000を究極的に信用するよう記録しました
gpg: 鍵0000000000000001を究極的に信用するよう記録しました
gpg: 失効証明書を '%AppData%/gnupg/openpgp-revocs.d\0000000000000000000000000000000000000000.rev' に保管しました。
公開鍵と秘密鍵を作成し、署名しました。

pub ed25519 2017-11-26 [SC] [有効期限: 2022-11-25]
0000000000000000000000000000000000000000
uid [name] (<comment>) <example@example.com>
sub cv25519 2017-11-26 [E] [有効期限: 2022-11-25]

尚, この方法で生成した鍵についても自動的にKleopatra管理下に入りますので, 鍵生成以外についてはコマンドを使う必要はありません。