在这里,PHP(和
mysqli_real_connect)是客户端而不是服务器。您正在使用
mysqli_ssl_set客户端证书身份验证(以及服务器密钥和证书)对其进行配置。
我不确定您是如何配置MySQL服务器的,但是在配置的(MySQL)服务器部分中应该有类似的内容:
ssl-key=/mysql-ssl-certs/server-key.pemssl-cert=/mysql-ssl-certs/server-cert.pemssl-ca=/mysql-ssl-certs/ca-cert.pem
无论如何,它们都不属于客户端(只有CA证书才属于,但绝对不是服务器的私钥)。
完成此操作后,您可以尝试使用命令行客户端查看服务器是否配置正确:
mysql --ssl-verify-server-cert --ssl-ca=/mysql-ssl-certs/ca-cert.pem --ssl -h hostname ...
或这样做(尽管应该确实启用验证服务器证书以使SSL / TLS有用)
mysql --ssl-ca=/mysql-ssl-certs/ca-cert.pem --ssl -h hostname ...
这至少应该在命令行上起作用。
然后,从PHP获得两种选择:
- 使用
mysqli_ssl_set
像你这样做,但离开$key
和$cert
无效的,除非你想使用一个客户端证书这确实应该是从你的服务器证书不同。(我不记得那是否有效。) - 可能更容易,将其
mysqli_ssl_set
完全省略,并在全局MySQL客户端配置文件中进行配置(PHP应该可以在其中拾取它/etc/mysql/my.cnf
,但可能会有所不同,但这取决于您的发行版):[client]
ssl-ca=/mysql-ssl-certs/ca-cert.pem
(这类似于服务器配置,但在客户端/客户端部分。)
对于授权部分(
GRANT):
REQUIRE SSL
只需要使用SSL / TLSREQUIRE ISSUER
,REQUIRE SUBJECT
并REQUIRE X509
要求客户出示客户端证书来比较所需的值(这就是你需要的情况下使用ssl-key
,并ssl-cert
在客户端(配置或内mysqli_ssl_set
)。



