这是我通常使用 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)
所以,我的问题是:
MYSQLI_OPT_SSL_VERIFY_SERVER_CERT设置为true默认?MYSQLI_OPT_SSL_VERIFY_SERVER_CERT?(请引用)(注意:这是一个关于MYSQLI_CLIENT_SSL 和 MYSQLI_OPT_SSL_VERIFY_SERVER_CERT 之间有什么区别的后续问题?)
事实是,MYSQLI_OPT_SSL_VERIFY_SERVER_CERT 没有任何影响。它是一个未使用的常量。我只是通过扫描源代码验证了这一点。
所以,您的问题仍然存在:默认情况下 MySQLi 连接是否检查服务器证书?
简短回答:是的,他们是。
长答案:尽管证书与通常受信任的证书颁发机构列表不匹配,但在建立连接时仍会验证提供的 CA(即使是自签名)以减轻MITM 攻击。
当连接到 MySQL 服务器时,我根本不建议使用 SSL 连接,因为它们增加了几层缺点(加密、带宽、解密、增加的内存使用量、增加的总体往返时间)。一个更好的方法是在受信任的本地网络内连接,或者如果服务器设计必须在本地网络之外(在这种情况下设计似乎是错误的),则使用某种类型的经过充分验证的 SOAP 接口来检索和操作数据。
| 归档时间: |
|
| 查看次数: |
1230 次 |
| 最近记录: |