web-dev-qa-db-ja.com

自己署名証明書:DNSNameコンポーネントは文字で始まる必要があります

JavaのkeytoolがSAN(Subject Alternative Name))にワイルドカードを使用して自己署名証明書を生成する方法はありますか?このコマンドを使用してキーストアを生成しています:

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を取得します

明らかに、問題はSANの*.example.comですが、example.comサブドメインの自己署名証明書を生成する他の方法は見当たりません。

this によると、それは可能であるはずです。構文のエラー、keytoolのバグ、または何かを誤解しましたか?

ところで、私はJDK 1.8 update60のkeytoolを使用しています

[〜#〜] edit [〜#〜]example.comを指定し、=を残すことで、keytoolを介してすべてのCN=*.example.comサブドメインの自己署名証明書を生成できました。 SAN空。それでも、Omikronの回答は受け入れられたままにしておきます(これは実際の回答であり、制限のバイパスではないため)。

12
zkristic

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 2181RFC 112 )はこれらの制限を緩和しているため、これはJavaのバグと見なすことができます。関連するバグレポートがすでにいくつかあります。

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

したがって、答えはノーです。現在、keytoolを使用してワイルドカードSAN拡張機能を作成する方法はありません。

ただし、これを行うには KeyStore Explorer を使用できます。これは基本的にGUIを備えたキーツールであり、これらの制限を強制しません。

20
Omikron