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

Есть ли способ для java keytool сгенерировать самозаверяющий сертификат с подстановочным знаком в 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 и оставив SAN пустым. Тем не менее, я оставлю ответ Омикрона принятым (поскольку это фактический ответ, а не обход ограничений).


person zkristic    schedule 20.11.2015    source источник


Ответы (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).

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

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

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

Но для этого вы можете использовать KeyStore Explorer. По сути, это инструмент для ключей с графическим интерфейсом пользователя, который не применяет эти ограничения.


ОБНОВЛЕНИЕ: это было исправлено в Java 15: https://bugs.openjdk.java.net/browse/JDK-8186143

person Omikron    schedule 21.11.2015
comment
Спасибо, я не большой поклонник SF и размещенных там проектов, поэтому сначала попробую OpenSSL ... В крайнем случае, я воспользуюсь KeyStore Explorer. Ваш ответ отмечен как принятый. Еще раз спасибо. - person zkristic; 22.11.2015
comment
@zkristic Если вам не нравится SF, вы можете скачать ее с GitHub: github.com/kaikramer / keystore-explorer / Release - person Omikron; 23.11.2015
comment
@Omikron, ваша последняя ссылка на ошибку openjdk на самом деле также является ссылкой на проводник хранилища ключей, я предполагаю, что это непреднамеренно и не должно вводить в заблуждение. - person covener; 25.11.2020
comment
Да, они даже демонстрируют исправление в специальном сообщении в блоге: blogs.oracle.com/blogbypuneeth/ - person gavenkoa; 02.12.2020