MySQL Server(在Red Hat 7 OS上运行的远程机器,MySQL版本为5.7.11)启用了SSL,如下所示:
+---------------+--------------------------------+
| Variable_name | Value |
+---------------+--------------------------------+
| have_openssl | YES |
| have_ssl | YES |
| ssl_ca | /var/lib/mysql/ca.pem |
| ssl_capath | |
| ssl_cert | /var/lib/mysql/server-cert.pem |
| ssl_cipher | |
| ssl_crl | |
| ssl_crlpath | |
| ssl_key | /var/lib/mysql/server-key.pem |
我试图从我的本地计算机(windows)使用SSL(而不是身份验证)建立JDBC加密。下面是这样做的JDBC代码:
import java.sql.*;
public class MysqlConnect
{
public static void main (String[] args)
{
try
{
//System.setProperty("javax.net.ssl.trustStore", "cacerts");
//System.setProperty("javax.net.ssl.trustStorePassword", "changeit"); ( Works with truststore values , but gives the error below without it)
Class.forName("com.mysql.jdbc.Driver").newInstance();
String url = "jdbc:mysql://IPAddress:3306/DBName?
verifyServerCertificate=false&useSSL=true&requireSSL=true";
String user = "root";
String password = "password";
Connection con = DriverManager.getConnection(url,user,password);
}
catch (Exception ex)
{
ex.printStackTrace();
}
}
}
我已按照此链接创建证书:https://dev.mysql.com/doc/refman/5.7/en/creating-ssl-files-using-openssl.html。现在,如果我将服务器证书添加到C:\Program Files\Java\jdk1.8\jre\lib\Security\cacerts并使用此信任库,我确实会在wireshark中看到加密的连接,但是如果我不提供信任库名称和密码,我会得到以下错误(The我这样做的原因是,根据我的理解,与ssl身份验证不同,使用ssl的jdbc加密不应该需要客户端信任库参数):
javax.net.ssl.SSLHandshakeException
MESSAGE: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
STACKTRACE:
javax.net.ssl.SSLHandshakeException:
sun.security.validator.ValidatorException: PKIX path building failed:
sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
at sun.security.ssl.Alerts.getSSLException(Unknown Source)
at sun.security.ssl.SSLSocketImpl.fatal(Unknown Source)
at sun.security.ssl.Handshaker.fatalSE(Unknown Source) .
我的问题是,即使尝试仅使用ssl(而不是ssl身份验证)进行jdbc加密,是否也需要将服务器证书添加到客户端信任库(并提供信任库详细信息)?。
我已经看到了这个相关链接:
JDBC参数验证服务器证书=假连接,不需要clientkeystore和信任库
但是,我仍然得到的错误,验证服务器证书=假(它是依赖于MySQL版本或使用自签名证书)?
使用SSL的JDBC加密不应要求客户端信任库参数
你凭什么这么想?你搞错了。如果您使用的是自签名证书,则确实如此。
代码从不同的系统工作正常,我可以建立一个安全的连接,确切的原因是为什么它失败仍然未知,但这是我的假设-
如果有人面临类似的问题,您可以尝试重新创建服务器证书并重新启动数据库服务器,出于理智的目的,从信任库中删除相应的证书或创建并使用新的信任库。
在wireshark中,您应该看到如下内容:
1 source IP Dest IP TLSv1.2 220 Client Hello
2 Dest IP source IP TLSv1.2 1140 Server Hello, Certificate, Server Key Exchange, Server Hello Done
3 source IP Dest IP TLSv1.2 129 Client Key Exchange
4 source IP Dest IP TLSv1.2 60 Change Cipher Spec
5 source IP Dest IP TLSv1.2 99 Encrypted Handshake Message
如果您在wireshark中看到这一点,这意味着您现在通过ssl enycrypted链接进行连接(显然这只是一种解决方法,因为这种行为的根本原因尚不清楚)。
Apache Kafka允许客户端通过SSL进行连接。默认情况下,SSL被禁用,但可以根据需要启用。 为每个Kafka broker生成SSL密钥和证书部署一个或多个支持SSL的brokers的第一步是为集群中的每台计算机生成密钥和证书。你可以使用Java的keytool实用程序来完成此任务。最初我们将生成一个临时密钥库的密钥,以便我们稍后可以导出并用CA签名。 keytool -
今天数据隐私是一个十分关注的问题,作为开发人员,我们需要准备好解决这个问题。至少我们需要熟悉加密协议 SSL 和 TLS 等之上的其他协议实现数据安全。作为一个 HTTPS 网站的用户,你是安全。当然,这些协议是广泛不基于 http 的应用程序,例如安全SMTP(SMTPS)邮件服务,甚至关系数据库系统。 为了支持 SSL/TLS,Java 提供了 javax.net.ssl API 的类SslC
Apache HTTP服务器的mod_ssl模块提供了对使用安全套接层(Secure Sockets Layer)和传输层安全(Transport Layer Security)协议的OpenSSL库的接口。此模块和本文都是基于 Ralf S. Engelschall 的mod_ssl项目。 文档 简介 兼容性 如何... 常见问题解答 词汇表 mod_ssl 此模块提供的有关指令和环境变量的文档
问题内容: 我正在尝试使用我的SSL证书运行socket.io,但是它将无法连接。 我基于聊天示例创建代码: 如果我删除SSL代码,它运行正常,但是与此同时,我收到了一个请求,请求http://domain.com/socket.io/1/?t=1309967919512 请注意,它没有尝试使用https,这会导致它失败。 我正在测试chrome,因为它是该应用程序的目标浏览器。 抱歉,这是一个简
我试图找到WebClient使用的示例。 我的目标是使用Spring5 WebClient使用https和自签名证书查询REST服务 有什么例子吗?
问题内容: 以下代码可以正常工作: 如果我取消注释以下行: 启用SSL连接并使用此URL: 则程序失败,并且错误与证书有关。 那么,我该怎么解决这个问题呢? 问题答案: 引起原因:sun.security.validator.ValidatorException:PKIX路径构建失败:sun.security.provider.certpath.SunCertPathBuilderExcept