<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Web Key Directory on Jonatan Miarecki</title><link>https://miarecki.eu/pl/tags/web-key-directory/</link><description>The latest posts on Jonatan Miarecki</description><language>pl-pl</language><managingEditor>jonatan@miarecki.eu (Jonatan Miarecki)</managingEditor><webMaster>jonatan@miarecki.eu (Jonatan Miarecki)</webMaster><lastBuildDate>Mon, 02 Mar 2026 21:04:12 +0100</lastBuildDate><atom:link href="https://miarecki.eu/pl/tags/web-key-directory/index.xml" rel="self" type="application/rss+xml"/><item><title>Konfiguracja Web Key Directory</title><link>https://miarecki.eu/pl/posts/konfiguracja-web-key-directory/</link><pubDate>Sun, 17 Mar 2024 15:00:00 +0000</pubDate><author>jonatan@miarecki.eu (Jonatan Miarecki)</author><guid>https://miarecki.eu/pl/posts/konfiguracja-web-key-directory/</guid><description>Web Key Directory (WKD) to protokół umożliwiający odkrywanie publicznych kluczy OpenPGP przesłanych na własny serwer w celu zabezpieczenia komunikacji.</description><content:encoded> <![CDATA[<p>Uzyskanie klucza PGP jest łatwe, ale podzielenie się nim z innymi może być kłopotliwe.</p>
<h2 id="dlaczego-używać-web-key-directory">Dlaczego używać Web Key Directory</h2>
<p>Udostępnianie swojego publicznego klucza jest ważne dla zabezpieczenia komunikacji, ponieważ pozwala innym na szyfrowanie wiadomości, które tylko Ty z odpowiadającym prywatnym kluczem możesz odszyfrować i zweryfikować, że wiadomości pochodzą od Ciebie. Jest to szczególnie ważne dla poczty e-mail, która domyślnie nie jest szyfrowana i może być przechwycona i odczytana przez podmiot obsługujący e-mail. Wymaga to jednak, aby odbiorca miał Twój publiczny klucz, który musi być udostępniony.</p>
<h3 id="tradycyjne-sposoby-udostępniania-publicznego-klucza">Tradycyjne sposoby udostępniania publicznego klucza</h3>
<p>Tradycyjnym sposobem udostępniania publicznego klucza jest przesłanie go na serwer kluczy, ale ta metoda ma swoje wady. Każdy może przesłać klucz na serwer kluczy, a nie ma sposobu na zweryfikowanie, czy klucz rzeczywiście należy do osoby, do której twierdzi, że należy.</p>
<p>Inną opcją byłoby pobranie klucza ze strony internetowej osoby, ale znalezienie klucza byłoby o wiele trudniejsze, ponieważ strona każdego byłaby inna i nadal wymagałoby ręcznej pracy, aby uzyskać klucz.</p>
<p>Nawet wysłanie klucza przez e-mail nie jest dobre, ponieważ pierwszy e-mail byłby nieszyfrowany, a klucz mógłby być przechwycony i zastąpiony złośliwym, a nadal wymagałby ręcznej pracy do importu klucza.</p>
<h3 id="rozwiązanie">Rozwiązanie</h3>
<p>Tutaj pojawia się Web Key Directory. <dfn title="Web Key Directory">WKD</dfn> to protokół umożliwiający odkrywanie publicznych kluczy OpenPGP przesłanych na serwery osób, omijając potrzebę dedykowanych serwerów kluczy i umożliwiając większą kontrolę nad kluczami. Korzystając z HTTPs do uzyskania klucza, możesz być trochę pewniejszy, że klucz używany dla adresu e-mail został dystrybuowany przez właściciela domeny, który może być tą samą osobą.</p>
<p>WKD pozwala klientom poczty e-mail, takim jak Thunderbird, na automatyczne odkrywanie publicznego klucza odbiorcy i bezpośrednie użycie go podczas pierwszej rozmowy.</p>
<h2 id="konfiguracja-web-key-directory">Konfiguracja Web Key Directory</h2>
<p>WKD ma dwa rodzaje konfiguracji: konfigurację bezpośrednią i zaawansowaną. Pomimo swoich nazw, obie wymagają mniej więcej tych samych kroków. Konfiguracja bezpośrednia nie wymaga dodatkowych wpisów DNS, podczas gdy konfiguracja zaawansowana wymaga utworzenia subdomeny o nazwie <code>openpgpkey</code>, która zostanie najpierw przetestowana, zanim przejdzie do konfiguracji bezpośredniej.</p>
<h3 id="wymagania">Wymagania</h3>
<ol>
<li>
<p>Domena:</p>
<p>Domena jest wymagana do hostowania publicznego klucza, ponieważ w przeciwnym razie nie mogłbyś używać WKD. Dla podstawowej konfiguracji wystarczy umiejętność umieszczenia plików w katalogu <code>.well-known</code> Twojej domeny. Dla zaawansowanej konfiguracji musisz być w stanie utworzyć subdomenę o nazwie <code>openpgpkey</code> i umieścić pliki w katalogu <code>.well-known</code> tej subdomeny.</p>
</li>
<li>
<p>Publiczny klucz, który pasuje do adresu e-mail hostowanego na domenie</p>
</li>
<li>
<p>Serwer WWW:</p>
<p>Serwer WWW jest wymagany do hostowania publicznego klucza. Jeśli nie masz hostingu WWW lub nie możesz kontrolować serwera WWW, możesz skorzystać z <a href="https://keys.openpgp.org/about/usage#wkd-as-a-service">WKD-as-a-service Openpgp.org</a>. Ta usługa pozwala na hostowanie publicznego klucza na ich serwerach, wykorzystując zaawansowaną konfigurację. Ten sposób ma wadę braku pełnej kontroli nad kluczem i zawiera wszystkie dostępne klucze dla tej tożsamości.</p>
</li>
</ol>
<h3 id="uzyskanie-hasza">Uzyskanie hasza</h3>
<p>Podstawowy tryb oczekuje klucza pod tym adresem: <code>https://{domena}/.well-known/openpgpkey/hu/{hash}?l={nazwa-e-mail}</code> gdzie {domena} to domena adresu e-mail, {hash} to hash WKD adresu e-mail i {nazwa-e-mail} to część nazwy adresu e-mail przed @ z użyciem odpowiedniego unikania znaków.</p>
<p>Zaawansowany tryb jest podobny, ale używa subdomeny openpgpkey i zawiera domenę w małych literach w ścieżce, tak jak poniżej: <code>https://openpgpkey.{domena}/.well-known/openpgpkey/{domena}/hu/{hash}?l={nazwa-e-mail}</code></p>
<p>Hash jest obliczany przez wzięcie części lokalnej adresu e-mail (część przed @), zamienienie wszystkich znaków ASCII na małe litery i zahashowanie jej za pomocą algorytmu SHA-1. Wynikowy 160-bitowy skrót jest kodowany za pomocą metody <a href="https://philzimmermann.com/docs/human-oriented-base-32-encoding.txt">Z-Base-32</a> w celu utworzenia 32-oktetowego ciągu. Ten ciąg jest następnie używany jako hash w adresie URL. Nie musisz jednak robić tego ręcznie, ponieważ narzędzie wiersza poleceń gpg może to zrobić za Ciebie.</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># Konkretny klucz:</span>
</span></span><span class="line"><span class="cl">gpg --with-wkd-hash --fingerprint jan@example.com
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Wszystkie przechowywane klucze:</span>
</span></span><span class="line"><span class="cl">gpg --list-keys --with-wkd-hash
</span></span></code></pre></td></tr></table>
</div>
</div><p>Otrzymasz coś w rodzaju:</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="hl"><span class="lnt">4
</span></span><span class="lnt">5
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">pub   ed25519 2024-03-17 [SC] [expires: 2026-03-17]
</span></span><span class="line"><span class="cl">      9D8A 1793 98A8 9449 29C2  AAE6 00ED 46C4 145C 61FE
</span></span><span class="line"><span class="cl">uid           [ultimate] Jan Kowalski &lt;jan@example.com&gt;
</span></span><span class="line hl"><span class="cl">              nuu38srs5zrcw4etqt3nt4drcu8wrydf@example.com
</span></span><span class="line"><span class="cl">sub   cv25519 2024-03-17 [E] [expires: 2026-03-17]
</span></span></code></pre></td></tr></table>
</div>
</div><p>Hash jest przed @ w adresie e-mail, który w tym przypadku to</p>
<p>Teraz, gdy masz hash, musisz zapisać niezamaskowaną wersję klucza publicznego w lokalizacji hasha, co możesz zrobić za pomocą następującego polecenia:</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">gpg --no-armor --export jan@example.com
</span></span></code></pre></td></tr></table>
</div>
</div><p>Bądź ostrożny na Windows, ponieważ nie używa operatora przekierowania <code>&gt;</code> poprawnie i dane binarne zostają pomieszane. Rozważ użycie Git Bash lub WSL, aby temu zapobiec.</p>
<h3 id="dns">DNS</h3>
<p>Jeśli planujesz korzystać z zaawansowanej konfiguracji, musisz utworzyć subdomenę o nazwie <code>openpgpkey</code> i mieć serwer www serwujący klucze stamtąd. Jeśli korzystasz z metody bezpośredniej, musisz upewnić się, że subdomena openpgpkey nie odpowiada. Na przykład, gdy używasz rekordów DNS typu wildcard, upewnij się, że subdomena openpgpkey nie jest objęta wildcardingiem. Można to zrobić, dodając pusty rekord TXT dla tej subdomeny, co zapobiegnie wpływowi rekordów DNS typu wildcard na rekord DNS openpgp, ponieważ najpierw próbuje się metody zaawansowanej, zanim nastąpi powrót do metody bezpośredniej.</p>
<h3 id="przesyłanie-klucza">Przesyłanie klucza</h3>
<p>Klucz musi być przesłany na serwer www w lokalizacji hasha odpowiedniej dla wybranej konfiguracji. Powinien być serwowany jako <code>application/octet-stream</code> i zezwalać na dostęp z dowolnego miejsca za pomocą nagłówka <code>Access-Control-Allow-Origin: *</code>.</p>
<p>Przykładowe konfiguracje dla nginx mogą wyglądać tak:</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-nginx" data-lang="nginx"><span class="line"><span class="cl"><span class="k">location</span> <span class="s">^~</span> <span class="s">/.well-known/openpgpkey</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">   <span class="kn">default_type</span> <span class="s">application/octet-stream</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">   <span class="kn">add_header</span> <span class="s">Access-Control-Allow-Origin</span> <span class="s">*</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">   <span class="kn">alias</span> <span class="s">/path/to/openpgpkey</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p>albo dla Clodflare pages przez utworzenie pliku _headers w katalogu wyjściowym:</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="l">/.well-known/openpgpkey/*</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">   </span><span class="nt">Content-Type</span><span class="p">:</span><span class="w"> </span><span class="l">application/octet-stream</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">   </span><span class="nt">Access-Control-Allow-Origin</span><span class="p">:</span><span class="w"> </span>*<span class="w">
</span></span></span></code></pre></td></tr></table>
</div>
</div><h3 id="dodanie-pliku-policy">Dodanie pliku policy</h3>
<p>Specyfikacja wymaga, aby plik flag polityki był serwowany. Ten plik jest wymagany nawet jeśli protokół aktualizacji Web Key Directory nie jest obsługiwany, co jest protokołem, który umożliwia automatyczną aktualizację i dodawanie klucza publicznego. Ale to nie będzie potrzebne, ponieważ klucze będą statycznie hostowane i serwowane.</p>
<p>Plik flag polityki może być pustym plikiem. Dla konfiguracji bezpośredniej musi być serwowany pod <code>/.well-known/openpgpkey/policy</code>, a dla konfiguracji zaawansowanej pod <code>/.well-known/openpgpkey/{domena}/policy</code>.</p>
<h2 id="testowanie-konfiguracji">Testowanie konfiguracji</h2>
<p>Możesz przetestować swoją konfigurację za pomocą następującego polecenia GnuPG, które spróbuje pobrać klucz z serwera:</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">gpg --auto-key-locate clear,nodefault,wkd --locate-keys jan@example.com
</span></span></code></pre></td></tr></table>
</div>
</div><div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span><span class="lnt">6
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">gpg: key 00ED46C4145C61FE: public key <span class="s2">&#34;jan@example.com&#34;</span> imported
</span></span><span class="line"><span class="cl">gpg: Total number processed: <span class="m">1</span>
</span></span><span class="line"><span class="cl">gpg:               imported: <span class="m">1</span>
</span></span><span class="line"><span class="cl">pub   ed25519 2024-03-17 <span class="o">[</span>SC<span class="o">]</span> <span class="o">[</span>expires: 2026-03-17<span class="o">]</span>
</span></span><span class="line"><span class="cl">      9D8A179398A8944929C2AAE600ED46C4145C61FE
</span></span><span class="line"><span class="cl">uid           jan@example.com
</span></span></code></pre></td></tr></table>
</div>
</div><p>Dla codziennego użytku możesz po prostu użyć <code>--locate-keys</code> w gpg, aby automatycznie pobrać klucz z serwera lub poszukać odpowiedniej opcji w swoim kliencie poczty.</p>
<h2 id="podsumowanie">Podsumowanie</h2>
<p>Ustawienie Web Key Directory to świetny sposób na udostępnianie swojego publicznego klucza innym.
Pozwala na automatyczne odkrywanie publicznego klucza na przykład w klientach poczty e-mail i umożliwia większą kontrolę nad kluczem, ponieważ jest hostowany na Twoim własnym serwerze i umożliwia komunikację bez ręcznej wymiany klucza. Pozwala również na usunięcie starych lub unieważnionych kluczy z serwera, co nie jest możliwe z tradycyjnymi serwerami kluczy, które będą przechowywać klucz na zawsze, zatruwając serwer kluczy starymi kluczami.</p>
<p>Źródła:</p>
<ul>
<li><a href="https://datatracker.ietf.org/doc/draft-koch-openpgp-webkey-service/">OpenPGP Web Key Directory Internet-Draft</a></li>
</ul>
]]></content:encoded></item></channel></rss>