web-dev-qa-db-ja.com

Keytool ServerAlternateName

社内でのJira/Confluenceの導入に適した証明書を取得しようとしています。人々は、ホスト名またはFQDNから、異なる方法でそれらにアクセスします。 Java 7のキーツールを使用しているので、サーバーの別名機能にアクセスできます。

-ext san=dns:jira

...そして私はそれを渡します...

jira.example.com

...証明書を生成するときのCNとして。次に、署名要求を生成し、CSRをWin2k8r2 PKIに引き渡してcertreqを取得し、鍵に署名を取得して、鍵を鍵ストアにインポートします。

上記で述べたように設定すると、私のブラウザー(Chrome、Firefox、Safari)はjiraが唯一の有効な名前であると考えているようです。証明書を検査すると、CNはFQDNを示しています。

extをドロップすると、FQDNであるCNが使用されます。

複数のextステートメントがある場合、それは最後のステートメントを使用するだけで、1つのextエントリの下に複数のDNS:fooをさまざまな句読点とともに文字列化しようとしました。

私が遭遇したもう1つの角度は、FQDNに対して301を実行するようにWebサーバーをセットアップすることです。私もこれで大丈夫ですが、Tomcatに悩まされているため、「Apache/nginxへの切り替え」は機能しません。 これ は、Tomcatでそのようなことをするために出くわした唯一のドキュメントのようですが、3歳になり、1日の終わりです。彼らはその機能をTomcat6に追加しましたか?

6
Tawm

私はこの質問がかなり古いことに気づきましたが、それが役立つと思うかもしれない人のために、私が何がうまくいくかについて言及します:

  • cNを使用して「私たちのクールなJIRAサーバー」のような人間にわかりやすい名前を入力してください;-)
  • 次のようにsanを入力してください:-ext san=dns:jira,dns:jira.example.com

ところで、必要に応じてIPアドレスを追加することもできます。私は個人的に開発用コンピューターに次のものを使用しています:

keytool -certreq ... -file server.csr -keystore server.keystore ... -ext san=dns:localhost,dns:myComputerName,ip:127.0.0.1,ip:::1

注:私はJava8 keytoolを使用しています。これがJava7 keytoolでも機能することを願っていますが、テストしていません

14
tomorrow

OpenSSL を使用し、keytoolを使用しないでマルチドメイン証明書を生成し、キーと証明書をJavaで使用するキーストアに変換しますTomcat。次の例は自己署名証明書を生成しますが、「実際の」証明書に適合させるのは簡単です。

上記のリンクのガイドに従ってopenssl.cnfを生成し、次のコマンドを実行します。

# Generates a self-signed certificate + key, omit if you already have one
openssl req -config openssl.cnf -x509 -days 3650 -newkey rsa:2048 \
   -out self-signed-certificate.pem -keyout pub-sec-key.pem
# Remove passphrase from key
openssl rsa -in pub-sec-key.pem -out new.key
# Generate PKCS12 keystore
openssl pkcs12 -export -keypbe PBE-SHA1-3DES -certpbe PBE-SHA1-3DES \
   -export -in self-signed-certificate.pem -inkey new.key -name alias \
   -out keystore.p12
# Convert PKCS12 to JKS
keytool -importkeystore -destkeystore keystore.jks -deststoretype JKS \
   -srcstoretype PKCS12 -srckeystore keystore.p12

alias値に注意して-name上記の例では。これは、Tomcatに渡す必要がある証明書の名前です。

完了のために、SANでの証明書の発行が認証局とどのように連携するかを示します。

SAN                     = email:copy

...

[ v3_req ]
basicConstraints = CA:FALSE
keyUsage = nonRepudiation, digitalSignature, keyEncipherment
subjectAltName=${ENV::SAN}
subjectKeyIdentifier=hash
authorityKeyIdentifier=keyid,issuer

次のコマンドを実行して、SANを含むKey + CSR(テストされていない)を生成します。

SAN="DNS: domain1.example.com, DNS: domain2.example.com" openssl req \
   -config /path/to/openssl.conf \
   -subj "/C=XX/ST=XX/L=xxx/O=My Org/OU=My OU/CN=main.example.com" \
   -newkey rsa:2048 -out file.csr -keyout out.key \
   -infiles /path/to/csr/file.csr

次のコマンドを実行して証明書を発行します。

SAN="DNS: domain1.example.com, DNS: domain2.example.com" openssl ca \
   -config /path/to/openssl.conf -policy policy_anything \
   -subj "/C=XX/ST=XX/L=xxx/O=My Org/OU=My OU/CN=main.example.com" \
   -infiles /path/to/csr/file.csr
1
fuero

CSRにSAN=サブジェクトの代替名が埋め込まれていることを確認するには、keytoolを使用してCSRを印刷します。

keytool -printcertreq -file test.csr

うまくいった場合、次のような結果になります。

#1: ObjectId: 2.5.29.17 Criticality=false
SubjectAlternativeName [
  DNSName: test.example.com
  DNSName: test
]

注-上記の2つのエントリ(test.example.comとtest)を取得するには、「明日」の回答に「-ext san = dns:test.example.com、dns:test」と記載されているようにCSRを作成する必要がありました。 」.

コマンドラインで0個以上の「-ext」エントリを渡すことができることを示す、誤解を招くkeytoolのドキュメント[{-ext ext} *]には従わないでください。

-ext san=dns:test.example.com -ext san=dns:test

これは機能せず、最後の拡張DNSエントリ(san = dns:test)のみを取得します。

0
DocOc