我想使用XML请求中的一些encryption标签来authentication我的SOAP webservice的调用者(在Ruby 1.8.7 / Rails 2.3.5中使用,在Red Hat Enterprise Linux 5中使用datanoise gem部署)。 通常情况下,客户端是一个Windows程序(也许是C#/ .net Windows程序 – 不是Java / Ruby),它应该在每次调用基于密钥/盐的web服务时生成不同的encryption密钥 – 而我的服务器端将始终能够用私钥解码。 线上的encryption标记的知识不应允许第三方程序简单地复制完全encryption的标记并访问Web服务。 我正在研究OpenSSL,但是是密码学的新手。 被encryption用于标识的string可以是(除其它项目之外)可信客户端的MAC ID,当被解密时该MAC ID将与可信主机的服务器侧的存储值相匹配。
我在Ruby方面发现了很多可能性,但需要理想地确保解决scheme不会强制(或最小化)Windows客户端上的任何库或安装要求。 我最挣扎的是每次拨打电话时都会生成一个新密钥的方法,这样,任何嗅探stream量的人都无法简单地推断出通过访问密钥来创buildencryption标签的模式。
由于您在此处对调用者进行身份验证,而不一定只是他们发送的内容,因此不需要将身份验证机制放入SOAP请求中。 其他人试图用WS-Security来做你自己的事情,所以如果有的话,我会去做的。
虽然这个方案的安全性方面存在问题,但是最大的问题可能是Ruby不支持它(至少我知道,如果我错了,请纠正我)。
在两端实现客户端认证的最简单的方法可能是使用相互认证的TLS(以前的SSL)。 这将确保传输级别的身份验证,这应该足够您的情况。 然后,首先检查客户端发送的证书的有效性(Ruby OpenSSL为您负责),然后进行实际的身份验证,一旦建立,就根据您维护的已知证书的白名单进行检查你的服务器。
请不要发明自己的方案,密码协议是最困难的事情之一(这就是为什么WS-Security存在问题),TLS可能就像现在这样好,并且在任何语言上都有广泛的支持。