mysql5.5开启ssl_在MySQL中,启用SSL

2023-05-16

问题描述

我正在运行Ubuntu Server 12.04,并且想启用与MySQL的SSL连接。

我已经使用OpenSSL生成了以下密钥/证书文件:

ca-cert.pem

server-cert.pem

server-key.pem

我将它们存储在/etc/mysql,然后将以下行添加到/etc/mysql/my.cnf:

ssl-ca=/etc/mysql/ca-cert.pem

ssl-cert=/etc/mysql/server-cert.pem

ssl-key=/etc/mysql/server-key.pem

接下来,我使用sudo service restart mysql重新启动服务器。

但是,这似乎没有启用SSL。在mysql会话中:

mysql> show variables like '%ssl%';

+---------------+----------------------------+

| Variable_name | Value |

+---------------+----------------------------+

| have_openssl | DISABLED |

| have_ssl | DISABLED |

| ssl_ca | /etc/mysql/ca-cert.pem |

| ssl_capath | |

| ssl_cert | /etc/mysql/server-cert.pem |

| ssl_cipher | |

| ssl_key | /etc/mysql/server-key.pem |

+---------------+----------------------------+

有什么想法我想念的吗?谢谢

最佳方案

Ubuntu 12.04带有OpenSSL 1.0.1,其默认值与旧版OpenSSL 0.9.8有所不同。

除其他外,如果您使用openssl req -newkey rsa:2048生成RSA密钥,则最终会得到名为PKCS #8格式的密钥。这些密钥以PEM格式表示,具有更通用的-----BEGIN PRIVATE KEY-----标头,但不能告诉您它是哪种类型的(RSA,DSA,EC)密钥。

以前,在OpenSSL 0.9.8中,密钥始终采用称为PKCS #1的格式(表示为PEM),具有标题-----BEGIN RSA PRIVATE KEY-----。

因此,您不能简单地从以下位置更改页眉和页脚:

-----BEGIN PRIVATE KEY-----

-----BEGIN RSA PRIVATE KEY-----`

这不是一回事,它是行不通的。相反,您需要使用openssl rsa将密钥转换为旧格式。像这样:

openssl rsa -in key_in_pkcs1_or_pkcs8.pem -out key_in_pkcs1.pem

Ubuntu 12.04上的MySQL(v5.5.35)使用名为yaSSL(v2.2.2)的SSL实现。它期望密钥采用PKCS#1格式,并且不支持OpenSSL 1.0和更高版本使用的PKCS#8格式。如果您仅更改此页眉和页脚(如该线程中的其他帖子所建议的那样),MySQL /yaSSL将不会抱怨,但是您将无法连接,而最终会出现如下错误:

ERROR 2026 (HY000): SSL connection error: protocol version mismatch

Ubuntu 14.04随附OpenSSL 1.0.1f和新设置。除其他外,它将生成具有SHA256摘要的证书,而不是早期版本中使用的SHA1。偶然地,与MySQL捆绑在一起的yaSSL版本也不支持此功能。

如果要生成用于MySQL的证书,请记住确保将RSA密钥转换为传统的PKCS#1 PEM格式,并且该证书正在使用SHA1摘要。

这是如何生成自己的CA,服务器证书和客户端证书的示例。

# Generate a CA key and certificate with SHA1 digest

openssl genrsa 2048 > ca-key.pem

openssl req -sha1 -new -x509 -nodes -days 3650 -key ca-key.pem > ca-cert.pem

# Create server key and certficate with SHA1 digest, sign it and convert

# the RSA key from PKCS #8 (OpenSSL 1.0 and newer) to the old PKCS #1 format

openssl req -sha1 -newkey rsa:2048 -days 730 -nodes -keyout server-key.pem > server-req.pem

openssl x509 -sha1 -req -in server-req.pem -days 730 -CA ca-cert.pem -CAkey ca-key.pem -set_serial 01 > server-cert.pem

openssl rsa -in server-key.pem -out server-key.pem

# Create client key and certificate with SHA digest, sign it and convert

# the RSA key from PKCS #8 (OpenSSL 1.0 and newer) to the old PKCS #1 format

openssl req -sha1 -newkey rsa:2048 -days 730 -nodes -keyout client-key.pem > client-req.pem

openssl x509 -sha1 -req -in client-req.pem -days 730 -CA ca-cert.pem -CAkey ca-key.pem -set_serial 01 > client-cert.pem

openssl rsa -in client-key.pem -out client-key.pem

次佳方案

这对我有帮助:

文件server-key.pem的页眉和页脚如下所示:

-----BEGIN PRIVATE KEY-----

...

...

-----END PRIVATE KEY-----

但是它需要这样的东西:

-----BEGIN RSA PRIVATE KEY-----

...

...

-----END RSA PRIVATE KEY-----

注意BEGIN RSA私钥

为了查看日志:

sudo vim /var/log/mysql/error.log

希望这可以帮助。

第三种方案

我在12.04上遇到了同样的麻烦,但是实际上是由apparmor引起的。

您还可以在/etc/apparmor.d/usr.sbin.mysqld中更改apparmor配置。

参考资料

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

mysql5.5开启ssl_在MySQL中,启用SSL 的相关文章

  • 在MySQL中生成随机字符串

    我正在尝试使用函数在 phpmyadmin 中获取随机字符串 我有以下代码 CREATE FUNCTION randomPassword RETURNS varchar 128 BEGIN SET chars ABCDEFGHIJKLMNO
  • 使用连接池后如何处理过多的并发连接?

    Scenario 假设您有一个拥有大量流量的网站或应用程序 即使使用数据库连接池 性能也会受到真正的打击 站点 应用程序甚至可能崩溃 因为并发连接太多 Question 人们有什么选择来处理这个问题 我的想法 我在想有这个问题的人可以创建多
  • WHERE NOT EXIST 附近的语法错误

    我在堆栈中搜索 但没有一个达到最终答案 我的查询是这样的 INSERT INTO user username frequence autoSend VALUES feri2 3 1 WHERE NOT EXISTS SELECT FROM
  • 在同一查询中选择 Count of ip 和 Count of DISTINCT ip

    我有一个这样的表结构 TABLE NAME counter id datetime url ip 1 2013 04 12 13 27 09 url1 ip01 2 2013 04 13 10 55 43 url2 ip02 3 2013
  • mysql-connector-c++ - “get_driver_instance”不是“sql::mysql”的成员

    我是 C 的初学者 我认为学习的唯一方法就是接触一些代码 我正在尝试构建一个连接到 mysql 数据库的程序 我在 Linux 上使用 g 没有想法 我运行 make 这是我的错误 hello cpp 38 error get driver
  • 从 call_log 中获取最大并发通话数

    我需要帮助在 MySQL 5 0 77 中编写一个查询 根据下面所示的数据 办公室一天的通话量 返回并发电话呼叫的峰值数量 我只是想知道一天中任何特定时间同时打电话的人数最多是多少 首先 这是 MySQL 表 CREATE TABLE ca
  • Mysql带限制的删除语句

    我试图从表中删除行 但出现错误 DELETE FROM chat messages ORDER BY timestamp DESC LIMIT 20 50 我在 50 时收到此错误 您的 SQL 语法有错误 检查与您的 MySQL 服务器版
  • 将IP保存到数据库中

    当用户登录时 我想将他们的 IP 保存在数据库中 我该怎么做呢 MySQL 字段最适合使用哪种类型 获取IP的PHP代码是什么样的 我正在考虑将其用作登录 会话内容的额外安全功能 我正在考虑使用用户现在拥有的 IP 检查用户从数据库登录的
  • Tomcat 6找不到mysql驱动

    这里有一个类似的问题 但关于类路径 ClassNotFoundException com mysql jdbc Driver https stackoverflow com questions 1585811 classnotfoundex
  • Django 将 JSON 数据传递给静态 getJSON/Javascript

    我正在尝试从 models py 中获取数据并将其序列化为views py 中的 JSON 对象 模型 py class Platform models Model platformtype models CharField max len
  • 使用用户定义函数 MySql 时出错

    您好 请帮我解决这个问题 提前致谢 我在数据库中定义了这些函数 CREATE FUNCTION levenshtein s1 VARCHAR 255 s2 VARCHAR 255 RETURNS INT DETERMINISTIC BEGI
  • MySQL中查找id最大的行

    看一下下面名为 Articles 的 MySQL 表 id articleId version title content 1 1 0 0 ArticleNo 1 title v0 0 ArticleNo 1 content v0 0 2
  • 如何为 MySQL 中的字段或列添加别名?

    我正在尝试做这样的事情 但我收到未知的列错误 SELECT SUM field1 field2 AS col1 col1 field3 AS col3 from core 基本上 我只想使用别名 这样我就不需要执行之前执行的操作 这在mys
  • mysql 不带空字符串和 NULL 的不同值

    如何检索没有空字符串值和NULL值的mysql不同值 SELECT DISTINCT CON EMAILADDRESS AS E MAIL FROM STUDENT INNER JOIN CONTACT CON ON STUDENT CON
  • 防止 Propel 插入空字符串

    当未设置列时 如何防止 Propel ORM 插入空字符串 CREATE TABLE user uid INTEGER PRIMARY KEY AUTO INCREMENT email VARCHAR 255 NOT NULL UNIQUE
  • MySQL NOT IN 来自同一个表中的另一列

    我想运行 mysql 查询来选择表中的所有行films其中的值title该列不存在于另一列的所有值中的任何位置 collection 这是我的表格的简化版本 其中包含内容 mysql gt select from films id titl
  • 如何对 SQL 进行多次查询

    我正在尝试创建一个表 并在 PHP 脚本的帮助下在数据库中插入一些值 虽然只插入 1 行 但效果很好 当我尝试输入更多行数时 出现错误 我需要为每个查询编写完整的插入语句 因为我正在使用在线 Excel 到 SQL 查询转换器
  • 如何在 Zend MVC 中实现 SSL

    我之前已经通过使用特定的安全文件夹 例如服务器上的 https 文件夹与 http 文件夹 实现了安全页面 我已经开始使用 Zend Framework 并希望应用程序的某些部分 例如登录 使用 https 我在谷歌上搜索过 甚至在这里搜索
  • 在 MySQL 数据库中保持 TEXT 字段唯一的最佳方法

    我想让 TEXT 字段的值在我的 MySQL 表中唯一 经过小型研究 我发现由于性能问题 每个人都不鼓励在 TEXT 字段上使用 UNIQUE INDEX 我现在想用的是 1 创建另一个字段来包含 TEXT 值的哈希值 md5 text v
  • 查询为空 Node Js Sequelize

    我正在尝试更新 Node js 应用程序中的数据 我和邮递员测试过 我的开发步骤是 从数据库 MySQL 获取ID为10的数据进行更新 gt gt 未处理的拒绝SequelizeDatabaseError 查询为空 我认识到 我使用了错误的

随机推荐