Ssl

帶有 CER/P7b 證書的 JBoss Https 配置失敗

  • June 28, 2017

我的問題與此類似:Tomcat failed to find a key entry in keystore

我有一個 CER 文件,我使用以下命令將其導入 JKS:

keytool -importcert -file codesign_Base64.cer -keystore imported_keystore.jks -alias my_alias

然後我在standalone.xml 中為jBoss 提供了以下配置行。

<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 通常只包含一個。(相比之下,客戶端通常只需要 CA ‘root’ 證書,不需要私鑰,除非使用了相當罕見的 ‘client authentication’ 選項。)

**您需要一個privateKeyEntry包含私鑰和該密鑰的證書鏈以及您想要的主機名的證書鏈。**對於 Java,有兩種方法(帶有變體)可以做到這一點:

1:用於keytool在 JKS 中生成新的私鑰(帶有虛擬自簽名證書)並創建 CSR(證書籤名請求,或只是證書)

$$ ificate $$請求$$ uest $$) 為了它。根據需要送出 CSR 和其他東西,例如向證書頒發機構 (CA) 付款以獲得合適的證書,通常伴隨著客戶信任證書可能需要的至少一個“鏈”或“中間”證書。用於keytool將證書/鏈導入到相同的 JKS 和已包含私鑰的條目中(替換虛擬自簽名證書);可選地,您還可以將鏈證書作為受信任的證書條目導入。 方法 1 是規範的,通常在我見過的每個證書供應商的網站上反复描述,包括 CA 和經銷商;我不知道你是怎麼想念他們的。請注意,這些描述通常指的是最廣泛使用的基於 Java 的網路伺服器 Tomcat;Jboss webserver 組件,現在被命名為 Wildfly,實際上是 Tomcat 的一個分支。這是Google找到我的前兩個:

2A:使用其他工具(如 Windows 或 MacOS 或 OpenSSL)生成私鑰,並從 CA 及其鏈中獲取合適的證書,通常使用 CSR。如果適用,將私鑰和證書鏈導出/轉換/組合成 PKCS12 文件(在 Microsoft 領域也稱為 PFX),然後可能keytool -importkeystore用於將 PKCS12 轉換為 JKS。(在許多情況下,在 Java 8 中,您實際上可以直接使用 PKCS12,而無需將其轉換為 JKS,預計 Java 9 會鼓勵這樣做。)

2B:如果您已經生成了私鑰並使用其他工具獲得了合適的證書/鏈,只需將它們放入 PKCS12 並可能如上所述轉換為 JKS。

請注意,Microsoft、MacOS 和 Firefox 等其他一些 GUI 專注於證書:它們僅將受信任的其他證書顯示為“證書”,並將私鑰加證書組合顯示為“帶有私鑰的證書”。但差異仍然至關重要。伺服器必須具有私鑰,並且嘗試使用“沒有私鑰的證書”失敗。相反,Java 有不同類型的密鑰庫條目——儘管對於某些密鑰庫,這些類型實際上並不是直接儲存的。

引用自:https://serverfault.com/questions/858102