Zde PHP (a mysqli_real_connect
) je klient, nikoli server. Provádíte konfiguraci pomocí mysqli_ssl_set
pro ověřování klientským certifikátem (a pomocí klíče serveru a certifikátu).
Nejsem si jistý, jak jste nakonfigurovali svůj server MySQL, ale v části konfigurace serveru (MySQL) by mělo být něco takového:
ssl-key=/mysql-ssl-certs/server-key.pem
ssl-cert=/mysql-ssl-certs/server-cert.pem
ssl-ca=/mysql-ssl-certs/ca-cert.pem
Ty stejně nepatří na stranu klienta (patří pouze certifikát CA, ale rozhodně ne soukromý klíč serveru).
Jakmile to uděláte, můžete zkusit zjistit, zda je server správně nakonfigurován pomocí klienta příkazového řádku:
mysql --ssl-verify-server-cert --ssl-ca=/mysql-ssl-certs/ca-cert.pem --ssl -h hostname ...
nebo možná toto (ačkoli ověřte, že certifikát serveru by měl být skutečně povolen, aby bylo SSL/TLS užitečné)
mysql --ssl-ca=/mysql-ssl-certs/ca-cert.pem --ssl -h hostname ...
To by mělo fungovat alespoň na příkazovém řádku.
Pak z PHP získáte dvě možnosti:
- použijte
mysqli_ssl_set
jako vy, ale ponecháte$key
a$cert
null, pokud nechcete použít klientský certifikát, který by se skutečně měl lišit od certifikátu vašeho serveru. (Nepamatuji si, zda to funguje.) -
možná jednodušší, vynechat
mysqli_ssl_set
dohromady a nakonfigurujte to ve svém globálním konfiguračním souboru klienta MySQL (kde by to PHP mělo umět vyzvednout, možná/etc/mysql/my.cnf
, ale to se může lišit v závislosti na vaší distribuci):[client] ssl-ca=/mysql-ssl-certs/ca-cert.pem
(Toto je podobné konfiguraci serveru, ale na straně klienta/v klientské sekci.)
Pro část autorizace (GRANT
):
REQUIRE SSL
vyžaduje pouze použití SSL/TLSREQUIRE ISSUER
,REQUIRE SUBJECT
aREQUIRE X509
vyžadovat, aby klient předložil klientský certifikát pro porovnání s požadovanými hodnotami (to je případ, kdy byste museli použítssl-key
assl-cert
na straně klienta (config nebo v rámcimysqli_ssl_set
).