読者です 読者をやめる 読者になる 読者になる

Lambdaカクテル

ソフトウェア開発者です.玉石混淆です.

openpgp4fprの力を借りてNFCタグでPGP鍵を配ろう

NFCタグで公開鍵を相手に伝えることができる方法が分かったので共有します。

必要なもの

手順

NFCで鍵の情報を伝えるには、openpgp4fprというURIスキームを使います。AndroidGnu Privacy GuardOpenKeyChainはこのスキームに対応しているので、NFCタグをかざしたときにアプリを起動し、鍵を読み込ませることができます。

鍵指紋を準備

まず公開鍵の鍵指紋(fingerprint)を控えます。鍵指紋とは鍵に固有な20byteのデータです。

$ gpg --fingerprint 0x73c08b1d
pub   rsa2048/73C08B1D 2012-04-06
      Key fingerprint = C556 EF3F 2D0F E163 5A86  9931 9FE0 A201 73C0 8B1D ←ここ
uid         [ultimate] Keisuke Noguchi <windy.imlovinit@gmail.com>
uid         [ultimate] Momijikawa <windy.imlovinit@gmail.com>
sub   rsa2048/89BB6207 2012-04-06 [expires: 2016-04-12]
sub   rsa4096/DFF86AA5 2015-10-15
sub   rsa4096/6CBDB9FC 2015-10-15 [expires: 2016-10-14]
sub   rsa4096/18AF197B 2015-10-15

上の例ではC556 EF3F 2D0F E163 5A86 9931 9FE0 A201 73C0 8B1Dが鍵0x73c08b1dの鍵指紋です。

openpgp4fprスキームで表現

次に鍵指紋をopenpgp4fprスキームで表現します。openpgp4fprは以下のように鍵指紋を表現します。

openpgp4fpr:スペースを除いた鍵指紋

例ではこのように表現されます。

openpgp4fpr:C556EF3F2D0FE1635A8699319FE0A20173C08B1D

ワンライナーだとgpg --fingerprint <鍵ID> | grep "fingerprint" | sed -e 's/^.*= /openpgp4fpr:/' | tr -d " "で取得できますが、Androidの上でこれをやるのは面倒ですね。あくまでパソコンの鍵を配るときに便利な方法です。ともかく、指紋が取れたらそれでいいです。

ちなみにこのURIスキームを<a href="openpgp4fpr:...">key</a>のようにHTML上でリンクさせてもAndroidはこれを認識できます。AndroidじゃないOSのブラウザでは未確認です。

NFCタグに書き込む

さっそくタグに書き込んでみましょう。NFCToolsを起動し、[WRITE] → [Add a record]を選択します。httpスキームではないので[Custom URL / URI]を選択し、前述のURIを書き込みます。[OK]を押したら元の画面に戻ります。

URIが表示されているのを確認したら、[Write]を押してからタグをかざし、タグにデータを書き込みます。

はい、これでNFC公開鍵?が完成しました。

使い方

NFCが起動している状態で、タグをかざしましょう。GnuPGやOpenKeyChainがインストールされていれば、そのアプリに誘導するメニューが表示されるはずです。あとは指示に従えば、公開鍵をインポートできます。

OpenPGP CardにNFCタグシールを貼って自慢しよう。

windymelt.hatenablog.com

windymelt.hatenablog.com