2012-01-05 13 views
26

私はopensslを使って自己署名証明書を作成しています。私は、生成本命と、このエラーを取得しています: javax.net.ssl.SSLHandshakeException:java.security.cert.CertificateExceptionを本ありませんサブジェクト代替名ssl certsにsubject alernative nameを追加するには?

、誰もが「サブジェクト代替名」を指定する方法を知っていながら、証明書を作成しますか? これは私がキーストアを作成しています方法です:

sudo $JAVA_HOME/bin/keytool -genkey -dname "CN=192.168.x.xxx, OU=I, O=I, L=T, ST=On, C=CA" -alias tomcat -validity 3650 -keyalg RSA -keystore /root/.keystore -keypass abcd -storepass abcd 

は、鍵を生成するには:

openssl s_client -connect 192.168.x.xxx:8443 2>/dev/null 

助けてください!ありがとう!

+0

可能重複[?SSL証明書のサーバー名が解決されているどのように/私はkeytoolを使用して代替名を追加することができます]( http://stackoverflow.com/questions/8443081/how-are-ssl-certificate-server-names-resolved-can-i-add-alternative-names-using) – Bruno

+0

@サファイア:私はあなたの問題を理解していません。サブジェクト代替名はX.509証明書で必須の拡張子ではありません。したがって、証明書がない場合は問題ありません。それでは、この例外はどうやって取得していますか? – Cratylus

+0

@ user384706この質問をご覧になれますか?なぜ私はこのエラーを投げているのか混乱しています。 [http://stackoverflow.com/questions/8759956/failed-to-create-service-exception-javax-xml-ws-webserviceexception/8760118#8760118] – Sapphire

答えて

37

this questionは、より具体的には、件名AltのIPアドレスに関するものです。名前はコマンドが似ています(ホスト名はDNS、IPアドレスはIP)。自分自身を引用する

あなたがkeytoolを使用している場合は、Java 7, keytoolの するオプションを持っているように(-extのドキュメント の表を参照)サブジェクトの別名を含める:あなたは使用することができます-ext =サンDNS:www.example.comや-ext さん= IP:10.0.0.1

メモのみ、このコマンドを使用するには、Java 7のkeytoolを必要としています。キーストアを準備したら、それは以前のバージョンのJavaで動作するはずです。

(この答えの残りの部分ものOpenSSLでこれを行う方法を述べて、あなたが使用しているものではないようです。)

+0

Java7に変更することはできません。私のJavaコードでsubjectalternidentameチェックをバイパスする方法はありますか? – Sapphire

+3

このチェックを避けてください。私が言ったように、あなたはこの 'keytool'コマンドを使うのにJava 7しか必要としません。それが終わったら、JKSファイルをJava 6(またはそれ以下)のインストールで使用することができます(同じマシン上にある必要はありません)。 OpenSSLを使用して、この(自己署名)証明書を生成することもできます(コマンドと設定は少し複雑かもしれません):OpenSSLで生成されたPEM鍵/証明書を '.p12'ファイルに変換し、キーストアタイプ 'PKCS12'を使用してJavaからキーストアを作成します。また、IPアドレスの代わりにホスト名を使用することもできます.CNから離れることになります。 – Bruno

+0

あなたの提案どおりに代わりにホスト名を使用しました。私はこれを持っています:myhostname.comと一致する名前は見つかりませんでした。 – Sapphire

12

IPおよびDNSの両方がkeytoolの追加の引数で指定することができます'-ext SAN = dns:abc.com、ip:1.1.1.1'

例: keytool -genkeypair -keystoreキーストア-dname "CN =テスト、OU =不明、O =不明、L =不明、ST =不明、C =不明」-keypass keypwd -storepass storepass -keyalg RSA -alias不明-ext SAN = dns:test.abc.com、ip:1.1.1.1

+3

上記のコマンドはCSRを作成しない**ことに注意してください。 Javaのkeytoolは、鍵ストア内に自己署名証明書の形式で鍵ペアを作成し、SAN属性はその自己署名証明書に入ります。 SAN属性を持つCSRを発行する場合は、 'keytool -certreq'に同じ-ext引数を渡す必要があります。面白いのは、keytoolの自己文書化の助けが**-**オプションを含んでいないことです。** keytoolはprocess -extだけうまくいっています。 – avarvit

+0

@avarvitこれは、これらが '-genkeypair'を起動しなくてもCSRにaltNamesを追加できることを意味します。このCSRでCAから証明書を受け取るとどうなりますか? Woule keytoolをインポートして正しい秘密鍵にリンクしますか?これは、それを見逃した証明書にaltNameを追加する可能性がありますか? – eppesuig

+0

完全な例を追加していただきありがとうございます – Tom

3

CSRを生成するときに指定できる-ext属性は再びそれがここにCSR

keytool -certreq -file test.csr -keystore test.jks -alias testAlias -ext SAN=dns:test.example.com 

完全な例では挿入ました:How to create CSR with SANs using keytool

関連する問題