Här PHP (och mysqli_real_connect
) är klienten inte servern. Du konfigurerar den med mysqli_ssl_set
för autentisering av klientcertifikat (och användande av servernyckeln och certifikatet).
Jag är inte säker på hur du har konfigurerat din MySQL-server, men det borde finnas något liknande detta i (MySQL)-serverdelen av konfigurationen:
ssl-key=/mysql-ssl-certs/server-key.pem
ssl-cert=/mysql-ssl-certs/server-cert.pem
ssl-ca=/mysql-ssl-certs/ca-cert.pem
Dessa tillhör ändå inte klientsidan (endast CA-certifikatet gör det, men definitivt inte serverns privata nyckel).
När du har gjort detta kan du försöka se om servern är korrekt konfigurerad med kommandoradsklienten:
mysql --ssl-verify-server-cert --ssl-ca=/mysql-ssl-certs/ca-cert.pem --ssl -h hostname ...
eller kanske detta (även om verifiera servercertifikat verkligen borde vara aktiverat för att SSL/TLS ska vara användbart)
mysql --ssl-ca=/mysql-ssl-certs/ca-cert.pem --ssl -h hostname ...
Detta bör fungera åtminstone på kommandoraden.
Sedan, från PHP, får du två alternativ:
- använd
mysqli_ssl_set
som du har gjort, men lämnar$key
och$cert
null, såvida du inte vill använda ett klientcertifikat som verkligen borde skilja sig från ditt servercertifikat. (Jag kommer inte ihåg om det fungerar.) -
möjligen lättare, utelämna
mysqli_ssl_set
helt och hållet och konfigurera detta i din globala MySQL-klientkonfigurationsfil (där PHP ska kunna hämta den, möjligen/etc/mysql/my.cnf
, men detta kan variera beroende på din distribution):[client] ssl-ca=/mysql-ssl-certs/ca-cert.pem
(Detta liknar serverkonfigurationen, men på klientsidan/i klientsektionen.)
För auktoriseringsdelen (GRANT
):
REQUIRE SSL
kräver endast användning av SSL/TLSREQUIRE ISSUER
,REQUIRE SUBJECT
ochREQUIRE X509
kräva att klienten presenterar ett klientcertifikat för att jämföra med de obligatoriska värdena (det är fallet där du skulle behöva användassl-key
ochssl-cert
på klientsidan (config eller inommysqli_ssl_set
).