java - 将证书导入 Spring 的问题

标签 java spring ssl certificate public-key-encryption

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

我的应用程序是在 Spring Framework 上编写的,我需要将 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. 为什么我需要我的私钥来与服务器通信?据我了解,在 SSL session 期间,客户端的私钥不会出现在画面中。还是我的理解有误?
  4. 如果使用服务器的私钥生成p12,他们为什么要分享?

我是新手,因此欢迎任何链接/建议阅读/资源/答案。

最佳答案

如果你看看 client-authentication有效,在“谈判阶段”,从最后一点开始的第二个说:

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

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

关于java - 将证书导入 Spring 的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46646327/

相关文章:

java - Spring data rest合并补丁

java - JBoss 上的 Spring 和 session 超时

sockets - 在不修改 header 的情况下重定向 SIP 消息

Firefox 52.4.1 上的 Java Applet "ClassNotFoundException"- 适用于 IE

java - 两个 setContentView() 之一不工作

Java:数组排序

java - 使用 Spring Security 进行 JUnit 测试

ssl - 为什么 Python 请求会忽略 verify 参数?

java - 使用基本身份验证从 Spring Boot 站点将 CSV 加载到 Power Query

java - 我可以将 Spring @bean 定义为 @Repository 或 @Service 吗?