【问题标题】:How to know if connection to Database is using SSL or not如何知道与数据库的连接是否使用 SSL
【发布时间】:2016-05-19 07:58:50
【问题描述】:

我在 PHP 上使用 mysqli 连接到 mysql 数据库。数据库与 ssl 和不具有开放连接。 我已经生成了这段代码:

$db = mysqli_init();
$db->ssl_set(NULL, NULL,'rds-combined-ca-bundle.pem',NULL,NULL);
$db->real_connect($hostname,$username,$password,$database);
$res = $db->query('SHOW TABLES;');
print_r ($res);
$db->close();

我得到的输出很好,我得到了我想要的,但我不明白我的连接是否通过 SSL 断开。 如果我将证书名称更改为 xyzrds-combined-ca-bundle.pem,它会继续正常工作...所以我猜它只是在证书失败时打开 no-ssl。

任何关于我如何知道我是否连接到 SSL 的线索?

非常感谢

【问题讨论】:

  • 手册说如果 SSL 连接失败,那么 real_connect 应该会失败。但它似乎没有。碰巧的是,如果您在代码上方添加这一行会怎样? mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
  • 感谢您的信息,它为我提供了更好的信息,但与我使用的内容无关,作为答案提出的解决方案效果很好。Ty

标签: php ssl mysqli


【解决方案1】:

您可以为每个客户端配置 SSL,因此您可以同时拥有 SSL 和非 SSL 连接。

您可以通过发送以下命令来检查是否配置了 SSL:mysql> show variables like '%ssl%';

输出应如下所示:

+---------------+----------------------------------+
| Variable_name | Value                            |
+---------------+----------------------------------+
| have_openssl  | YES                              |
| have_ssl      | YES                              |
| 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        |
+---------------+----------------------------------+

您可以为您的 mYSQL 用户设置以下配置:

REQUIRE X509: 必须使用有效的 SSL 证书

REQUIRE ISSUER / REQUIRE SUBJECT: 必须使用带有特定 ISSUER 和/或 SUBJECT 的 SSL 证书

REQUIRE SSL:连接强制使用SSL,可以通过密码或者有效的SSL证书进行认证

使用以下命令,您可以检查已连接客户端的状态:

mysql> SHOW STATUS LIKE 'Ssl_cipher';

输出应如下所示:

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

【讨论】:

  • 如果您为此检查添加 PHP 代码会很好,因为如果不使用 SSL,OP 显然希望他们的代码失败。
  • 不知道你的意思。这些命令是纯 SQL,可以作为查询发送。但就您应该从数据库的主机系统(可能未安装 PHP)执行这些测试而言,从命令行发送更有意义。
  • 看看这个页面percona.com/blog/2013/06/22/…Establish secure connection from PHP可能对你有帮助
  • 非常感谢@Michael,解决方案有效,我在错误的证书上得到了这个数组(即使连接良好)([0] => Ssl_cipher [Variable_name] => Ssl_cipher [1] = > [Value] =>) 如果 che 证书是好的 Array ([0] => Ssl_cipher [Variable_name] => Ssl_cipher [1] => AES256-SHA [Value] => AES256-SHA) 和这个数组,非常感谢
  • 嗨,如果我想检查 ssl 连接是否使用TSLv1.2 怎么办?
【解决方案2】:

基于this answer,这里有一个快速代码来检查您的连接是否基于 SSL:

$res = $mysqli->query("SHOW STATUS LIKE 'Ssl_cipher'");
$row = $res->fetch_assoc();
if(empty($row['Value']))
{
    echo 'No SSL';
}

【讨论】:

  • 没错,只是在上面的问题中添加了,所以更容易获得
  • 你需要检查$row['Value'],其中Value用大写V写。
【解决方案3】:

如果您使用的是 MySQL 5.7.5 或更高版本,您可以use perfomance_schema

SELECT sbt.variable_value AS tls_version,  t2.variable_value AS cipher, 
         processlist_user AS user, processlist_host AS host 
FROM performance_schema.status_by_thread  AS sbt 
   JOIN performance_schema.threads AS t ON t.thread_id = sbt.thread_id 
   JOIN performance_schema.status_by_thread AS t2 ON t2.thread_id = t.thread_id 
WHERE sbt.variable_name = 'Ssl_version' AND t2.variable_name = 'Ssl_cipher' 
ORDER BY tls_version

产量

+-------------+--------------------+------+---------------+
| tls_version | cipher             | user | host          |
+-------------+--------------------+------+---------------+
| TLSv1.1     | DHE-RSA-AES256-SHA | root | 192.168.1.100 |
+-------------+--------------------+------+---------------+

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-09-05
    • 2014-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-18
    • 1970-01-01
    • 2016-10-08
    相关资源
    最近更新 更多