Ssl

WildFly 發送私鑰而不是證書

  • January 10, 2020

我正在嘗試將在 Docker 中執行的 WildFly 伺服器配置為使用 SSL:

  • 創建了一個私鑰:keytool -genkey -alias axcelpk -keyalg RSA -keystore server.keystore -keysize 2048 -validity 1825
  • 創建了一個企業社會責任:keytool -certreq -alias axcelPK -keystore server.keystore -file axcel.csr
  • 轉換p7bceropenssl pkcs7 -print_certs -inform der -in axcel-B64-chain.p7b -out axcel-B64-chain.cer
  • 將證書添加到密鑰庫:keytool -import -alias axcelCert -trustcacerts -file axcel-B64-chain.cer -keystore server.keystore

Standalone.xml 中的 WildFly 配置已經完成,所以我沒有碰它(確實檢查過,看起來沒問題)。

從伺服器請求頁面時,我得到一個Certificate error. 檢查證書時,我注意到我得到的是私鑰的 SHA256 指紋,而不是實際證書的指紋。另外發行人不正確,證書路徑基本上是空的。

有任何想法嗎?

TLDR:這不是私鑰,而是自簽名證書

儘管您沒有這麼說(或顯示),但我猜您keytool -list在密鑰庫上做了並看到了兩個條目,一個 privateKeyEntry 和一個trustedCertEntry,每個條目都有一個指紋。privateKeyEntry 上的指紋不是私鑰的指紋;它是儲存在 privateKeyEntry中的(第一個)證書的指紋。在您的情況下,這是作為操作的一部分生成的虛擬自簽名證書-genkey,因為您隨後沒有按照應有的方式替換它。例如自簽名證書始終具有等於主題的頒發者(而不是像真正的 CA 證書那樣設置為真正的 CA)。

Java SSL/TLS 伺服器使用 privateKeyEntry 中的證書,並且/任何接收此證書的客戶端應該 (1) 不信任它,並顯示錯誤或警告表明它不受信任和 (2) 顯示它是它自己的沒有父母的認證路徑(即單身,不是空的)。SSL/TLS 伺服器無法發送私鑰;協議不允許這樣做,因為這將是完全不安全和愚蠢的。

在您的第四步中,keytool -import在 CA 提供的證書鏈上使用與您用於操作的相同別名-genkey,這裡axcelpk不是不同的別名。請注意,您實際上並不需要您的第三步;將 CA 響應(即您自己的證書鏈)導入私鑰條目時,keytool(更一般地說CertificateFactory)可以直接讀取 PEM 或 DER 中的 p7b。儘管如果您想擁有 OpenSSL 支持的 PEM 證書序列,或者不支持的 DER 證書序列,它們也可以工作。

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