将证书导入 Spring 时出现问题

Issues in importing a certificate to Spring

我想访问服务器的 REST 端点,比如 xyz.com。他们提供了 PEM 格式的证书,我应该在连接到他们的端点时将其包含在我的应用程序中。

我的应用程序是在 Spring 框架上编写的,我需要将 PEM 转换为 P12 格式,因为 Spring 不接受 PEM。这就是我转换的方式:

openssl pkcs12 -export -out certificate.p12 -inkey private.pem -in server_cert.pem

其中,

certificate.p12 = resultant p12 file

private.pem = private key

server_cert.pem = certificate files of the server

我得到的错误是:

No certificate matches private key.

现在我的问题:

  1. 应该使用谁的私钥从 PEM 文件生成 P12 文件?
  2. 如果用client的私钥生成p12,怎么可能和证书匹配(报错很明显)?
  3. 为什么我需要 my 私钥才能与服务器通信?据我了解,在 SSL 会话期间,客户端的私钥不会出现在画面中。还是我的理解有误?
  4. 如果服务器的私钥是用来生成p12的,他们为什么要共享?

我是新手,因此欢迎任何 links/suggested-reading/sources/answers。

如果您查看 client-authentication 的工作原理,在 'Negotiation Phase' 中,倒数第二个是:

The client sends a CertificateVerify message, which is a signature over the previous handshake messages using the client's certificate's private key. This signature can be verified by using the client's certificate's public key. This lets the server know that the client has access to the private key of the certificate and thus owns the certificate.

所以回答你的问题:

  1. 您应该使用提供给您的私钥。
  2. A PKCS12 是一种 Java KeyStore,类似于标准 JKS。它可以包含密钥对列表。但是 PKCS12 的互联网标准是 只有 1 个密钥对条目,即 1 个私钥及其关联的证书链。由于私钥和证书链是作为单独的实体提供给您的,因此您应该自己构建 PKCS12,您将在代码中使用它,以向为您提供服务的服务器验证您的客户端。
  3. 如果您查看协议级别的握手步骤,您应该会看到客户端的私钥(您的私钥)用于签署一些数据并发送到服务器,服务器将在此处根据您的 public 密钥验证消息的真实性。服务器验证消息后,将得出您拥有私钥的结论。
  4. 您不会获得服务器私钥。您将获得您的(用户)私钥,您会保护它并且不应该将其提供给任何人。

当您使用带有私钥和证书链的 p12 进行构建时,可能会丢失一些东西或出现一些小错误,这会导致失败。如果不成功,您还可以使用 KeyStore api 以编程方式构建 p12。