使用SSL客户端证书加密HTTP请求中的数据

时间:2012-10-05 12:10:35

标签: java authentication ssl x509certificate

我需要能够在RESTful服务中识别用户。我决定使用HTTPS进行客户端证书身份验证,因此它允许其他服务以URL,标题或其他任何方式安全地传递用户或密码。

现在我想加密一些发送回服务的数据。例如,不是发送普通用户ID - 而是使用我自己的服务器密钥加密它并发回。然后服务将发送此(加密)数据,我将能够在本地解密它。

对于此加密,我想使用该服务提供给我的SSL证书。

我猜我的服务器上的证书包含私钥和公钥。所以我可以使用我的服务器端证书的公钥来加密数据,并确保我可以使用服务器端的私钥安全地解密它。第三方服务无法解密数据,因为它只有我服务器端证书的公钥。

现在问题 - 从客户端(HTTPS)获取X509Certificate格式的客户端SSL证书,如何在本地密钥库中找到相应的证书?该证书的格式是什么以及如何从中获取私钥/公钥?

UPD 基本流程:

我想得到什么

  • 服务向REST应用程序发送请求:http://rest.api.com/authenticate/username/password/
  • REST应用程序获取用户名/密码并在数据库中找出用户ID
  • REST应用不希望与服务
  • 共享ID
  • REST应用程序了解SSL服务证书
  • REST应用程序找出相应的公钥,用于加密该服务的传入流量
  • REST应用使用REST应用程序公钥加密ID“123456”并发送响应:{ok:“lybibHubJis7”}
  • 服务向REST应用程序发送请求:http://rest.api.com/lybibHubJis7/dosomething
  • REST应用使用SSL密钥链的​​私钥解密字符串lybibHubJis7,并发现该用户ID为123456,然后对该用户执行操作。

1 个答案:

答案 0 :(得分:1)

试图通过多条评论进入讨论的中间......

  

不是真的。例如服务发送请求:   rest.api.com/authenticate/username/password,然后我回复   JSON中包含字符串123456的内容。然后是服务   会使用rest.api.com/do/123456/whatever。我想要的是隐藏   “123456”来自服务。而且我不想生成一些随机字符串   并将其放入数据库,并保持关系“PreabEdAgIav” - >   有效期的“123456”我想使用自己的公钥,   与服务相关联,加密此123456并获得一些东西   否则,该服务将无法破解。

听起来你要追求的主要是数字签名,不一定是加密(虽然你可以同时加密)。

如果您的身份验证服务为您提供了某种身份验证令牌(123456),而第三方服务是为了后续使用而发送回来的,那么最重要的是,使用服务应该能够验证这一点123456来自该认证服务。由于任何人都可以使用收件人的公钥加密某些内容,因此公钥加密在这方面确实无法提供帮助。

更有意义的是让身份验证服务签署123456令牌及其私钥,以便稍后使用该令牌的服务可以验证它来自前者它识别的身份验证步骤。如果您还想隐藏该令牌,您也可以加密结果,但这似乎不太必要。

有一些标准可以做到这一点,例如SAML,尽管使用HTTP URL绑定会导致相当长的URL。