java - 握手失败/没有共同的密码套件 - SymmetricDS 3.1.5

标签 java replication ssl keystore database-replication

我正在从 SymmetricDS (SDS) 2.5.13 升级到 3.1.5。 我已配置 TLS/HTTPS,并且在 SDS 2.5.13 下按预期工作。但是,使用完全相同的证书、 keystore /信任库文件和相同的 JDK,我在 SDS 3.1.5 下的服务包装器日志 (wrapper.log) 中收到以下错误:

SEND TLSv1 ALERT: fatal, description = handshake_failure  
WRITE: TLSv1 Alert, length = 2  
called closeSocket()  
handling exception: javax.net.ssl.SSLHandshakeException: no cipher suites in common

我有一个两个节点配置,其中一个配置为注册服务器(父节点)。子节点配置为推送和拉取更改。我正在使用 Sun (Oracle) JDK 7 update 5 和适当的 JCE Unlimited Strength Jurisdiction 策略文件(以访问 256 位密码)。

我在 Server 2008 下以独立配置运行 SDS 作为 Windows 服务。Windows 防火墙当前处于关闭状态。

我通过 sym_service.conf 文件将以下与 TLS 相关的 Java 参数传递给服务包装器:

wrapper.java.additional.6=-Dsym.keystore.file=c:/java-keystore/bfvm01-w2ka.ks
wrapper.java.additional.7=-Djavax.net.ssl.keyStore=c:/java-keystore/bfvm01-w2ka.ks
wrapper.java.additional.8=-Djavax.net.ssl.trustStore=c:/java-keystore/bfvm01-w2ka.ks
wrapper.java.additional.9=-Djavax.net.ssl.keyStorePassword=letmein
wrapper.java.additional.10=-Djavax.net.ssl.trustStorePassword=letmein
wrapper.java.additional.11=-Dsun.net.client.defaultReadTimeout=1800000
wrapper.java.additional.12=-Dsun.net.client.defaultConnectTimeout=1800000
wrapper.java.additional.13=-Djavax.net.debug=ssl,handshake

注意:按照 Java 应用程序的标准做法,我们对 keystore 和信任库使用相同的 Java keystore 文件。

这是服务包装器配置为启动 SDS 的方式:

wrapper.app.parameter.1=org.jumpmind.symmetric.SymmetricLauncher
wrapper.app.parameter.2=--secure-server
wrapper.app.parameter.3=--secure-port
wrapper.app.parameter.4=25684
wrapper.app.parameter.5=--properties
wrapper.app.parameter.6=../conf/symmetric.properties

sym_node 和 symmetry.properties 中的条目已正确配置为使用 HTTPS(而不是 HTTP)。

启动与父级通信的子 SDS 节点报告此错误:

WRITE: TLSv1 Handshake, length = 198  
READ: TLSv1 Alert, length = 2  
RECV TLSv1 ALERT: fatal, handshake_failure  
called closeSocket()  
handling exception: javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure

父节点报此错误:

SEND TLSv1 ALERT: fatal, description = handshake_failure  
WRITE: TLSv1 Alert, length = 2  
called closeSocket()  
handling exception: javax.net.ssl.SSLHandshakeException: no cipher suites in common

正如我之前提到的,相同的配置(服务器、证书、 keystore /trustore 文件、JDK)可以很好地在 SDS 2.5.13 下实现 TLS/HTTPS 安全性。唯一的变化是切换到 SDS 3.1.5。如果我在 SDS 3.1.5 中禁用 TLS/HTTPS 配置并改用 HTTP,则父节点和子节点可以相互通信。

作为绝望的健全性检查,我编写了一个快速的“Hello World”客户端服务器应用程序,以在我的子节点计算机上创建 SSLSocket 并将一行文本发送到服务器节点计算机(使用与我相同的 TCP 端口)已用于 SDS)。使用相同的 JDK 和相同的 keystore /信任库文件编译并运行程序。像冠军一样工作。

我完全被难住了。任何帮助将不胜感激。

最佳答案

回答了我自己的问题。显然,除了我之外,没有人在 SymmetricDS (SDS) 节点之间使用 TLS(因为完全没有响应)。最初的错误消息让我感到困惑,并让我寻找所有错误的地方。

看来 3.x 版本的 SDS(至少是 3.1.5)现在要求您提供在 keystore 中使用的证书的“别名”。该值作为 Java 运行时参数“sym.keystore.ssl.cert.alias”提供。对于 Windows 用户,它将被放置在服务包装器配置文件 (sym_service.conf) 中:

wrapper.java.additional.XX=-Dsym.keystore.ssl.cert.alias=foo

此参数在 SDS 2.5.13 中似乎不需要或不存在,并且在 SDS 3.1.5(或更高版本)中的任何地方都没有记录。它不会出现在 SDS 3.1.5(或 SDS 3.2.0,我检查过)的二进制下载提供的任何配置文件中。

通过查看 SDS 源代码如何设置安全连接,我能够解决我的 SDS TLS 问题。

org.jumpmind.symmetric.SymmetricWebServer 使用证书别名,如下所示:

sslConnectorFactory.setCertAlias(System.getProperty(SystemConstants.SYSPROP_KEYSTORE_CERT_ALIAS, "sym"));

SystemConstants.SYSPROP_KEYSTORE_CERT_ALIAS 设置为“sym.keystore.ssl.cert.alias”。

一旦我在 sym_service.conf 中提供了正确的别名,我就可以开始了。

  • 布鲁斯

关于java - 握手失败/没有共同的密码套件 - SymmetricDS 3.1.5,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13881221/

相关文章:

ssl - WinSCP .NET 程序集是否支持带有 FTPS 客户端证书身份验证的隐式 TLS/SSL?

java - Spring Data JPA - 使用标志列的存储库 findAll 方法

java - 如何从运行在 OS X、Java 7 上的 Java .app 包中访问资源文件?

ruby-on-rails - 在开发环境中通过 Octopus gem 复制 Rails Postgresql

SVN 仓库同步

powershell - 通过 SSL 证书和 powershell 创建 https 绑定(bind)时的 "IIS: Cannot create a file when that file already exists.Exception.Message"

c# - 在 c# winApplication 中使用 SSL

java - 如何从 Spring Boot 服务运行 CMD 命令?

java - Ajax 不会在 wicket 中实现 ListView

mysql - MySQL复制测试开发环境