HKPプロトコル

● HKPとは


keyserver.netなどのPGP公開鍵サーバーは、HKP(Howrowitz Key Protocol)と呼ばれるHTTP互換プロトコルを用いて鍵を検索(おそらく登録も)行うことが出来ます。この文書を書いている時点(2002/04/25)ではHKPの仕様書やプロトコルの解説サイトを見つけることが出来ていません。以下の情報はpkspxyのソースコードを元に記述しています。GnuPGのソースを見ればさらに詳しいことも分かるでしょうが、とりあえず鍵を検索するだけならこれでも充分でしょう。
HKPはHTTP互換であり、返される結果もHTMLになっています。パースするのが面倒ですが諦めるしか無いようです。

● 検索

鍵サーバーに/pks/lookup?search=[検索文字列]&op=getをGETで要求します。
要求された鍵が見付かったらその鍵を返し、見付からなければその旨が報告されます。
見付かっても見付からなくてもHTTPとしてのステータスコードはHTTP/1.0 200 OKなので、これを見て判断することは出来ません。

例1:

% telnet search.keyserver.net 11371
Trying 212.35.123.136...
Connected to lord.veridis.com.
Escape character is '^]'.
GET /pks/lookup?search=phonohawk&op=get HTTP/1.0
HTTP/1.0 200 OK
Content-type: text/html

<html>
<!-- Copyright (c) 1999 Highware, Inc. All rights reserved. -->
<title>Public Key Server -- Get ``phonohawk''</title><p>
<h1>Public Key Server -- Get ``phonohawk''</h1><p>
<pre>
-----BEGIN PGP PUBLIC KEY BLOCK-----
Version: OpenKeyServer v1.2
Comment: Extracted from http://www.keyserver.net

mQGiBDy3HQARBADkMRJNEfmv38Jq4P7gj9ySCc1wV+Fu/RdJvbY6fkxBmJU4oth1
5HgYYXe9tVrIVst8X8oG0y/ufBRINCJN1Jc9CvhpZaEyZxh3k4VBf5fZl8hzklkS
/qNECE2P7bcpAsvmaShj/nRWcqvyRgHPmmqaioVm3uOQOIVZYQjgQ1y5awCg4wZf
x87/lWzbelVRVswAoLYztFkEAMUCP6wVpkZLTyqGPhhCHqOk9Ed4nLgY+UZ0kMij
odL02SLs6900ldkranzzhcayvbxP31QYnvPsh8tJ9sFee5pI5UUs4kSgdoAYHsc/
d8GkXsJsojw/40W9XyLT/NFfo8Zoe87NFxpVAVcgmIJB6DGouxr3mb9nwApJrv0E
mXnnA/0dJ/JcfIWBqB/FIktnvTCPGFGe4o9hkEc9QqyCAAvbm9rUzF3iyu47Md9Y
REYNhouaAER0+HoVU/EBRWH4xxfKVqYXHuWP6X+Bh+T2cwQZFLpU1gmtA+0npJQS
XS6tZNCwiHvup9DicNx6bvWYHjaz91ocjzMY+TU0S7/+5gzCgLQdcGhvbm9oYXdr
IDxwaG9ub2hhd2tAbWFjLmNvbT6IVwQTEQIAFwUCPLcdAAULBwoDBAMVAwIDFgIB
AheAAAoJENuJIVy5TtVEINAAn1qKgXcdJyyMClXK0XLuJFuvWue9AKC++igTgKiy
0KfXUGdzglBW3VDyv7kBDQQ8tx0NEAQA/JExqZwyJyXbhZ60U37t//WmWV8/Cu07
I/llGUjymtgon29H0GdYP2EmAlbKDKJCWq7YPKwGmSmlmWR+2VRShV29c8eppazG
ktQoE2APKjTdNKkUu+5Y3iz/+NAlX3wzMoXSfdcTxfZYz8myeewejas6gWEoLk5N
0Iw1M2HJOR8AAwUD+wcmTIEHjqYlSkuFq7PEwr32krEprfMY4XRwO/1oTa65Owbc
XscEEYLHtflML81Bv0GOv4ZAiUH1RwPHKRVz9RdNZtB69tlQD77ZX1luxptTWmFY
6PmyChCC2dyHude1ElTBkGtF5vWMbyhZJGWuJfhxSpndDRH7UQC2u7yXbaUeiEYE
GBECAAYFAjy3HQ0ACgkQ24khXLlO1USHpgCgvB0iycp91QogXvPuvOAwMuGjuwAA
oJgrfSIc4sr6c2XFtesKUV+48UTp
=QP7P
-----END PGP PUBLIC KEY BLOCK-----

</pre>
</html>
Connection closed by foreign host.

例2:
% telnet search.keyserver.net 11371
Trying 212.35.123.136...
Connected to lord.veridis.com.
Escape character is '^]'.
GET /pks/lookup?search=asashdlkajklja&op=get HTTP/1.0
HTTP/1.0 200 OK
Content-type: text/html

<title>Public Key Server -- Error</title><p>
<h1>Public Key Server -- Error</h1><p>
Sorry, no matching keys in the database.
Connection closed by foreign host.