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

标签 java authentication ssl x509certificate

<分区>

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

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

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

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

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

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 keychain的私钥解密字符串lybibHubJis7,发现用户ID为123456,然后对该用户进行操作。

最佳答案

试图跳入有多个评论的讨论中...

Not really. For example service sent request: rest.api.com/authenticate/username/password, then I reply with something in JSON, containing the string 123456. Then the service would use rest.api.com/do/123456/whatever. What I want is to hide "123456" from service. And I don't want to generate some random string and put it into database, and maintain relation "PreabEdAgIav" -> "123456" with expiration etc. I want to use my own public key, associated with the service, to encrypt this 123456 and get something else, which the service will not be able to break.

听起来您主要追求的是数字签名,不一定是加密(尽管您可以同时拥有两者)。

如果您的身份验证服务为您提供某种身份验证 token (123456),第三方服务会发回以供后续使用,最重要的是消费服务应该能够验证此 123456 确实来自该身份验证服务。由于任何人都可以使用接收者的公钥加密某些内容,因此公钥加密在这里并没有多大帮助。

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

虽然使用 HTTP URL 绑定(bind)会导致相当长的 URL,但有一些标准可以做到这一点,例如 SAML。

关于java - 使用 SSL 客户端证书加密 HTTP 请求中的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12745984/

上一篇:shell - SSL 证书客户端验证 - 如何?

下一篇:php - 跨域登录POST——陷阱

相关文章:

android - 我在 webview 中遇到 CertPathValidatorException 问题

java - Android中解析嵌套的Json对象并存储在数据库中

javascript - 在 Cypress 测试中尝试使用 Auth0 登录时出错

ios - 避免在 Meteor Facebook 身份验证插件中按 'done'

c# - Azure 上的用户授权

postgresql - 为什么 postgres 强制 sslmode=verify-full 虽然它不在连接字符串中

apache - 修复 SSL 协商失败

java - 从 fragment 类调用 Activity 的函数给出 NPE

java - Android库类的静态变量的生命周期是多少?

java - 在 Maven 项目中在哪里提升 Artifact/发布版本