Saya ingin server web saya berbicara dengan server database MySQL melalui koneksi SSL. Server Web menjalankan CentOS5, Server Database menjalankan FreeBSD. Sertifikat diberikan oleh CA DigiCert perantara.
MySQL harus menggunakan ssl, sesuai dengan 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
Ketika saya memulai MySQL, daemon dimulai tanpa kesalahan. Ini menunjukkan bahwa semua file sertifikat dapat dibaca.
Tetapi ketika saya mencoba untuk terhubung dari server web ke server database, saya mendapatkan kesalahan:
[root@webserver ~]# mysql -h mysql.example.org -u user -p
ERROR 2026 (HY000): SSL connection error
Dan jika saya mencoba untuk debug lebih lanjut dengan 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:
Apakah ini cara yang valid untuk menguji koneksi SSL ke server database MySQL? The SSL23_GET_SERVER_HELLO:unknown protocol
pesan aneh karena ini biasanya apa yang Anda akan melihat jika Anda berbicara SSL pada port yang ditujukan untuk lalu lintas non-SSL.
Perintah openssl yang sama ini tampaknya berfungsi baik dengan server LDAP & 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
Jawaban:
OpenSSL versi 1.1.1 (dirilis pada 11 Sep 2018) menambahkan dukungan untuk
-starttls mysql
dalam commit a2d9cfbac5d87b03496d62079aef01c601193b58 . Sayangnya saya tidak dapat menemukan referensi untuk fitur baru ini di OpenSSL changelog.Jika distribusi Anda belum memiliki versi ini, ada biner openssl yang disusun secara statis di https://testssl.sh/openssl-1.0.2k-dev-chacha.pm.ipv6.Linux+FreeBSD.tar.gz yang memang mendukung
-starttls mysql
. Saya menemukan rujukannya di http://www.danneman.org/presentations/Automating_TLS_Configuration_Verification.pdf .Untuk Windows, binari OpenSSL 1.1.1 dapat ditemukan di https://wiki.openssl.org/index.php/Binaries
Saya membuat sertifikat SSL sebagaimana dijelaskan dalam https://dev.mysql.com/doc/refman/5.7/en/creating-ssl-files-using-openssl.html , dicoba, dan berfungsi:
Ada juga
-starttls
dukungan untuk postgres dan ldap juga di OpenSSL 1.1.1. Lihat https://github.com/openssl/openssl/blob/OpenSSL_1_1_1-stable/apps/s_client.c#L815-L831 untuk daftar lengkap.sumber
Menjawab pertanyaan saya sendiri. Jika Anda memiliki jawaban yang lebih baik dengan sumber yang bagus dan berwibawa, silakan kirim jawaban.
Jawaban singkat; Tidak, OpenSSL tidak dapat digunakan untuk men-debug koneksi MySQL SSL. Ini karena MySQL memulai sesi menggunakan plaintext dan beralih ke SSL sesudahnya.
Dalam membaca https://dev.mysql.com/doc/dev/mysql-server/latest/page_protocol_connection_phase.html , MySQL memulai dengan koneksi plaintext, dan kemudian SSL yang sebenarnya dimulai setelahnya. Ini menjelaskan bagaimana MySQL dapat mendengarkan pada satu port (port 3306) untuk koneksi plaintext dan terenkripsi. Bandingkan ini dengan server HTTP atau LDAP, di mana satu port digunakan untuk koneksi plaintext dan port kedua digunakan untuk koneksi terenkripsi.
sumber
Penyebab umum dari masalah ini adalah bahwa Common Name (CN) dari sertifikat CA sama dengan server dan / atau sertifikat klien.
Lihat di sini: https://dev.mysql.com/doc/refman/5.6/en/creating-ssl-certs.html
Coba buat kembali CA & sertifikat Anda dan pastikan untuk menggunakan CN unik dalam semua kasus.
sumber
Saya mengalami masalah serupa dengan klien MacOS X berkomunikasi dengan server Ubuntu.
Bisakah Anda memeriksa apakah koneksi akan berfungsi jika Anda meninggalkan sertifikat sisi klien dan kunci klien, hanya memiliki CA untuk sertifikat server? Apakah Anda dapat membuat koneksi terenkripsi? Ini biasanya akan memerlukan pengaturan APA SAJA untuk kolom ssl_type pengguna terkait.
sumber
Hanya ingin mencatat untuk generasi bahwa jika Anda ingin menggunakan load balancer (seperti F5 atau HAProxy) di antara MySQL dan klien, Anda akan ingin mengimpor sertifikat SSL Anda dari load balancer ke server MySQL. Ini karena startup koneksi seperti STARTTLS.
sumber