将证书导入Spring的问题

时间:2017-10-09 12:20:46

标签: 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 =生成的p12文件

     

private.pem =私钥

     

server_cert.pem =服务器的证书文件

我得到的错误是:

  

没有证书与私钥匹配。

现在我的问题:

  1. 应该使用谁的私钥从PEM文件生成P12文件?
  2. 如果使用客户端的私钥生成p12,它怎么可能与证书匹配(错误信息变得明显)?
  3. 为什么我需要 我的 私钥与服务器通信?根据我的理解,在SSL会话期间,客户端的私钥不会出现在图片中。或者我的理解错了吗?
  4. 如果服务器的私钥用于生成p12,为什么要共享它?
  5. 我是新手,因此欢迎任何链接/建议阅读/来源/答案。

1 个答案:

答案 0 :(得分:1)

如果你看一下client-authentication如何运作,在谈判阶段'中,最后一点的第二点说:

  

客户端发送 CertificateVerify 消息,该消息是使用客户端证书的私钥对先前握手消息的签名。可以使用客户端证书的公钥来验证此签名。这使服务器知道客户端可以访问证书的私钥,从而拥有证书。

所以回答你的问题:

  1. 您应该使用提供给您的私钥。
  2. PKCS12 是一种Java KeyStore,类似于标准的JKS。它可以包含密钥对的列表。但PKCS12的互联网标准是具有仅1 密钥对条目,即具有其相关证书链的1私钥。由于私钥和证书链是作为单独的实体提供给您的,因此您应该自己构建PKCS12,您将在代码中使用它来向您提供服务的服务器验证您的客户端。
  3. 如果您查看协议级别握手的步骤,您应该看到客户端的私钥(您的私钥)用于签署一些数据并发送到服务器,服务器将根据您的公钥验证邮件的真实性。一旦服务器验证了该消息,就会得出您拥有私钥的结论。
  4. 您不会获得服务器私钥。您将获得(用户)私钥,您可以保护它并且不应该给任何人。
  5. 使用私钥和证书链构建p12时可能会丢失某些内容或发生微不足道的错误,这会导致失败。如果它没有成功,你也可以通过编程方式使用KeyStore api构建p12。