WildFly 发送私钥而不是证书

WildFly 发送私钥而不是证书

我正在尝试配置在 Docker 中运行的 WildFly 服务器以使用 SSL:

  • 创建了一个私钥:keytool -genkey -alias axcelpk -keyalg RSA -keystore server.keystore -keysize 2048 -validity 1825
  • 创建了 CSR: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 指纹,而不是实际证书的指纹。此外,颁发者不正确,认证路径基本上是空的。

有任何想法吗?

答案1

TLDR:这不是私钥,而是自签名证书

虽然你没有这么说(或展示),但我猜你keytool -list在密钥库上看到了两个条目,一个是 privateKeyEntry,另一个是 trustCertEntry,每个条目都有一个指纹。 privateKeyEntry 上的指纹不是私钥的指纹;它是(第一个)的指纹证书存储在 privateKeyEntry 中。在您的情况下,这是作为操作的一部分生成的虚拟自签名证书-genkey,因为您随后没有像应该做的那样替换它。例如,自签名证书的颁发者始终等于主题(并且不是设置为真正的 CA,就像真正的 CA 证书一样)。

Java SSL/TLS 服务器使用 privateKeyEntry 中的证书,并且接收此证书的任何客户端都应 (1) 不信任它,并显示错误或警告,表明它不受信任,并且 (2) 将其显示为没有父级的自己的认证路径(即单例,非空)。SSL/TLS 服务器不可能发送私钥;协议不允许这样做,因为这完全不安全且愚蠢。

在第四步中,使用keytool -importCA 提供的证书链相同的别名-genkey您在此处用于操作axcelpk的别名,而不是不同的别名。请注意,您实际上不需要第三步;导入 CA 响应(即您的自己的证书链)到私钥条目,keytool(更一般地CertificateFactory)可以直接读取 PEM 或 DER 格式的 p7b。不过,如果您想要 OpenSSL 支持的 PEM 证书序列或不支持的 DER 证书序列,这些也可以。

相关内容