Зачем доменам нужен Punycode
DNS передаёт только буквы, цифры и дефисы в ASCII. Чтобы допустить имена вроде münchen.de или 日本語.jp, каждая не-ASCII метка кодируется в ASCII-строку, начинающуюся с xn--. Браузеры показывают Unicode-форму и резолвят ASCII-форму; сертификаты, файлы зон и большинство API требуют ASCII-форму. Кодирование — это Punycode (RFC 3492), а правила о том, какие символы допустимы и как они нормализуются, — IDNA (RFC 5890–5895, UTS 46).
Как работает Punycode
- Скопируйте ASCII-символы метки как есть, добавив дефис, если они были:
mnchen-. - Закодируйте позиции и кодовые точки не-ASCII символов как последовательность цифр в системе с основанием 36 (a–z, 0–9) по схеме переменной длины, которая оставляет частые случаи короткими:
3yaозначает «вставить ü после первого символа». - Добавьте префикс
xn--:xn--mnchen-3ya.
Результат нечувствителен к регистру и занимает не более 63 байт на метку, как любая метка DNS.
Омографические атаки
Поскольку кириллические а, е, о, р, с выглядят как латинские буквы, xn--80ak6aa92e.com отображается как убедительный apple.com. Браузеры теперь показывают форму xn--, когда метка смешивает письменности или использует схожие символы, а регистратуры ограничивают, какие письменности можно комбинировать. Конвертер по той же причине предупреждает, когда метка смешивает письменности.
Где вы с ним столкнётесь
TLS-сертификаты (SAN должен содержать форму xn--), записи SPF и DKIM, адреса электронной почты (ü@example.de требует SMTPUTF8 и не имеет отношения к IDN), URL в логах и dig, который печатает ASCII-форму.
Вопросы
Что означает xn--?
Это ACE-префикс, помечающий метку, закодированную в Punycode. Любая метка DNS, начинающаяся с xn--, — это интернационализированное имя в ASCII-форме.
В сертификате использовать Unicode-форму или xn--?
Форму xn--, и в CN (если используется), и в subjectAltName. Let’s Encrypt и другие CA принимают Unicode-форму в запросе и конвертируют её.
Почему мой конвертер даёт другой результат для верхнего регистра?
IDNA приводит имена к нижнему регистру и NFC перед кодированием, поэтому MÜNCHEN.de и münchen.de дают одну и ту же метку xn--. Этот инструмент применяет то же отображение.
Можно ли интернационализировать адреса электронной почты?
Доменная часть использует Punycode, как любой домен. Локальная часть до @ может быть в UTF-8 только с SMTPUTF8 (RFC 6531), который поддерживают не все почтовые серверы; Punycode для неё не существует.