【问题标题】:Does MySQLi verify server certificates by default when using SSL?MySQLi 在使用 SSL 时是否默认验证服务器证书?
【发布时间】:2019-01-22 00:34:42
【问题描述】:

这是我通常使用 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?的后续问题)

【问题讨论】:

  • 来自MariaDb知识库MYSQL_OPT_SSL_VERIFY_SERVER_CERT的第二个问题:启用(或禁用)根据服务器主机证书的公用名(CN)验证主机名。

标签: php mysql ssl


【解决方案1】:

请求的答案

事实是,MYSQLI_OPT_SSL_VERIFY_SERVER_CERT 没有效果。 它是一个未使用的常数。我刚刚通过扫描source code 验证了这一点。

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

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

长答案:虽然证书与通常受信任的Certificate Authorities 列表不匹配,但仍会在建立连接时验证提供的 CA(即使是自签名的)以缓解MITM-attacks

从工程角度回答

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

【讨论】:

  • "...证书与通常受信任的证书颁发机构列表不匹配..." - 如果在mysqli_real_connect(...) 中设置了MYSQLI_CLIENT_SSL,并且您不调用mysqli_ssl_set(...)显式向 mysqli 提供证书,我认为 mysqli 会自动使用 /etc/ssl/certs/ca-certificates.crt 验证证书(即 Debian/Ubuntu 中通常受信任的证书存储)。
  • @Flux MYSQLI_CLIENT_SSL 除了启用 SSL 什么都不做。检查php.net/manual/en/mysqli.real-connect.php - 它将标志描述为“使用 SSL(加密)”。
  • “经过良好验证的 SOAP 接口,如果服务器必须在设计上位于本地网络之外,则可以检索和操作数据”或 REST,或任何其他 API;只是不要不必要地允许从 Internet 访问 MYSQL 并确保您的私有网络安全。关于 SSLifyng 一切并不能解决所有安全问题这一事实的好建议。事实上,在很多情况下它甚至没有用。
  • FWIW,在我的公司,我们使用 TLS(又名 SSL)连接,即使我们是在受信任的本地网络中进行的。使用强大的服务器,加密的开销不会太大。
  • Eppur si muove。 我们正在我的公司使用 5,000 多个 MySQL 实例以及所有应用程序和微服务来执行此操作。这是一种纵深防御的方法,因为在极少数情况下,有黑客侵入了本地网络——或者如果公司中有员工可以访问网络——主机之间的流量无法拦截。
猜你喜欢
  • 2012-11-14
  • 2015-06-24
  • 1970-01-01
  • 1970-01-01
  • 2010-09-09
  • 1970-01-01
  • 1970-01-01
  • 2015-05-11
  • 2016-06-04
相关资源
最近更新 更多