如何通过 SSL 实现 Web 服务到 Web 服务的通信?
Posted
技术标签:
【中文标题】如何通过 SSL 实现 Web 服务到 Web 服务的通信?【英文标题】:How to achieve Web-service to Web-service communication over SSL? 【发布时间】:2016-11-09 19:46:02 【问题描述】:2016 年 7 月 8 日更新。
我必须通过 SSL 实现 Web 服务到 Web 服务的通信。需求就像我们有一个在 Eclipse Virgo 服务器上运行的应用程序。该应用程序包含几个 OSGI 包。目前,当用户输入一些数据来存储应用程序时,应用程序接受它并将数据持久化到基于实体的异构数据源(数据库,使用 JNI 的 C 进程)中,这很好。
现在我需要实现的是,相同的应用程序将部署在多个服务器中,并且 UI 中将有一个选项来指定复制服务器(即运行相同应用程序的服务器和需要复制的数据) .
为此,我们计划创建一个单独的包来拥有一个 Restful Web 服务,并移动所有持久性逻辑以将数据保存到异构数据源。这个 Rest API 将检查可用的复制服务器,并且必须通过这些服务器中的 Rest 服务传递相同的数据。
需要注意的一点是,我们利用 Spring Security 框架来确保我们的 java 应用程序的安全性。由于我们不会将我们的 Web 服务暴露给任何第三方应用程序,因此所有调用(包括对 Web 服务的调用)都将使用它进行身份验证和授权。
我们这样做不是为了负载平衡。每台服务器都是独立的,我们使用安装程序安装应用程序以及所需的软件。这个想法是使用安装程序来创建和安装自签名证书。在安装应用程序时,我们可能不知道是否需要将其复制到另一台服务器。因为并非此应用程序的每个客户端都需要复制服务器。需要使用复制服务器的客户端必须能够在稍后阶段通过 Java Web 应用程序管理屏幕启用和禁用一个或多个复制服务器。从那里开始,一台服务器中发生的任何数据操作都需要以双向方式复制到另一台服务器。
所以我的问题是我们如何动态获取公钥并加密请求以双向方式连接到那些复制服务器,因为它在 SSL 中运行?
我对 SSL 的概念完全陌生。
提前致谢。
【问题讨论】:
【参考方案1】:如果您使用由受信任的 CA 颁发的证书,则不需要额外配置。但我猜你会使用自签名证书,因为你有多个服务器并且它们的使用是不公开的
每台服务器都需要自己的 SSL 证书绑定到服务器的 IP 或主机名。我建议为根颁发的每个服务器证书创建一个根证书和一个 SSL 证书。也可以使用通配符类型 * .domain.com。
您必须在客户端应用程序的信任库中包含根证书才能成功建立 SSL 连接。为此,创建一个 JKS 密钥库,其中包含根证书并定义以下信任库
System.setProperty ("javax.net.ssl.trustStore","path/to/your/truststore");
System.setProperty ("javax.net.ssl.trustStorePassword", "password");
您可以修改默认信任库也可以在jre/lib/security/cacerts
如果您需要某些步骤的详细信息,请发表评论
已编辑
要创建和分发您的证书,您可以评估几个选项
1) 通配符证书 *.domain.com
它允许多个服务器使用相同的证书共享域。证书将包含在安装程序中,公共部分将包含在客户端的密钥库中。新的复制服务器不需要在客户端上进行额外配置。我认为它不适用,因为您可能无法控制复制服务器的 DNS。
2) 没有根 CA 的自签名证书
每台服务器都会生成自己的自签名证书。然后客户端必须通过将证书包含在 trustore 中来信任证书。 通常我不会推荐自动下载过程,因为它涉及连接到不安全的源(目前),要从 ssl 连接获取证书 X509,打开信任库并添加新证书,但由于有一个操作员明确执行操作,我觉得可行
在此处查看答案https://***.com/a/37861267/6371459,展示如何创建自定义 TrustManager 以依赖主机。之后打开服务器中的信任库文件,添加证书并保存(参见Programmatically Import CA trust cert into existing keystore file without using keytool)
3) 具有根 CA 的自签名证书
证书是在客户端创建的,但由您的 PKI 签名(使用公钥基础结构)。优点是您的客户端只需要将根 CA 包含到信任库中。只要您使用由该根 CA 颁发的证书,就会信任新的复制服务器。
出于安全原因,您不应在安装程序中包含 CA 证书的私钥。那么,证书的创建现在会更加复杂。一种选择是先前为新主机名创建证书并将其与安装程序一起发送。另一种选择是使用负责签署证书的服务器创建 PKI 基础架构
【讨论】:
我能动态地做到这一点吗?因为我们计划提供应用程序的超级管理员用户来通过 UI 指定复制服务器。 如果您在前端服务器的信任库中包含根 CA,新的复制不会影响这部分。对于复制的后端,您需要一个绑定到必须包含在复制过程中的服务器的 IP 或主机名的证书。您每次都创建一个新证书,从可用的预建列表中选择一个,或为所有服务器使用通配符 有趣的用例。我已经详细解释了创建或分发证书的选项 谢谢@pedrofb 您认为使用客户端和服务器证书可以进行双向 SSL 身份验证吗?如果是这样,我们如何创建服务器和客户端证书?假设服务器 A 想要复制到服务器 B,那么服务器 B 必须创建服务器和客户端证书并将客户端证书传递给服务器 A?还是服务器 A 的证书称为客户端证书?以上是关于如何通过 SSL 实现 Web 服务到 Web 服务的通信?的主要内容,如果未能解决你的问题,请参考以下文章
如何在不通过 SSL 添加服务引用的情况下动态调用 Web 服务