这通常是我使用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
);
所以,我的问题是:
MYSQLI_OPT_SSL_VERIFY_SERVER_CERT
默认设置为true
吗?MYSQLI_OPT_SSL_VERIFY_SERVER_CERT
的作用是什么? (请引用)(注意:这是What's the difference between MYSQLI_CLIENT_SSL and MYSQLI_OPT_SSL_VERIFY_SERVER_CERT?的后续问题)
答案 0 :(得分:3)
事实是MYSQLI_OPT_SSL_VERIFY_SERVER_CERT
没有效果。
它是一个未使用的常量。我刚刚通过扫描source code对此进行了验证。
因此,您的问题仍然存在:默认情况下,MySQLi连接是否检查服务器证书?
简短答案:是。
长答案:尽管证书没有与通常信任的Certificate Authorities列表匹配,但仍会在建立连接时验证提供的CA(即使是自签名的)以减轻MITM-attacks。
当连接到MySQL服务器时,我根本不建议使用SSL连接,因为它们会增加一些缺点(加密,带宽,解密,增加的内存使用量,增加的总体往返时间)。如果服务器必须在设计上必须位于本地网络之外,那么更好的方法是在受信任的本地网络内进行连接,或者使用某种类型的经过身份验证的SOAP接口来检索和操作数据(在这种情况下,设计似乎是错误的)。>