我有以下系统
A [user's client device] <---> B [my server] <---> C [user's private server]
所有相关软件均在我的控制之下。我的服务器 B 不存储用户数据,但需要使用用户私有服务器 C 中的数据生成报告。
我希望我的服务器 B 无法访问用户的服务器 C ,除非在客户端 A 下执行此操作请求。但是,客户端 A 除了通过我的服务器(B)之外,无法直接访问其服务器 C 。
如何创建一个身份验证方案,其中 A 和 C 之间的所有数据都通过 B 传递,但 B 以后无法模仿 A ?
注意:
答案 0 :(得分:1)
您可以使用某种单一用途或可撤销令牌吗?永远不会从A给B完全认证,而是A给B一次代币。您可以使用只有A和C知道的密钥才能启用A来生成新令牌。您可以实际查看Amazon S3 auth,以获得一个很好的例子。
http://docs.aws.amazon.com/AmazonS3/latest/dev/RESTAuthentication.html http://docs.aws.amazon.com/AmazonS3/latest/dev/MakingRequests.html
基本上,当A发出请求时,它会创建一个临时签名令牌,让B代表它行事。亚马逊甚至允许您限制令牌可以授权的操作。
答案 1 :(得分:1)
将带有不可否认证书的S / MIME邮件数字签名给B; B可以在将签名消息转发给C之前验证签名,检查内容和记录报告信息。当C接收到具有有效签名的消息时,它执行消息中的指令。这些消息可以通过HTTPS传输以提供其他人的隐私,或者A可以使用B的证书在S / MIME层加密它,而B只会将解密但签名的内容传递给C。
或者,您可以在A和C之间的SSL连接上使用NULL密码套件和客户端身份验证,B可以将未加密的流量窥探为中间人。这可能需要对B进行自定义编码,以便从SSL记录中提取应用程序数据,而B将无法验证流量的完整性(但是,因为它会与A协商必要的密钥)。
这两种方法都依赖于客户端A,使用证书(或可信公钥,如果您使用PGP而不是S / MIME)。