Bisakah OpenSSL digunakan untuk men-debug koneksi SSL ke server MySQL?

21

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 protocolpesan 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
Stefan Lasiewski
sumber
Perhatikan bahwa Anda dapat menggunakan Wireshark juga untuk memeriksa lalu lintas SSL ke server MySQL, lihat i.imgur.com/5uTkLqU.png .
Jaime Hablutzel

Jawaban:

11

OpenSSL versi 1.1.1 (dirilis pada 11 Sep 2018) menambahkan dukungan untuk -starttls mysqldalam 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:

$ echo | bin/openssl.Linux.x86_64.static s_client -starttls mysql -connect spx-bionic.censored.com:3306 -CAfile /tmp/ca.pem
CONNECTED(00000003)
depth=1 C = AU, ST = Some-State, O = Internet Widgits Pty Ltd, CN = mysql test CA
verify return:1
depth=0 C = AU, ST = Some-State, O = Internet Widgits Pty Ltd, CN = spx-bionic.censored.com
verify return:1
---
Certificate chain
 0 s:/C=AU/ST=Some-State/O=Internet Widgits Pty Ltd/CN=spx-bionic.censored.com
   i:/C=AU/ST=Some-State/O=Internet Widgits Pty Ltd/CN=mysql test CA
 1 s:/C=AU/ST=Some-State/O=Internet Widgits Pty Ltd/CN=mysql test CA
   i:/C=AU/ST=Some-State/O=Internet Widgits Pty Ltd/CN=mysql test CA
---
Server certificate
-----BEGIN CERTIFICATE-----
CENSORED
-----END CERTIFICATE-----
subject=/C=AU/ST=Some-State/O=Internet Widgits Pty Ltd/CN=spx-bionic.censored.com
issuer=/C=AU/ST=Some-State/O=Internet Widgits Pty Ltd/CN=mysql test CA
---
No client certificate CA names sent
Client Certificate Types: RSA sign, DSA sign, ECDSA sign
Requested Signature Algorithms: RSA+SHA512:DSA+SHA512:ECDSA+SHA512:RSA+SHA384:DSA+SHA384:ECDSA+SHA384:RSA+SHA256:DSA+SHA256:ECDSA+SHA256:RSA+SHA224:DSA+SHA224:ECDSA+SHA224:RSA+SHA1:DSA+SHA1:ECDSA+SHA1
Shared Requested Signature Algorithms: RSA+SHA512:DSA+SHA512:ECDSA+SHA512:RSA+SHA384:DSA+SHA384:ECDSA+SHA384:RSA+SHA256:DSA+SHA256:ECDSA+SHA256:RSA+SHA224:DSA+SHA224:ECDSA+SHA224:RSA+SHA1:DSA+SHA1:ECDSA+SHA1
Peer signing digest: SHA512
Server Temp Key: ECDH, P-521, 521 bits
---
SSL handshake has read 2599 bytes and written 632 bytes
---
New, TLSv1/SSLv3, Cipher is ECDHE-RSA-AES256-GCM-SHA384
Server public key is 2048 bit
Secure Renegotiation IS supported
Compression: NONE
Expansion: NONE
No ALPN negotiated
SSL-Session:
    Protocol  : TLSv1.2
    Cipher    : ECDHE-RSA-AES256-GCM-SHA384
    Session-ID: AD25B7C3018E4715F262188D982AAE141A232712316E0A3292B0C14178E0F505
    Session-ID-ctx: 
    Master-Key: C121967E8FAEC4D0E0157419000660434D415251B0281CCBFC6D7A2AE8B0CC63AEFE22B332E91D31424C1BF03E5AF319
    Key-Arg   : None
    PSK identity: None
    PSK identity hint: None
    SRP username: None
    TLS session ticket lifetime hint: 7200 (seconds)
    TLS session ticket:
    0000 - 82 db 03 0f c0 ce f2 26-62 bd 1b 18 71 03 88 db   .......&b...q...
    0010 - a6 66 7c 71 94 0c d5 ec-96 30 46 53 4a e6 cd 76   .f|q.....0FSJ..v
    0020 - 66 b3 22 86 7d 9f 7e 2c-14 1d 66 f2 46 8f d2 d3   f.".}.~,..f.F...
    0030 - f7 0a 0b f5 9e 05 97 e1-2b b3 ba 79 78 16 b8 59   ........+..yx..Y
    0040 - dc c5 0d a8 de 0b 3a df-4b ec f9 73 3f 4c c3 f1   ......:.K..s?L..
    0050 - 86 b6 f7 aa a7 92 84 77-9f 09 b2 cc 5d dd 35 41   .......w....].5A
    0060 - 23 5d 77 74 e1 96 91 ac-28 81 aa 83 fe fc d2 3c   #]wt....(......<
    0070 - f9 23 09 6d 00 e0 da ef-48 69 92 48 54 61 69 e8   .#.m....Hi.HTai.
    0080 - 30 0e 1f 49 7d 08 63 9e-91 70 fc 00 9f cd fe 51   0..I}.c..p.....Q
    0090 - 66 33 61 24 42 8f c2 16-57 54 48 ec 6a 87 dc 50   f3a$B...WTH.j..P

    Start Time: 1537350458
    Timeout   : 300 (sec)
    Verify return code: 0 (ok)
---
DONE

Ada juga -starttlsdukungan 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.

Paul Tobias
sumber
12

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.

Itu dimulai dengan menghubungkan klien () ke server yang dapat mengirim paket ERR dan menyelesaikan jabat tangan atau mengirim Paket Handshake Awal yang klien jawab dengan Paket Respons Handshake. Pada tahap ini klien dapat meminta koneksi SSL, dalam hal ini saluran komunikasi SSL dibuat sebelum klien mengirimkan respons otentikasi

Stefan Lasiewski
sumber
1
Ini sama dengan cara kerja SMTP ketika Anda menggunakan STARTTLS, dan itu juga memungkinkan Anda untuk menggunakan koneksi terenkripsi dan tidak terenkripsi pada port yang sama.
Sinkronisasi
Hm, saya kira perilaku yang saya bicarakan adalah bagaimana STARTTLS bekerja, menurut en.wikipedia.org/wiki/STARTTLS .
Stefan Lasiewski
2
Sementara MySQL bekerja " seperti STARTTLS", ia tidak benar-benar mengimplementasikan STARTTLS, setidaknya tidak dengan cara apa pun yang saya temukan OpenSSL dapat berinteraksi dengan sukses.
Christopher Schultz
0

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.

pengguna1204270
sumber
0

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.

Stephen
sumber