近乎欺骗Java SSLHandshakeException:没有共同的密码套件
HTTPS 服务器需要私钥和匹配的证书,并且根据证书的颁发方式,服务器可能还需要“链”或“中间”证书(有时不止一个)。您导入了only一个证书还不够。
首先查看你的文件it_issued_cert.cer
查看它是否为 PEM 格式:它是否包含分组为行的所有可读字符,并且至少有一个块以一行开头
-----BEGIN sometype_in_caps-----
然后是一些完全由字母、数字、加号组成的行+
和斜线/
也许等于=
最后,最后一行
-----END same_type----
?
如果 PEM 并且至少有两个块,其中一个具有类型[RSA|DSA|EC|ENCRYPTED] PRIVATE KEY
而其他人有类型[X.509|maybesomethingelse] CERTIFICATE
,可以使用OpenSSL转换为PKCS12,然后使用keytool转换为JKS。首先检查是否需要任何“链”或“中间”证书:如果文件已经包含多个证书并且不是由完整的傻瓜准备的,那么这些多个证书形成所需的 chai,则继续。如果文件仅包含一个证书,请使用openssl x509 -in $file -noout -subject -issuer
确保主题是您的服务器并查看发行者;如果颁发者是您环境中信任的 CA(例如“我的公司 CA”),请继续。否则,如果需要任何链证书,请询问 IT 人员怎么办,获取 PEM 格式的证书,并将其添加到文件中。然后做:
openssl pkcs12 -export -in $file -out new.p12 -friendlyname alias_you_want
(编辑)自 8u60(2015 年 - 甚至在我写原始答案之前)开始,Java 默认接受 PKCS12 密钥库,如果配置,早期版本可以这样做。对于需要 JKS 的早期版本,请执行以下操作(拼写已更正,如 aszahran 所评论):
keytool -importkeystore -srckeystore new.p12 -srcstoretype pkcs12 -destkeystore new.jks
# on Java versions that need JKS, it is the default type
# but can specify -deststoretype jks if you want
如果文件是 PEM,但只有一个块的类型为 CERTIFICATE,或者如果文件根本不是 PEM,则该证书必须是为了响应某人的 CSR(证书签名请求)而颁发的:
如果您向他们提供了 CSR,请提供详细信息(编辑您的问题)您生成 CSR 的方式和地点。这就是私钥所在的位置,您需要使用该密钥、复制它或转换(并复制)它,具体取决于您所做的操作。
如果您没有向他们提供 CSR,请询问他们从哪里获得的。如果他们自己生成密钥和 CSR,请向他们索要 PEM 格式的密钥。如果他们从其他人那里获得了 CSR,请向其他人索要 PEM 格式的密钥。获取后,将其添加到文件中,然后返回到上面的情况。如果他们坚持提供 PEM 格式以外的其他内容,请提供详细信息。
如果没有人拥有该证书的私钥,则该证书无法使用。丢弃它并重新开始。