Chcę, aby mój serwer WWW rozmawiał z serwerem bazy danych MySQL przez połączenie SSL. Serwer WWW działa CentOS5, serwer bazy danych działa FreeBSD. Certyfikaty są dostarczane przez pośredni CA DigiCert.
MySQL powinien używać ssl, zgodnie z my.cnf
:
# The MySQL server
[mysqld]
port = 3306
socket = /tmp/mysql.sock
ssl
ssl-capath = /opt/mysql/pki/CA
ssl-cert = /opt/mysql/pki/server-cert.pem
ssl-key = /opt/mysql/pki/server-key.pem
Kiedy uruchamiam MySQL, demon uruchamia się bez błędów. Sugeruje to, że wszystkie pliki certyfikatów są czytelne.
Ale kiedy próbuję połączyć się z serwera WWW z serwerem bazy danych, pojawia się błąd:
[root@webserver ~]# mysql -h mysql.example.org -u user -p
ERROR 2026 (HY000): SSL connection error
A jeśli spróbuję dalej debugować za pomocą openssl:
[root@webserver ~]# openssl s_client -connect mysql.example.org:3306 0>/dev/null
CONNECTED(00000003)
15706:error:140770FC:SSL routines:SSL23_GET_SERVER_HELLO:unknown protocol:s23_clnt.c:588:
Czy to prawidłowy sposób przetestowania połączenia SSL z serwerem bazy danych MySQL? SSL23_GET_SERVER_HELLO:unknown protocol
Wiadomość jest dziwne, ponieważ zazwyczaj, co można sprawdzić, czy mówili SSL na porcie przeznaczonej dla ruchu non-SSL.
Ta sama komenda openssl wydaje się działać dobrze z serwerami LDAP i HTTP:
$ openssl s_client -connect ldap.example.org:636 0>/dev/null
CONNECTED(00000003)
depth=2 /C=US/O=The Go Daddy Group, Inc./OU=Go Daddy Class 2 Certification Authority
...
$ openssl s_client -connect www.example.org:443 0>/dev/null
CONNECTED(00000003)
depth=0 /DC=org/DC=example/OU=Services/CN=www.example.org
Odpowiedzi:
OpenSSL Wersja 1.1.1 (wydany 11 wrz 2018) dodaną obsługą
-starttls mysql
w popełnić a2d9cfbac5d87b03496d62079aef01c601193b58 . Niestety nie mogę znaleźć odniesienia do tej nowej funkcji w dzienniku zmian OpenSSL.Jeśli twoja dystrybucja nie ma jeszcze tej wersji, istnieje statycznie skompilowany plik binarny openssl na https://testssl.sh/openssl-1.0.2k-dev-chacha.pm.ipv6.Linux+FreeBSD.tar.gz, który obsługuje
-starttls mysql
. Odwołanie do niego znalazłem w http://www.danneman.org/presentations/Automating_TLS_Configuration_Verification.pdf .W systemie Windows pliki binarne OpenSSL 1.1.1 można znaleźć na stronie https://wiki.openssl.org/index.php/Binaries
Wygenerowałem certyfikaty SSL zgodnie z opisem w https://dev.mysql.com/doc/refman/5.7/en/creating-ssl-files-using-openssl.html , wypróbowałem i działa:
Istnieje również
-starttls
obsługa postgres i ldap w OpenSSL 1.1.1. Zobacz https://github.com/openssl/openssl/blob/OpenSSL_1_1_1-stable/apps/s_client.c#L815-L831 dla pełnej listy.źródło
Odpowiadając na moje pytanie. Jeśli masz lepszą odpowiedź z dobrymi, wiarygodnymi źródłami, opublikuj odpowiedź.
Krótka odpowiedź; Nie, OpenSSL nie może być używany do debugowania połączeń SSL MySQL. Wynika to z faktu, że MySQL rozpoczyna sesję przy użyciu zwykłego tekstu, a następnie przełącza się na SSL.
Czytając https://dev.mysql.com/doc/dev/mysql-server/latest/page_protocol_connection_phase.html , MySQL zaczyna się od połączenia w postaci zwykłego tekstu, a następnie inicjowane jest właściwe SSL. To wyjaśnia, w jaki sposób MySQL może nasłuchiwać na jednym porcie (port 3306) zarówno dla połączeń w postaci zwykłego tekstu, jak i połączeń szyfrowanych. Porównaj to z serwerem HTTP lub LDAP, gdzie jeden port jest używany do połączeń w postaci zwykłego tekstu, a drugi port jest używany do połączeń szyfrowanych.
źródło
Częstą przyczyną tego problemu jest to, że nazwa zwykła (CN) certyfikatu CA jest taka sama jak certyfikat serwera i / lub klienta.
Zobacz tutaj: https://dev.mysql.com/doc/refman/5.6/en/creating-ssl-certs.html
Spróbuj ponownie utworzyć urząd certyfikacji i certyfikaty i upewnij się, że we wszystkich przypadkach używasz unikatowej CN.
źródło
Mam podobny problem z klientem MacOS X komunikującym się z serwerem Ubuntu.
Czy możesz sprawdzić, czy połączenie będzie działać, jeśli pominiesz certyfikat po stronie klienta i klucz klienta, mając tylko urząd certyfikacji dla certyfikatu serwera? Czy możesz nawiązać szyfrowane połączenie? Zwykle wymaga to ustawienia DOWOLNEGO ustawienia dla kolumny ssl_type powiązanego użytkownika.
źródło
Chciałem tylko pamiętać, że jeśli chcesz użyć modułu równoważenia obciążenia (takiego jak F5 lub HAProxy) między MySQL a klientem, będziesz chciał zaimportować certyfikat SSL z modułu równoważenia obciążenia na serwer MySQL. Wynika to z uruchamiania połączenia typu STARTTLS.
źródło