于2016年7月8日更新。
我必须通过SSL实现Web服务与Web服务通信。要求就像我们有一个在Eclipse Virgo服务器上运行的应用程序。该应用程序包含少量OSGI包。目前,当用户输入一些数据来存储时,应用程序接受它并将数据保存到基于实体的异构数据源(使用JNI的数据库,C进程),这样可以正常工作。
现在我需要实现的是,相同的应用程序将部署在多个服务器中,UI中将有一个选项来指定复制服务器(即运行相同应用程序的服务器和需要复制的数据)
为此,我们计划创建一个单独的bundle以拥有Restful Web服务,并移动所有持久性逻辑以将数据保存到异构数据源。此Rest API将检查可用的复制服务器,并且必须在这些服务器中传递与Rest服务相同的数据。
需要注意的是,我们使用Spring Security框架来确保我们的java应用程序的安全性。由于我们不会将我们的网络服务暴露给任何第三方应用程序,因此所有呼叫(包括对Web服务的调用)都将使用此服务进行身份验证和授权。
我们不会为负载平衡做这件事。每个服务器都是独立的,我们使用安装程序应用程序安装应用程序以及所需的软件。我们的想法是使用安装程序来创建和安装自签名证书。在安装应用程序时,我们可能不知道是否需要将其复制到另一台服务器。因为并非此应用程序的每个客户端都需要复制服务器。需要使用复制服务器的客户端必须能够在稍后阶段通过Java Web应用程序管理屏幕启用和禁用一个或多个复制服务器。从那里开始,在一个服务器中发生的数据操作需要以双向方式复制到其他服务器。
所以我的查询是我们如何动态获取公钥并加密请求以自动方式连接到这些复制服务器,因为它在SSL中运行?
我对SSL的概念完全不了解。
提前致谢。
答案 0 :(得分: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
如果您需要某些步骤的详细信息,请发表评论
<强> EDITED 强>
要创建和分发证书,您可以评估几个选项
1)通配符证书* .domain.com
它允许多个服务器使用相同的证书共享域。证书将包含在安装程序中,公共部分包含在客户端的密钥库中。新的复制服务器不需要在客户端上进行其他配置。我认为它不适用,因为您可能无法控制复制服务器的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基础结构