Skip to content

コミットに署名する

本編の最後に、コミットに署名する方法について解説します。じつは、Git の仕組み上誰かに成り済ましてコミットをすることはとても簡単にできてしまいます。コミットに署名することで、そのコミットがあなたのものであると証明することができます。

成り済まし

Gitea 上でリポジトリにコミットした人のアイコンなどを表示できればとても便利です。ところが Git(ソフトウェア)と traP Gitea(ホスティングサービス)は別個の存在なので、Git で行うコミットなどの操作自体に Gitea が介入することはできません。

コミットに埋め込まれている個人の情報は基本的にはメールアドレスしかないので、Gitea はこのメールアドレスを紐づけているアカウントを検索して見つかったものを「コミットしたユーザー」として表示します。すなわち、あなたが誰かのメールアドレスを自身のアドレスとしてコミットに埋め込むと、あなたはそのユーザーに成り済ますことができます。

本人に許可を得てメールアドレスを借りています

相手のアドレスがダミーアドレスでも成り済ましは可能です。すなわち、これは前章 メールアドレスの秘匿 で触れたこととは別個の問題です。

署名の技術

コミットへの署名は公開鍵暗号という技術を用いて行います。コミットに署名するための仕組みには現在 SSH と GPG の 2 種類がありますが、ここでは SSH を用いた方法を説明します。

公開鍵暗号とその用途

公開鍵暗号は関数 f を公開し f1 を秘匿した状態で、情報をこれらの関数に通すことで情報の保護や正統性の証明を可能にする技術です。ff1 はそれぞれ 公開鍵秘密鍵 と呼ばれています。

  • 外部に漏れないように情報を受信したい場合、f は暗号化関数、f1 は復号関数としてはたらきます。秘密鍵 f1 を秘匿する私が相手から安全に情報 a を受信したい場合、相手には公開鍵 f を用いて暗号化した情報 f(a)=a を送ってもらいます。この情報を復号できるのは秘密鍵 f1 を所持している私だけなので、情報 f1(a)=a を安全に受け取ることができます。

  • 公開鍵暗号は 署名 すなわち渡す情報の正統性の証明に用いることもでき、この場合秘密鍵 f1 が暗号化関数としてはたらきます。渡したい情報から固有に得られる値 bf1 で暗号化した f1(b)=b を署名として情報に添えて渡します。公開鍵 f によって確かに f(b)=b が成り立つことを相手に確認してもらい、秘密鍵を所持する本人であると証明することができます。

以上が公開鍵暗号による情報の保護・署名の仕組みの非厳密な説明です。コミットの署名ではコミットの内容やコミットメッセージなどの情報全体をハッシュ関数にかけた値を b として署名に用います。

SSH キーの登録 の章で生成した SSH キーは、ホームディレクトリ直下の .ssh という隠しディレクトリの中にあります。ターミナルで以下を実行したとき、一覧の中にある id_ed25519 が秘密鍵、id_ed25519.pub が公開鍵です(pub = public)。

sh
ls ~/.ssh  # .ssh ディレクトリの項目一覧を表示

これらは両方ともさほど長くないテキストファイルです。一度それぞれの中身がどんな形をしているかを見ておくとあとで役に立つかも(公開鍵の中身はすでに一度見ているはず)。ただし、とくに秘密鍵は誰かに送ったり見せたりしないように十分気をつけてください。

署名の方法

Gitea の SSH / GPG キー のページを開き、SSH キーの登録 の章であなたが登録した SSH キーの「確認」ボタンを押すと、以下のような表示が現れます。

トークンをコピペして、その他の場所は以下に倣ってコマンドを実行してください。

sh
echo -n 'トークン' | ssh-keygen -Y sign -n gitea -f ~/.ssh/id_ed25519.pub

すると、以下のような形式の SSH 署名が出力されるはずです。これを「Armor 形式の SSH 署名」欄に貼り付けて、その下の「確認」ボタンを押します。

-----BEGIN SSH SIGNATURE-----
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAA
-----END SSH SIGNATURE-----

最後に、以下のコミットを一つずつ実行してください。

sh
# コミットの署名を有効にする
git config --global commit.gpgsign true

# SSH での署名を選択
git config --global gpg.format ssh

# 署名に使う SSH キーのパスを指定
git config --global user.signingkey ~/.ssh/id_ed25519.pub

以上の手順によって、Gitea 上でコミットに署名できるようになります。

SSH キーの登録 で登録した SSH キーは、これまでプライベートリポジトリのクローン・プッシュなどの操作にのみ用いられていましたが、以上の設定によってコミットの署名にも用いられるようになりました。

ダミーメールアドレスでは署名に失敗します

git config で個人用のメールアドレスを設定していれば以上の手順で問題なく署名されますが、前章 の手順に従ってダミーアドレスを設定した後では署名に失敗するという現象を観測しました。どうやらこれは traP Gitea の仕様みたいです(参考)。2025 年現在、Gitea で署名に使えるメールアドレスは traPortal で個人用に設定しているただ一つの実メールアドレスに限られています。

traP Gitea で「実メールアドレスでコミットに署名する」ことと「メールアドレスを秘匿して署名を諦める」ことのどちらを優先すべきかは一概には言えません。ただし、GitHub ではこれらの設定を両立させることが可能なので、ぜひ両立させましょう。

Git 操作の利便性を保ちつつ更なる安全性を求める場合には SSH エージェントと呼ばれるソフトウェアに頼ることができます。詳しくは GitHub Docs などを参照してください。


次のページで Git 講習会本編はゴールです!