WildFly 發送私鑰而不是證書
我正在嘗試將在 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
- 轉換
p7b
為cer
:openssl 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 證書序列,它們也可以工作。