概略
ホスト名にアンダースコアが使われているケースを、特に開発環境などで稀に見かけることがあります。
DNSのホスト名は 英文字、数字、ハイフンのみが使えますが、HTTPの場合はアンダースコアが使われているホスト名でもアクセスができてしまうことがあるため、気付かれにくいのかもしれません。しかし TLS接続の場合は許容されません。ホスト名に許容されていない文字を用いると、本番実装時にアクセスできない問題に繋がります。
実際に筆者もそのトラブルに巻き込まれたこともあります。
本稿では、ホスト名にアンダースコアを行わないように注意喚起を込めて、勧告されている文書などを元に解説します。
本稿に記載した内容は、個人的な見解を示したものであり、筆者の所属する企業・団体の公式見解ではありません。
TLSアクセスでの挙動の違い
同じサーバーに test.example.jp と test_test.example.jp の2つのホスト名を設定した場合、前者への TLSアクセスはできるものの、後者へのアクセスはできません。
$ curl https://test_test.example.jp:4443/ --insecure curl: (35) OpenSSL/3.0.13: error:0A000417:SSL routines::sslv3 alert illegal parameter
--insecureオプションは証明書検証を無効化するだけで、SNI などハンドシェイクの要件は無効化しません。SNI の host_name は「DNSホスト名」しか受け付けないため、_ を含む名前はサーバーやミドルウェア実装によってハンドシェイクする段階で拒否され、上記のように illegal parameter で失敗します。
多くの HTTPサーバーやリバースプロキシーは Hostヘッダーの構文を厳密に検証しないことがあり、_を含む値でも仮想ホストに振り分けられてしまう場合があります。しかし、HTTPSの仕様はより厳密になっているのです。そのため「HTTPでは問題ないのに、HTTPSだと繋がらない」という現象が生じます。
DNSにおけるラベルとホスト名
DNSのラベル(ドットで区切られる各部分)は、プロトコル上は「長さ制限(63オクテット)」などの制約はありますが任意のバイナリ列が認められています。(RFC2181) ですので _sip._tcp.example.comのようなSRVレコードや、_dmarc.example.orgのようなDMARCのためのTXTレコードに _が使われています。
一方で、ホスト名については、英文字・数字・ハイフンのみを使う、いわゆる LDHルール(Letters/Digits/Hyphen)に従うことが求められ、_ は認められていません。この点はRFC952やRFC1035で明言されています。
URIのホスト名
URI の文法 RFC3986 では、host = IP-literal / IPv4address / reg-name と定義されており、reg-name は unreserved(英数・- . _ ~)などを許容します。つまり純粋な文法上は _ を含む reg-name も書けるのですが、HTTP(S) の実運用では最終的に DNS/TLS のホスト名要件に突き当たるため、_ を含むホストを指定しても解決や接続で問題になりがちです。
ですが、書けることと使えることは別です。HTTPSを使うなら DNSのホスト名構文(LDH) に合わせるのが実務上の正解だと考えます。
TLS証明書におけるホスト名
TLSサーバー証明書の subjectAltName(dNSName)でも、アンダースコアは不可です。認証局の業界団体である CA/Browser Forumが公開している証明書の要件Baseline Requirements では2018年11月に採択されたバージョン 1.6.2で dNSName の _ の禁止が明記されました。2019年までの移行措置を経てすでに新規発行は禁止となっています。1
また、SNI(Server Name Indication)も、DNSのホスト名のみが認められます。RFC6066
Windowsにおけるホスト名
Windowsの NetBIOSにおけるコンピューター名ではアンダースコアの使用は禁止されていませんでしたが、現在のMicrosoftのドキュメントでは、コンピューター名とDNSホスト名は同一である必要があるため、DNSホスト名としての制約に従うことが記されています2。
理由はわかりませんが Windows 2000 のDNSでは、設定によってRFCに準拠しないアンダースコアの利用が認められていたようです3ので、古い実装を使っていた方は誤解している人もいるかも知れません。NetBIOSと現在の Windowsのコンピューター名の関係については、別の機会に詳しく記したいと思います。
最後に
一部の環境ではアンダースコアを含むホスト名で通信が成り立つケースもありますが、DNSやTLSのルール上ではそれは認められていません。予期しないトラブルを避けるためにも、 設計段階からLDHルールを満たすホスト名にする ことを推奨します。
| 箇所 | アンダースコアの利用 |
|---|---|
| DNSのラベル | 可(ラベル自体は任意バイト列) |
| DNSのホスト名 | 不可 (LDHルール) |
| URIのホスト名 | 文法としては可 |
| TLS証明書のSNI | 不可 (DNSホスト名のみ) |
| TLS証明書のSAN | 不可 |