代码之家  ›  专栏  ›  技术社区  ›  Flux

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

  •  3
  • Flux  · 技术社区  · 7 年前

    这就是我通常使用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
    );
    

    在阅读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
    );
    

    所以,我的问题是:

    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 回复  |  直到 7 年前
        1
  •  3
  •   Gerald    7 年前

    请求的答案

    事实是, MYSQLI_OPT_SSL_VERIFY_SERVER_CERT 没有效果 . 它是一个未使用的常量。我只是通过扫描 source code .

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

    简短回答: 是的 他们是。

    答案很长:尽管证书与一般受信任的列表不匹配 Certificate Authorities ,提供的CA(即使是自签名的)在建立连接时仍然经过验证以减轻 MITM-attacks .

    从工程角度回答

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