0

我需要能够在我的 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 app 使用 SSL keychain 的私钥对字符串 lybibHubJis7 进行解密,发现用户 ID 为 123456,然后对该用户进行操作。
4

1 回答 1

1

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

并不真地。例如服务发送请求:rest.api.com/authenticate/username/password,然后我用 JSON 格式回复,包含字符串 123456。然后服务将使用 rest.api.com/do/123456/whatever。我想要的是从服务中隐藏“123456”。而且我不想生成一些随机字符串并将其放入数据库,并保持“PreabEdAgIav”->“123456”与过期等关系。我想使用我自己的与服务关联的公钥来加密这个 123456并得到其他东西,该服务将无法破坏。

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

如果您的身份验证服务为您提供了某种身份验证令牌 ( 123456),第 3 方服务旨在将其发回以供后续使用,那么最重要的是消费服务应该能够验证这123456确实来自该身份验证服务。由于任何人都可以使用收件人的公钥加密某些东西,因此公钥加密在这里并没有真正的帮助。

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

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

于 2012-10-05T12:41:35.833 回答