Hier PHP (en mysqli_real_connect
) is de client niet de server. Je configureert het met mysqli_ssl_set
voor authenticatie van clientcertificaten (en met behulp van de serversleutel en het certificaat).
Ik weet niet zeker hoe je je MySQL-server hebt geconfigureerd, maar er zou zoiets moeten staan in het (MySQL)-servergedeelte van de configuratie:
ssl-key=/mysql-ssl-certs/server-key.pem
ssl-cert=/mysql-ssl-certs/server-cert.pem
ssl-ca=/mysql-ssl-certs/ca-cert.pem
Deze horen sowieso niet bij de client (alleen het CA-certificaat, maar zeker niet de privésleutel van de server).
Zodra je dit hebt gedaan, kun je proberen om te zien of de server correct is geconfigureerd met behulp van de opdrachtregelclient:
mysql --ssl-verify-server-cert --ssl-ca=/mysql-ssl-certs/ca-cert.pem --ssl -h hostname ...
of misschien dit (hoewel het verifiëren van het servercertificaat echt moet zijn ingeschakeld om SSL/TLS te laten werken)
mysql --ssl-ca=/mysql-ssl-certs/ca-cert.pem --ssl -h hostname ...
Dit zou in ieder geval op de opdrachtregel moeten werken.
Dan krijg je van PHP twee opties:
- gebruik
mysqli_ssl_set
zoals je hebt gedaan, maar met$key
en$cert
null, tenzij u een clientcertificaat wilt gebruiken dat echt anders zou moeten zijn dan uw servercertificaat. (Ik weet niet meer of dat werkt.) -
mogelijk makkelijker, laat
mysqli_ssl_set
weg en configureer dit in uw algemene MySQL-clientconfiguratiebestand (waar PHP het zou moeten kunnen ophalen, mogelijk/etc/mysql/my.cnf
, maar dit kan variëren afhankelijk van uw distributie):[client] ssl-ca=/mysql-ssl-certs/ca-cert.pem
(Dit is vergelijkbaar met de serverconfiguratie, maar aan de clientzijde/in het clientgedeelte.)
Voor het autorisatiegedeelte (GRANT
):
REQUIRE SSL
vereist alleen het gebruik van SSL/TLSREQUIRE ISSUER
,REQUIRE SUBJECT
enREQUIRE X509
vereisen dat de klant een klantcertificaat presenteert om te vergelijken met de vereiste waarden (in dat geval zou ussl-key
moeten gebruiken enssl-cert
aan de clientzijde (config of binnenmysqli_ssl_set
).