更新于2016年7月8日。
我必须通过SSL实现Web服务到Web服务的通信.这个需求就像我们有一个运行在Eclipse服务器上的应用程序。该应用程序由几个OSGI包组成。目前,当用户输入一些数据来存储应用程序时,接受它并基于实体将数据持久化到异构数据源(数据库,使用JNI的C进程),这很好。
现在,我需要实现的是,相同的应用程序将部署在多个服务器中,UI中将有一个选项来指定复制服务器(即运行相同应用程序的服务器和需要复制的数据)。
为此,我们计划创建一个单独的包,以拥有一个Restful web服务,并将所有的持久化逻辑转移到异构数据源中。这个Rest将检查可用的复制服务器,并必须将相同的数据传递给这些服务器中的Rest服务。
需要注意的是,我们使用Security框架来确保java应用程序的安全性。由于我们不向任何第三方应用程序公开我们的web服务,所有的调用(包括对web服务的调用)都将用于身份验证和授权。
我们这样做不是为了负载平衡。每个服务器都是独立的,我们使用安装程序应用程序安装应用程序和所需的软件。其想法是使用安装程序来创建和安装一个自签名证书。在安装应用程序时,我们可能不知道是否需要将其复制到另一台服务器。因为并不是此应用程序的每个客户端都需要一个复制服务器。需要使用复制服务器的客户端必须能够在稍后阶段通过Java应用程序管理屏幕启用和禁用一个或多个复制服务器。在此基础上,一个服务器中发生的数据操作需要以双向方式复制到另一个服务器。
因此,我的查询是如何动态获取公钥并加密请求,以双向方式连接到那些复制服务器,因为它在SSL中运行?
我对SSL的概念完全陌生。
提前谢谢。
发布于 2016-07-08 07:01:19
如果使用受信任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
它允许多个服务器使用相同的证书共享域。证书将包含在安装程序中,公共部分将包含在客户端的keystore中。新的复制服务器不需要客户端上的其他配置。我认为它不适用,因为您可能不控制复制服务器的DNS。
2)没有根CA的自签名证书
每个服务器都生成自己的自签名证书。然后,客户端必须通过将证书包含在trustore中来信任证书。通常,我不建议使用自动下载过程,因为它涉及连接到不安全的源(目前而言),从ssl连接获得证书X509,打开信任库并添加新的证书,但是由于有一个操作员明确地执行该操作,我认为这是可行的。
请查看这里的答案,https://stackoverflow.com/a/37861267/6371459展示了如何创建依赖于主机的自定义TrustManager。打开服务器中的信任存储文件后,添加证书并保存它(请参阅Programmatically Import CA trust cert into existing keystore file without using keytool)
3)具有根CA的自签名证书
证书在客户端创建,但由您的PKI (使用公钥基础结构)签名。优点是您的客户只需要将根CA包含到信任库中。每当使用此根CA颁发的证书时,都会信任新的复制服务器。
出于安全原因,您不应将CA证书的私钥包含在安装程序中。然后,证书的创建将变得更加复杂。一个选项是以前为新主机名创建证书,并将其与安装程序一起发送。另一种选择是创建PKI基础设施,其服务器负责证书签名。
https://stackoverflow.com/questions/38246344
复制相似问题