使用SSL时,MySQLi默认情况下是否会验证服务器证书?

时间:2019-01-22 00:34:43

标签: php mysql ssl

这通常是我使用SSL连接到MySQL数据库的方式:

$db = mysqli_init();
mysqli_ssl_set(
    $db,
    NULL,
    NULL,
    '/etc/ssl/my-certs/ssl-ca.crt.pem',
    NULL,
    NULL
);
mysqli_real_connect(
    $db,
    'db.example.com',
    'john',
    '123456',
    NULL,
    NULL,
    NULL,
    MYSQLI_CLIENT_SSL
);

在阅读mysqli::options的PHP文档时,我注意到存在MYSQLI_OPT_SSL_VERIFY_SERVER_CERT选项,我认为该选项是使MySQLi验证服务器证书的选项。不幸的是,文档中没有MYSQLI_OPT_SSL_VERIFY_SERVER_CERT的描述。这个选项的存在使我想知道我是否一直在不安全地连接到MySQL。现在我想知道是否安全地连接到MySQL的正确方法是这样的:

$db = mysqli_init();
mysqli_options($db, MYSQLI_OPT_SSL_VERIFY_SERVER_CERT, true);  // <- Attention.
mysqli_ssl_set(
    $db,
    NULL,
    NULL,
    '/etc/ssl/my-certs/ssl-ca.crt.pem',
    NULL,
    NULL
);
mysqli_real_connect(
    $db,
    'db.example.com',
    'john',
    '123456',
    NULL,
    NULL,
    NULL,
    MYSQLI_CLIENT_SSL
);

所以,我的问题是:

  1. MYSQLI_OPT_SSL_VERIFY_SERVER_CERT默认设置为true吗?
  2. MYSQLI_OPT_SSL_VERIFY_SERVER_CERT的作用是什么? (请引用)
  3. 使用MySQLi连接到远程MySQL数据库的正确(安全)方法是什么?

(注意:这是What's the difference between MYSQLI_CLIENT_SSL and MYSQLI_OPT_SSL_VERIFY_SERVER_CERT?的后续问题)

1 个答案:

答案 0 :(得分:3)

要求的答案

事实是MYSQLI_OPT_SSL_VERIFY_SERVER_CERT 没有效果。 它是一个未使用的常量。我刚刚通过扫描source code对此进行了验证。

因此,您的问题仍然存在:默认情况下,MySQLi连接是否检查服务器证书?

简短答案:

长答案:尽管证书没有与通常信任的Certificate Authorities列表匹配,但仍会在建立连接时验证提供的CA(即使是自签名的)以减轻MITM-attacks

从工程角度出发的答案

当连接到MySQL服务器时,我根本不建议使用SSL连接,因为它们会增加一些缺点(加密,带宽,解密,增加的内存使用量,增加的总体往返时间)。如果服务器必须在设计上必须位于本地网络之外,那么更好的方法是在受信任的本地网络内进行连接,或者使用某种类型的经过身份验证的SOAP接口来检索和操作数据(在这种情况下,设计似乎是错误的)。