Punycode変換(国際化ドメイン名)
日本語などを含む国際化ドメイン名(IDN)とPunycode(ASCII互換エンコーディング)を相互変換します。
Punycodeとは
DNS は歴史的に ASCII の文字しか扱えません。しかし「日本語.jp」のように**漢字やかなを含むドメイン名**を使いたいという要求があり、その橋渡しとして作られたのが Punycode(RFC 3492)です。Unicode の文字列を `xn--` で始まる ASCII 文字列へ可逆的に変換することで、既存の DNS をそのまま使いながら国際化ドメイン名(IDN)を実現しています。
変換結果が人間には読めない文字列になるのは仕様どおりです。`日本語.jp` は `xn--wgv71a119e.jp` になります。**ブラウザーのアドレス欄は変換後の姿を隠して元の文字で表示する**ため、普段は意識せずに済みます。一方でこの見た目の差は**フィッシングに悪用されうる弱点**でもあり、キリル文字の「а」とラテン文字の「a」のように見分けのつかない字を使った偽ドメインが問題になってきました。このツールは両方向の変換を行い、**処理はすべてブラウザー内で完結します。**
変換する手順
- 変換の向きを選ぶ ドメイン名→Punycode か、Punycode→ドメイン名のどちらかを選びます。
- ドメイン名を入力する `日本語.jp` のように、TLD まで含めた形で入力してください。
- 結果を確認する `xn--` で始まる変換結果、または元の文字列が表示されます。
- 見比べて確認する **紛らわしい文字が混ざっていないか**を、変換後の ASCII 表記で確かめられます。
使いこなすためのヒント
- 複数のラベル(`.`で区切られた部分)からなるドメイン名も、ラベルごとに自動判定して変換します。ASCII文字のみのラベルはそのまま、非ASCII文字を含むラベルだけが `xn--` 接頭辞付きに変換されます。
- 「Punycode → ドメイン名」モードでは、`xn--` 接頭辞を含むラベルのみをデコード対象とし、それ以外のラベルはそのまま扱います。
- ドメイン名だけでなく、メールアドレスの `@` より後ろの部分(ドメイン部)にも同じ変換ロジックが適用できます。
- 実際にブラウザのアドレスバーに国際化ドメイン名を入力すると、多くのブラウザは内部的にPunycodeへ変換した上でDNS解決を行っています。
こんなときに使えます
日本語ドメインを登録・設定する
DNS の設定ファイルやサーバー証明書には Punycode 表記が必要になることがあります。
メールの送信元を確認する
**表示名が正規に見えても、Punycode に直すと別のドメインだった**という例は実在します。
ログに現れた xn-- を読む
アクセスログやレポートに出てきた `xn--` の文字列が何を指すかを調べられます。
設定ファイルを検証する
nginx や Apache の設定で、IDN をそのまま書いてよいかの確認に使えます。
Punycode の用語
- Punycode
- Unicode 文字列を ASCII 文字列へ可逆的に変換する方式です(RFC 3492)。**変換結果は必ず `xn--` で始まります。**
- IDN(国際化ドメイン名)
- ASCII 以外の文字を含むドメイン名です。内部的には Punycode へ変換されて DNS を通ります。
- xn--
- Punycode で符号化されたラベルであることを示す接頭辞です。ACE prefix と呼ばれます。
- ラベル
- ドメイン名をドットで区切った各要素です。**変換はラベルごとに行われます。**
- ホモグラフ攻撃
- 見た目のよく似た別の文字を使って偽のドメインを作る手口です。**Punycode 表記に直すと見破れます。**
- IDNA
- IDN を DNS で扱うための一連の仕様です。現在は IDNA2008(RFC 5890 以降)が用いられます。
よくある質問
余談ですが ― 「猫」「日本語」がドメイン名になるまでの舞台裏
国際化ドメイン名(IDN)の議論は1990年代後半から始まりましたが、標準化までには長い時間がかかりました。DNSの根幹を変更せずに非ASCII文字を扱う方法として複数の方式が提案されましたが、最終的に「アプリケーション層(クライアント側)でエンコード・デコードを行い、DNSサーバー自体は変更しない」というPunycode方式(2003年にRFC 3492として標準化)が採用されました。
Punycodeという名前は「Unicode」と「An amusing pun(ちょっとした駄洒落)」に由来するとされ、アルゴリズム自体はBootstring(IBMの研究者らが考案した、任意の文字集合を制限された文字集合にエンコードする汎用手法)という、より一般的なエンコーディング手法をドメイン名向けに特化させたものです。Punycodeという名前の由来自体がジョーク混じりであるところに、開発者コミュニティらしいユーモアが感じられます。
現在、日本語ドメイン(`.jp`)や絵文字ドメイン(`💩.la`のような実例も存在します)など、様々な言語・記号を使ったドメイン名が実際に登録・運用されていますが、その裏側では必ずこのPunycodeによる変換処理が行われています。ブラウザのアドレスバーに表示される美しい日本語ドメインも、DNSサーバーとの通信では地道な`xn--`から始まるASCII文字列としてやり取りされているのです。