Самозаверяющий сертификат: компоненты DNSName должны начинаться с буквы

есть ли способ для keytool java генерировать самозаверяющий сертификат с подстановочным знаком в SAN (альтернативное имя субъекта)? Я использую эту команду для создания хранилища ключей:

keytool -genkey -alias tomcat -storetype JKS -keyalg RSA -keysize 2048 -ext san=dns:*.example.com -keystore "path/to/my/keystore.jks" -validity 3650

но я IOException: DNSName components must begin with a letter

очевидно, что проблема *.example.com в SAN, но я не вижу другого способа создания самозаверяющего сертификата для example.com поддомены.

по данным этой, это должно быть возможно. Это ошибка в моем синтаксисе, ошибка в keytool или я что-то неправильно понял?

кстати, я использую keytool из JDK 1.8 update 60

редактировать мне удалось создать самозаверяющий сертификат для всех example.com поддомены через keytool, указав CN=*.example.com, и оставляя Сан пустой. Тем не менее, я оставлю ответ Омикрона как принятый (поскольку это фактический ответ, а не обход ограничений).

1 ответов


Keytool внутренне использует класс sun.security.x509.DNSName для проверки ввода. DNSName применяет синтаксис, указанный в RFC 1034. Цитата из его комментария Javadoc:

имя должно быть в "предпочтительном синтаксисе имени", как указано RFC 1034.

предпочтительный синтаксис имя:

<domain> ::= <subdomain> | " "
<subdomain> ::= <label> | <subdomain> "." <label>
<label> ::= <letter> [ [ <ldh-str> ] <let-dig> ]
<ldh-str> ::= <let-dig-hyp> | <let-dig-hyp> <ldh-str>
<let-dig-hyp> ::= <let-dig> | "-"
<let-dig> ::= <letter> | <digit>
<letter> ::= any one of the 52 alphabetic characters A through Z in
upper case and a through z in lower case
<digit> ::= any one of the ten digits 0 through 9

поэтому в соответствии с этим синтаксисом доменные имена должны начинаться с буквы (A-Z, a-z).

более новые RFCs (например RFC 2181, RFC 1123) ослабляют эти ограничения, поэтому это можно считать ошибкой в Java. Уже есть несколько связанных сообщений об ошибках:

https://bugs.openjdk.java.net/browse/JDK-8016345
https://bugs.openjdk.java.net/browse/JDK-8007706

Итак, ответ нет, в настоящее время нет способа создать расширение подстановочного знака SAN с помощью keytool.

но вы могли бы использовать хранилище Исследователь!--4--> для этого. Это в основном keytool с GUI и не применяет эти ограничения.