質問: HTTP サーバーでファイルを配布する際に、 .sig ファイルを一緒に置いておきながら配布するパターンを見かけます。 例: .sig ファイルによる検証を gpg で行うには、その公開鍵をどうにかして取得する必要があると考えていますが、この公開鍵の情報はどうやって取得する想定なのでしょうか。 HTTP通信における、中間の攻撃者による内容の改竄について で述べられた通り HTTP 通信は信用できないと思っています。というのも、「公開鍵は何であるか」を HTTP で送ってしまっては、その情報自体が改竄されえてしまうと考えているからです。 鍵の情報だけを https で配布する、という構成ならば健全な方法だと思いますが、だったら最初からすべて https でいいのでは・・・?と思ったりなどします。
回答: 公開鍵のサーバーがあるので、そこから取得できます。これはhttpsではありませんが、それ以前に単に「アップロードされた公開鍵を保存している」だけですから、その公開鍵が正規の発行元のものかどうかはわかりません。 ですから、その公開鍵が信用できるかどうかは自分で判断することになります。 鍵の持ち主のサイトなどに載っている鍵指紋と比較することが多いと思いますが、これは確かに改竄されている可能性があります。それでもInternetArchiveなどのサイトで最近不自然に変更されていないか確認したり、別回線からアクセスしてみたり、その人が署名した別の信頼できるコンテンツを探してみたりすることで、ある程度調査をすることは可能です。 また公開鍵そのものと併せて「ある公開鍵に対して第三者が行った署名」も公開されていますから、それを辿って行って、例えばLinusの鍵で署名されたAさんの鍵で署名されたBさんの鍵はLinusの鍵並みに信用できそうだ、といった判断の仕方もできます。 ちなみにGNUプロジェクトの場合、公開鍵はGNUプロジェクトのFTPでも配布されています。 > > 鍵の情報だけを https で配布する、という構成ならば健全な方法だと思いますが、だったら最初からすべて https でいいのでは・・・? > > > 署名なしのパッケージをhttpsで配布するだけでは、サーバー上でのファイルの改竄や破損を検知することはできません。よって署名の存在意義は残りますが、どうせ署名を検証するんだったらサーバーに負荷をかけるhttpsでパッケージをダウンロードさせなくてもいいでしょう。 信頼できるURLからhttpsで公開鍵をダウンロードするというのは、Debian系のAPTなんかでやっていることですね。 参考 * How to verify an OpenPGP key's ownership? - Information Security Stack Exchange * Shouldn't GPG key fetching use a secure connection? - Information Security Stack Exchange