私の質問はこれに似ています: Tomcatはキーストアでキーエントリを見つけることができません
以下のコマンドを使用してJKSにインポートしたCERファイルがあります。
keytool -importcert -file codesign_Base64.cer -keystore imported_keystore.jks -alias my_alias
次に、jBossのstandalone.xmlに以下の設定行があります。
<subsystem xmlns="urn:jboss:domain:web:1.1" native="false" default-virtual-server="default-Host">
<connector name="http" protocol="HTTP/1.1" scheme="http" socket-binding="http" redirect-port="8443"/>
<connector name="https" protocol="HTTP/1.1" scheme="https" socket-binding="https" enable-lookups="false" secure="true">
<ssl name="ssl" key-alias="my_alias " password="change_this" certificate-key-file="C:\Programs\Siemens\JBoss7.1.0\domain\configuration\imported_keystore.jks " protocol="TLSv1" verify-client="false"/>
</connector>
<virtual-server name="default-Host" enable-welcome-root="false">
<alias name="localhost"/>
<alias name="example.com"/>
</virtual-server>
</subsystem>
これで、アプリケーションを起動しようとすると、jBossログファイルにこの種のエラーを示す次のエラーメッセージが表示されます。
11:46:19,692 ERROR [org.Apache.coyote.http11.Http11Protocol] (MSC service thread 1-4) Error initializing endpoint: Java.io.IOException: Alias name mykey does not identify a key entry
at org.Apache.Tomcat.util.net.jsse.JSSESocketFactory.getKeyManagers(JSSESocketFactory.Java:517) [jbossweb-7.0.10.Final.jar:]
at org.Apache.Tomcat.util.net.jsse.JSSESocketFactory.init(JSSESocketFactory.Java:452) [jbossweb-7.0.10.Final.jar:]
at org.Apache.Tomcat.util.net.jsse.JSSESocketFactory.createSocket(JSSESocketFactory.Java:168) [jbossweb-7.0.10.Final.jar:]
at org.Apache.Tomcat.util.net.JIoEndpoint.init(JIoEndpoint.Java:977) [jbossweb-7.0.10.Final.jar:]
at org.Apache.coyote.http11.Http11Protocol.init(Http11Protocol.Java:190) [jbossweb-7.0.10.Final.jar:]
at org.Apache.catalina.connector.Connector.init(Connector.Java:983) [jbossweb-7.0.10.Final.jar:]
at org.jboss.as.web.WebConnectorService.start(WebConnectorService.Java:267) [jboss-as-web-7.1.0.Final.jar:7.1.0.Final]
at org.jboss.msc.service.ServiceControllerImpl$StartTask.startService(ServiceControllerImpl.Java:1811) [jboss-msc-1.0.2.GA.jar:1.0.2.GA]
at org.jboss.msc.service.ServiceControllerImpl$StartTask.run(ServiceControllerImpl.Java:1746) [jboss-msc-1.0.2.GA.jar:1.0.2.GA]
at Java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.Java:1145) [rt.jar:1.7.0_75]
at Java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.Java:615) [rt.jar:1.7.0_75]
at Java.lang.Thread.run(Thread.Java:745) [rt.jar:1.7.0_75]
しかし、Javaキーストアの内容を調べると、適切なキーの存在を確認できます。
C:\Programs\Siemens\JBoss7.1.0\domain\configuration>keytool -list -keystore C:\Programs\Siemens\JBoss7.1.0\domain\configuration\winstore.jks
Enter keystore password:
Keystore type: JKS
Keystore provider: Sun
Your keystore contains 1 entry
my_alias, Jun 23, 2017, trustedCertEntry,
Certificate fingerprint (SHA1): 8D:64:10:8B:F6:0D:1E:17:01:52:1C:97:8A:89:75:80:2D:2F:45:6B
P7B証明書でも試したときに、同様の問題が発生しました。これまでうまくいったのは、証明書が手動で生成された場合、つまり自己署名証明書だけでした。そして、これは明らかに組織の前進戦略ではありません
ここで何が欠けているのか教えてください。私が上に含めた同様の投稿は、私が関連付けることができない証明書のみでキーではないシナリオを示唆しているようです。
私はこれを複数の場所に投稿しており、現時点では何の回答もありませんので、どんなポインタもきっと役に立ちます。
ありがとう、パヴァン。
いいえ、キーストアに秘密鍵が含まれていません。trustedCertEntry
と表示されている場所を確認してください。信頼できる証明書は秘密鍵ではなく、単なる証明書であり、証明書は秘密鍵ではありません。 SSL/TLSサーバーには、秘密鍵とそれに対応する証明書チェーンが必要です。証明書だけを使用してプロトコルを実行することはできないため、サーバーはHTTPS接続を受け入れることができず、HTTPSで接続しようとするブラウザー(HTTPSからリダイレクトされた後など)は失敗します。 P7Bには秘密鍵も含まれていませんが、CERには通常1つしか含まれていないのに対し、複数の証明書を含めることができます。 (対照的に、clientは通常、CAの「ルート」証明書のみを必要とし、かなりまれな「クライアント認証」オプションが使用されない限り、秘密鍵は必要ありません。)
privateKeyEntry
が必要です。これには、秘密鍵と、その鍵の証明書チェーンと目的のホスト名の両方が含まれています。 Javaでこれを行うには、(バリアントを使用して)2つの方法があります。
1:keytool
を使用してJKSで新しい秘密鍵(ダミーの自己署名証明書付き)を生成し、そのCSR(証明書署名要求、または単にCert [ificate] Req [uest])を作成します。 CSRや、適切な証明書を取得するための認証局(CA)への支払いなど、必要に応じてその他のものを提出します。通常、クライアントが証明書を信頼するために必要な「チェーン」または「中間」証明書が少なくとも1つ添付されます。 keytool
を使用して、証明書/チェーンを同じJKSと、すでに秘密鍵を含むエントリにインポートします(ダミーの自己署名証明書を置き換えます)。オプションで、チェーン証明書をtrustedcertエントリとしてインポートすることもできます。
方法1は標準的なものであり、CAと再販業者の両方で、これまでに調べたすべての証明書サプライヤーのWebサイトで通常繰り返し説明されています。どうしてそれらすべてを逃したのかわかりません。これらの説明は、最も広く使用されているJavaベースのWebサーバーであるTomcatを指すことが多いことに注意してください。現在Wildflyとブランド化されているJbossWebサーバーコンポーネントは、実際にはTomcatのフォークです。これが最初の2つのグーグルが私を見つけたものです:
* https://www.digicert.com/csr-creation-Java.htm
* https://knowledge.symantec.com/support/ssl-certificates-support/index?page=content&id=INFO227
2A:他のツール(Windows、MacOS、OpenSSLなど)を使用して秘密鍵を生成し、通常はCSRを使用して、CAからチェーンを含む適切な証明書を取得します。必要に応じて、秘密鍵と証明書チェーンをPKCS12ファイル(MicrosoftではPFXとも呼ばれます)にエクスポート/変換/結合し、おそらくkeytool -importkeystore
を使用してPKCS12をJKSに変換します。 (Java 8の場合、多くの場合、PKCS12をJKSに変換せずに直接使用でき、Java 9はこれを促進することが期待されます。)
2B:すでに秘密鍵を生成し、他のツールで適切な証明書/チェーンを取得している場合は、ちょうどそれらをPKCS12に入れておそらく上記のようにJKSに変換します。
Microsoft、MacOS、Firefoxなどの他のGUIは証明書に焦点を当てていることに注意してください。これらのGUIは、信頼できる他の証明書を「証明書」として表示し、秘密鍵と証明書の組み合わせを「証明書と秘密鍵」として表示します。しかし、違いは依然として重要です。サーバーには秘密鍵が必要であり、「証明書なし秘密鍵」を使用しようとすると失敗します。 Javaでは、代わりにさまざまなタイプのキーストアエントリがあります。ただし、一部のキーストアでは、これらのタイプは実際には直接格納されません。