使用 Java 与 MySQL 服务器的 SSL 连接

2024-03-12

我正在尝试使用 Java over SSL 连接到 MySQL 服务器。我收到以下异常:

com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Cannot connect to MySQL server on www.mysite.com:3306.

Make sure that there is a MySQL server running on the machine/port you are trying to connect to and that the machine this software is running on is able to connect to this host/port (i.e. not firewalled). Also make sure that the server has not been started with the --skip-networking flag.

at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
at java.lang.reflect.Constructor.newInstance(Unknown Source)
at com.mysql.jdbc.Util.handleNewInstance(Util.java:407)
at com.mysql.jdbc.Util.getInstance(Util.java:382)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1013)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:987)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:982)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:927)
at com.mysql.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:827)
at com.mysql.jdbc.JDBC4Connection.<init>(JDBC4Connection.java:47)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
at java.lang.reflect.Constructor.newInstance(Unknown Source)
at com.mysql.jdbc.Util.handleNewInstance(Util.java:407)
at com.mysql.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:378)
at com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:305)
at java.sql.DriverManager.getConnection(Unknown Source)
at java.sql.DriverManager.getConnection(Unknown Source)
at java.lang.Thread.run(Unknown Source)

Caused by: java.lang.UnsupportedOperationException: The method shutdownInput() is not supported in SSLSocket
at sun.security.ssl.BaseSSLSocketImpl.shutdownInput(Unknown Source)
at com.mysql.jdbc.MysqlIO.forceClose(MysqlIO.java:506)
at com.mysql.jdbc.ConnectionImpl.connectOneTryOnly(ConnectionImpl.java:2404)
at com.mysql.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:2163)
at com.mysql.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:794)
... 25 more

这是我的代码:

properties = new Properties();
properties.put("user", "myuser");
properties.put("password", "mypassword");
properties.put("useSSL", "true");
System.setProperty("javax.net.ssl.keyStore", "keystore.jks");
System.setProperty("javax.net.ssl.keyStorePassword", "keystorepass");
System.setProperty("javax.net.ssl.trustStore", "truststore.jks");
System.setProperty("javax.net.ssl.trustStorePassword", "truststorepass");
connection = DriverManager.getConnection("jdbc:mysql://www.mysite.com:3306/mydatabase", properties);

Details

密钥库和信任库创建

我生成了密钥库和信任库,如下所示:

openssl pkcs12 -export -inkey client-key.pem -in client-cert.pem > keystore.p12
keytool -importkeystore -srckeystore keystore.p12 -srcstoretype pkcs12 -destkeystore keystore.jks -deststoretype JKS

openssl x509 -outform der -in ca.pem -out ca.der
keytool -import -file ca.der -alias myCA -keystore truststore.jks

证书原件

这是我的证书列表:

  • ca.pem
  • 客户端密钥.pem
  • 客户端证书.pem
  • 服务器密钥.pem
  • 服务器证书.pem

不使用 SSL 进行连接

下面的代码工作正常,只是为了演示我可以用Java连接到MySQL服务器:

properties = new Properties();
properties.put("user", "myuser");
properties.put("password", "mypassword");
connection = DriverManager.getConnection("jdbc:mysql://www.mysite.com:3306/mydatabase", properties);

在命令行上使用 MySQL 时可以通过 SSL 连接

我使用以下命令启动 MySQL 服务器:

mysqld --ssl-ca=ca.pem --ssl-cert=server-cert.pem --ssl-key=server-key.pem

然后我使用 MySQL 命令连接到它:

mysql --host=www.mysite.com --user=myuser --password=mypassword --database=mydatabase --ssl-ca=ca.pem --ssl-cert=client-cert.pem --ssl-key=client-key.pem

这有效,查询后SHOW STATUS LIKE 'Ssl_cipher'我得到正确的结果:

+---------------+--------------------+
| Variable_name | Value              |
+---------------+--------------------+
| Ssl_cipher    | DHE-RSA-AES256-SHA |
+---------------+--------------------+

如果您遇到此问题,至少请确保您的 CA 证书已导入到 JRE 的密钥库中!

keytool -import -noprompt -trustcacerts -alias -file ca.pem -keystore

(您可能需要将“ca.pem”文件的名称更改为您自己的CA证书文件名)

请记住保持 的独特性。 另外,更改 使其与 JVM 的路径匹配。请注意,这很可能是最高版本的 JRE,但它也可能是 SDK 的 JRE 或已安装的其他 JRE(例如“C:\Program Files\Java\jre1.8.0_25\lib\security\cacerts” )

您需要输入 JVM 信任库的密码:此密码始终为“changeit”。

我不能保证这会解决问题,但这是我在解决此问题时迈出的重要一步,并且最终成功了。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 Java 与 MySQL 服务器的 SSL 连接 的相关文章

  • 如何在android中使用retrofit访问404错误?

    我正在使用改造 2 访问 REST API 以使用原始正文插入 JSON 数据 我从服务器获得成功响应 但在响应时收到 404 错误 我想访问404错误请帮我解决这个问题 ApiUtil getServiceClass sendFinalC
  • Java:等于和==

    让我们看看我们有 2 个对用户定义类实例的引用 即 Java 中的 a 和 b 会不会有一种情况 a b 但 a equals b 返回 false 当然 实施 equals 完全取决于班级 所以我可以写 class Foo public
  • 使用 SSL 和代理设置的 Rest 客户端获取连接超时

    我正在使用带有忽略 ssl 的 Rest 客户端 它工作正常 但在将来我尝试使用客户端证书进行的生产中将无法工作 我有 ca 证书和客户端证书 我用它创建了一个客户端 但我收到错误 Exception in thread main com
  • 参考接口创建对象

    引用变量可以声明为类类型或接口类型 如果变量声明为接口类型 则它可以引用实现该接口的任何类的任何对象 根据上面的说法我做了一个理解上的代码 正如上面所说声明为接口类型 它可以引用实现该接口的任何类的任何对象 但在我的代码中显示display
  • 在 Java 中生成 LaTeX 输出 [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 是否有用于从 Java 生成 LaTeX 输出的 Java 库 渲染乳胶 JLatex数学 https
  • python 中的子进程调用以使用 JAVA_OPTS 调用 java jar 文件

    示例代码 import subprocess subprocess call java jar temp jar 如何在上面的命令中指定JAVA OPTS 当我使用上述命令时 我收到 java lang OutOfMemoryError 无
  • Spark SQL 失败,因为“常量池已超过 JVM 限制 0xFFFF”

    我在 EMR 4 6 0 Spark 1 6 1 上运行此代码 val sqlContext SQLContext getOrCreate sc val inputRDD sqlContext read json input try inp
  • 加密 mongodb 中的密码字段

    我有以下代码 它插入userName and password进入数据库 但密码以纯文本格式存储 我的意思是 当我查看数据库时 我可以看到插入的密码 我想存储password in encrypted format MongoClient
  • php echo 不工作

    我的代码似乎不起作用 单选按钮出现 但旁边什么也没有 似乎 mysql fetch array 由于某种原因无法工作 因为我已经玩过代码并反复测试它以查找代码似乎遇到的位置出现问题并停止工作 有人可以告诉我出了什么问题吗 欢呼声我是新手 最
  • 从数据库中给定时间起经过的时间

    我有一个 HTML 表 其中包含从数据库中提取的记录 我正在使用 PHP MySQL 我的表中名为 Timer 的列未从数据库中检索 我需要在此处显示经过的时间 从数据库中的特定时间开始 例如 假设现在的时间是2013年2月21日下午6点2
  • 为什么从类构造函数调用的方法应该是最终的? [复制]

    这个问题在这里已经有答案了 我是一名 Java 新手 我试图理解 Oracle 网站教程中的以下行 https docs oracle com javase tutorial java IandI final html https docs
  • Unix 纪元时间转 Java Date 对象

    我有一个包含以下内容的字符串UNIX 纪元时间 https en wikipedia org wiki Unix time 我需要将其转换为 Java Date 对象 String date 1081157732 DateFormat df
  • 莫基托。验证方法参数是特定类

    我有一个方法 void putObject
  • Java环境变量设置方法

    我已将以下行插入 bash profile export GOOGLE APPLICATION CREDENTIALS Users jun Downloads export PATH PATH GOOGLE APPLICATION CRED
  • 如果 @transactional 在类级别应用,如何拦截 @transactional 参数

    我想捕获 transactional 的参数 如果它应用于类级别 例如如果 transactional应用在方法级别 例如 class A transactional readOnly true public void someMethod
  • Zookeeper 未启动,nohup 错误

    我已经下载了zookeeper 3 4 5 tar gz 解压后我将conf zoo cfg写为 tickTime 2000 dataDir var zookeeper clientPort 2181 现在我尝试通过 bin zkServe
  • Spring Data MongoDB 和批量更新

    我正在使用 Spring Data MongoDB 并且想要执行批量更新 就像此处描述的那样 http docs mongodb org manual reference method Bulk find update Bulk find
  • 在edittext android中插入imageview

    我想将 imageview 放在 edittext 中 可能吗 我检查了 evernote 应用程序 它能够将照片放在编辑文本部分 我想让我的应用程序完全相同 我如何才能将从图库中选择的图像视图放入编辑文本中 我首先尝试将 imagevie
  • 是否可以在MYSQL中动态选择列名,其中列名是N个已知值中的1?

    我担心答案会是直接的 不 但我想知道是否可以在 MySQL 中执行如下操作 SELECT title label name FROM table 即选择单个列 可以称为title label or name from table 原因是 查
  • 为什么我们不能在函数式接口中重载抽象方法? (爪哇)

    所以我熟悉java中的函数式接口 以及它们与lambda表达式的使用 一个函数式接口只能包含一个抽象方法 当从 lambda 表达式使用这一孤独方法时 您不需要指定其名称 因为接口中只有一个抽象方法 编译器知道这就是您正在引用的方法 Exa

随机推荐

  • 在 React 中管理用户会话的最佳方法是什么?

    我对如何在 React 中管理用户会话有疑问 例如在 MVC NET 中 您只能使用 Session 对象 例如Session test 但显然 React 无法做到这一点 我正在阅读有关使用组件状态的内容 我认为在主要组件处设置状态并使用
  • Xcode Source Kit 将不会停止使用 Swift 崩溃[重复]

    这个问题在这里已经有答案了 我需要找到一个解决方案来解决 Swift 中超级棒的 Source Kit Crashing 错误 我读过很多堆栈溢出帖子 但似乎没有人有解决方案 如果有一行代码导致了问题 我不可能通过 50 多个源文件来找到它
  • 如何将字符串值从一个视图控制器传递到另一个视图控制器

    你好 我是目标 c 的新手 我有一个带有 h m xib 文件的登录视图控制器 成功登录后我需要转到第二页 场景是这样的 我正在访问网络服务 为了验证用户身份 我将用户名和密码发送到 Web 服务 作为回报我得到一个字符串值 根据字符串值的
  • 测量协议中的UserId、CID

    测量协议 为了识别新用户与回访用户 我们可以使用用户 ID 字段吗 即我们可以对用户名或其他用户唯一的标识符进行哈希处理 并将其与特定用户相关联 这样我们就可以有效地识别新用户与回访用户 关于 CID 的问题 CID 用于唯一标识用户的会话
  • EF6 与 Entity Framework Core:插入实体而不将主键(身份)重置为零

    EF6 插入已经具有主键值的实体可以正常工作 并向主键分配新值 EF Core 它尝试插入主键的值 但显然失败了异常 当 IDENTITY INSERT 设置为 OFF 时 无法在表 Asset 中插入标识列的显式值 我发现的解决方法是将
  • 如果没有 h3 标签,JQuery 手风琴将无法工作

    我正在尝试用 JQuery 制作手风琴 但遇到了一些麻烦 JQuery 网站显示如何创建您的手风琴内容 如下所示 div a href First header a div First content div a href Second h
  • 如何将数据访问映射到实体框架中的业务逻辑对象

    我在 ASP NET C MVC 应用程序中使用实体框架 我在数据访问层中有由 EF 生成的对象 namespace Project1 DataAccess using System using System Collections Gen
  • 如何在 jQuery Mobile 中检测设备的互联网连接

    我正在使用 HTML5 CSS3 jQuery Mobile jQuery UI ASP NET C 和一些 jQuery 插件为调查创建这个简单的移动网页 要求之一是显示一个弹出窗口 对话框 JavaScript 警报或 jQuery 移
  • 使用 Saxon 读取 XSLT 样式表中的环境变量

    我正在尝试生成一个 XML 文件 其中包含我的机器的主机名的任意元素或属性 例如
  • 通用类的通用父级

    我为此使用了一个虚构的例子 比如说 我有一个 Widget 类 例如 abstract class Widget Widget parent 现在 我的其他类将从这个 Widget 类派生 但假设我想在定义派生类型时在类中放置一些约束 以便
  • 如何在android上使用kso​​ap2调用WCF服务?

    这是我的代码 import org ksoap2 import org ksoap2 serialization import org ksoap2 transport import android app Activity import
  • 无法在PHP中的遍历预序中显示所有树

    我的数据库中有一个表 其中包含许多家谱树 id name parent id 1 grandfather NULL 2 father 1 3 uncle 1 4 son 2 5 brother 2 6 cousin s dauther 7
  • R 中随机森林的分层抽样

    我在文档中阅读了以下内容randomForest strata 用于分层抽样的 因子 变量 sampsize 要绘制的样本大小 对于分类 如果 sampsize 是一个长度为层数的向量 然后采样 按strata分层 sampsize的元素
  • 装饰器可以装饰递归函数吗?

    我想看看两种计算斐波那契数列的方法之间的时间成本差异 首先 我创建了一个装饰器 将 输出时间成本 函数添加到函数中 def time cost func def wed n start time time func n stop time
  • SQL依赖+服务代理

    我正在使用 SqlDependency 在某些表中的数据发生更改时获取通知 private void subscribeBroker using var conn new SqlConnection connString conn Open
  • 在Python中使用curses和raw_input

    在我的Python Linux控制台应用程序中 我使用curses来处理数据的显示 同时 我希望有一个输入行来输入命令 几乎是良好的 ol irssi 风格 使用默认的curses getch 我必须做大量的编码才能获得raw input函
  • 如何使 clang-format 尊重“类似表格”的代码格式

    我的代码具有按列对齐的数据或参数表 如下所示 人为的简单示例 实际代码具有更大的表 Name Size Starting val S s Dubs abc 123 X n m YZ ij q kl Name Size Starting va
  • 建议的解决方案:在分布式环境中生成唯一 ID

    我一直在浏览网络 试图找到一种解决方案 使我们能够在区域分布式环境中生成唯一的 ID 我查看了以下选项 除其他外 雪花 推特 这似乎是一个很棒的解决方案 但我只是不喜欢仅仅为了创建 ID 而必须管理另一个软件所带来的额外复杂性 现阶段缺乏文
  • Microsoft Word 中的 docx“文件已损坏”错误

    我写了一个程序 它打开docx包并更改一些
  • 使用 Java 与 MySQL 服务器的 SSL 连接

    我正在尝试使用 Java over SSL 连接到 MySQL 服务器 我收到以下异常 com mysql jdbc exceptions jdbc4 MySQLNonTransientConnectionException Cannot