使用 SSL 时 MySQLi 是否默认验证服务器证书?

Flu*_*lux 4 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
);
Run Code Online (Sandbox Code Playgroud)

在阅读 的 PHP 文档时mysqli::options,我注意到该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
);
Run Code Online (Sandbox Code Playgroud)

所以,我的问题是:

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

(注意:这是一个关于MYSQLI_CLIENT_SSL 和 MYSQLI_OPT_SSL_VERIFY_SERVER_CERT 之间有什么区别的后续问题

Ger*_*ald 7

要求答复

事实是,MYSQLI_OPT_SSL_VERIFY_SERVER_CERT 没有任何影响。它是一个未使用的常量。我只是通过扫描源代码验证了这一点。

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

简短回答:是的,他们是。

长答案:尽管证书与通常受信任的证书颁发机构列表不匹配,但在建立连接时仍会验证提供的 CA(即使是自签名)以减轻MITM 攻击

从工程角度回答

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

  • *Eppur si muove。* 我们在我的公司,在 5,000 多个 MySQL 实例以及所有应用程序和微服务上执行此操作。这是一种**深度防御**的方法,因为如果有黑客侵入本地网络的可能性很小 - 或者如果公司中有人可以访问网络 - 主机之间的流量无法被拦截. (2认同)