まいどどーも

今日、職場のおねーさんから「Let'sEncryptでアンダースコアを使ったFQDNが通らない」という問い合わせがありまして。
そういえばkusanagiコマンド側には厳密なFQDNのチェックは実装されてないなー、と思って、Let'sEncryptのソースコード読んでみました。

2016.05.09追記
みんめもの中のおねーさん、引用ありがとーございます。(謝

■Let'sEncryptで使えるFQDN

Let's Encryptでは、FQDNに以下のような制限があります。
  • TLD : 「a-z 2~63文字」
  • Domain Name : 「a-z 0-9 ハイフン 1~63文字 + ドット」の繰り返し
    但し最初と最後にハイフンは使えない。
  • サブドメインの階層・FQDN全体の長さの制限なし

使えないFQDNの例

mikumo_anzu.conoha.jp(アンダースコアは使用できません)
hatsune.3939(TLDに数字は使えません)
nyanpasu-.com(ドメイン名の前後にハイフンは使えません)
192.168.0.1(IPアドレスはFQDNではありません)
localhost(TLDのみのFQDNは使えません)

アンダースコアが使えない理由

現実には使えしまっているアンダースコアですが、Let'sEncryptで使えない理由は以下にありました。
Requested domain is not a FQDN
https://community.letsencrypt.org/t/requested-domain-is-not-a-fqdn/8112


RFC1123で定義されてる文字しか使えないよ!
注)RFC1123日本語訳はこちら

・・・はい、ごもっともです。

 2.1 ホスト名と番号

      正しいインターネットホスト名のシンタックスは、RFC-952 [DNS:4] で
      規定されている。ホスト名のシンタックスの一面について、ここで修正
      する。一番目の文字に対する制限を緩和し、文字か数字のいずれかを認
      める。ホストソフトウェアは、このより寛容なシンタックスをサポート
      しなければならない (MUST)。
      ホストソフトウエアは、最大 63 文字のホスト名を扱わなければならず
      (MUST)、最大 255 文字までのホスト名を扱うべきである (SHOULD)。
これを読むと、RFC-592について本来は議論しなければいけないようです。
ななめ読みしましたが、やはりアンダースコアはFQDNを表現する要素としては含まれていません。 ・・・結果、RFCよりLet'sEncryptの要件の方が、まだ緩かったです。ゴメンナサイゴメンナサイ…。

■ソースコードの場所

Let'sEncryptはPythonで記述されている為、PerlやPHPを普通に書くことが出来れば読む分には問題ありません。
該当のソースコードは以下の部分です。
/usr/local/letsencrypt/letsencrypt/le_util.py:341
337     # FQDN checks from
338     # http://www.mkyong.com/regular-expressions/domain-name-regular-expression-example/
339     #  Characters used, domain parts < 63 chars, tld > 1 < 64 chars
340     #  first and last char is not "-"
341     fqdn = re.compile("^((?!-)[A-Za-z0-9-]{1,63}(?<!-)\\.)+[A-Za-z]{2,63}$")
342     if not fqdn.match(domain):
343         raise errors.ConfigurationError("Requested domain {0} is not a FQDN".format(domain))
344     return domain
注)CMSの処理を回避する為、一部文字を全角に変更しています。

正規表現で書いてあるので、普通に読めますが、丁寧にコメントにも書いてありますね。

お後がよろしいようで。