免责声明:我试过谷歌搜索可以做我想做的事情,但没有运气。我希望这里有人可以伸出援手。
背景
我有一个使用 WSE 2.0 库访问安全 Web 服务的 .NET 类库。Web 服务为中央数据库提供了一个前端(它实际上是跨越多个客户的数据共享网络的一部分),并且类库提供了一个简单的 Web 服务调用包装器,以使其可以从旧版 VB6 应用程序中访问。遗留应用程序使用类库来检索信息并将其发布到 Web 服务。目前,应用程序和类库 DLL 都安装在多个工作站的客户端。
问题
问题是我们正在访问的 Web 服务使用 HTTPS,并且需要向 Web 服务提供有效的 X509 客户端证书才能访问它。由于我们所有的组件都存在于客户端机器上,这导致了部署问题。例如,我们必须在每台客户端机器上下载并安装每个用户的证书,每个用户可能需要通过我们的应用程序访问 Web 服务。此外,Web 服务器本身必须通过 VPN(尤其是 OpenVPN)访问,这意味着必须在每台客户端计算机上安装和配置 VPN 客户端。这是一个主要的痛苦(我们的一些客户有几十个工作站)。
建议的解决方案
建议的解决方案是将所有这些逻辑移动到客户站点上的中央服务器。在这种情况下,我们的遗留应用程序将与本地服务器通信,然后该服务器将关闭并将请求转发到真正的 Web 服务。此外,作为简化和集中部署工作的一部分,所有 X509 证书都将安装在服务器上,而不是安装在每台单独的客户端计算机上。
到目前为止,我们提出了三个选项:
- 找到一个现成的 SOAP 代理服务器,它可以接收基于 HTTP 的 SOAP 请求,修改
Host
SOAP 消息的标头和路由相关部分(因此它们指向真实的 Web 服务器),打开到真实 Web 的 SSL 连接服务器,向服务器提供正确的客户端证书(基于用户名到证书的映射),转发修改后的请求,读取响应,将其转换回纯文本,然后将其发送回客户端。 - 手动编写一个代理服务器来完成我刚才提到的所有事情。
- 想出完全不同的、有希望更好的方法来解决这个问题。
基本原理
尝试查找和/或编写 SOAP 代理服务器的基本原理是根本不需要修改我们现有的 .NET 包装库。我们只需将其指向代理服务器而不是真正的 Web 服务端点,使用普通的 HTTP 连接而不是 HTTPS。代理服务器将处理请求,修改它以使真正的 Web 服务接受它(即更改SOAPAction
标头以使其正确),处理 SSL/证书握手,并将原始响应数据发送回客户。
然而,这对我来说充其量是一个可怕的黑客攻击。那么,我们在这里的选择是什么?
- 我是否咬紧牙关编写自己的 HTTP/SSL/SOAP/X509 感知代理服务器来完成这一切?
- 或者...是否有一个具有足够可扩展 API 的现成解决方案,我可以轻松地让它做我想做的事
- 或者……我应该采取完全不同的方法吗?
我们试图解决的关键问题是 (a) 集中存储证书的位置以简化证书的安装和管理,以及 (b) 进行设置以便 VPN 连接到 Web 服务器只发生在单台机器上,而不是需要每个客户端都安装了 VPN 客户端软件。
请注意,我们不控制托管 Web 服务的 Web 服务器。
编辑:为了澄清,我已经在 C# 中实现了一个(相当糟糕的)代理服务器,它确实满足了要求,但是我对这个问题的整个方法感觉根本上是错误的。所以,最终,我正在寻找让我确信我在正确的轨道上的保证,或者有用的建议告诉我我正在以完全错误的方式解决这个问题,以及以更好的方式做这件事的任何提示(如果有的话,我怀疑有)。