web-dev-qa-db-ja.com

CER / P7b証明書を使用したJBossHttps設定が失敗する

私の質問はこれに似ています: 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証明書でも試したときに、同様の問題が発生しました。これまでうまくいったのは、証明書が手動で生成された場合、つまり自己署名証明書だけでした。そして、これは明らかに組織の前進戦略ではありません

ここで何が欠けているのか教えてください。私が上に含めた同様の投稿は、私が関連付けることができない証明書のみでキーではないシナリオを示唆しているようです。

私はこれを複数の場所に投稿しており、現時点では何の回答もありませんので、どんなポインタもきっと役に立ちます。

ありがとう、パヴァン。

2
Pavan Dittakavi

いいえ、キーストアに秘密鍵が含まれていません。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では、代わりにさまざまなタイプのキーストアエントリがあります。ただし、一部のキーストアでは、これらのタイプは実際には直接格納されません。

3