2017-10-09 124 views
0

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

我的应用程序是在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,他们为什么要共享它?

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

+0

你从哪里得到你的'server_cert.pem'?当您获得用于连接服务器的私钥时,您还应该获得签名证书。从这个文件的名字看来,你使用的是server_cert.pem,我假设它只包含服务器的证书,而不是你的证书。您应该使用已签名供您使用的证书进行操作。 –

+0

服务器开发人员将其提供给将要呼叫其端点的所有客户端。 –

+0

一般来说,大部分时间'p12'都会发给客户。你有没有试过问他们一个p12?当你双击pem时,系统证书查看器打开。叶证书说什么?查找SubjectDN,IssuerDN,SubjectAltName等属性。这应该给你一个想法,如果你有正确的证书。 –

回答

1

如果您怎么看待client-authentication的作品,在“谈判阶段”,从最后一个点的第二个说:

客户端发送一个CertificateVerify消息,这是比上签名使用客户端证书的私钥握手消息。可以使用客户端证书的公钥来验证此签名。这让服务器知道客户端可以访问证书的私钥并拥有证书。

因此,要回答你的问题:

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

在使用私钥和证书链进行p12构建时,可能会有某些缺失或微不足道的错误,这会导致失败。如果不能解决问题,你也可以通过编程方式使用KeyStore API构建p12。