OpenSSL, MySQL sunucusuyla olan SSL bağlantısında hata ayıklamak için kullanılabilir mi?


21

Web sunucumun SSL bağlantısı üzerinden MySQL veritabanı sunucusuyla konuşmasını istiyorum. Web sunucusu CentOS5'i, Veritabanı Sunucusu FreeBSD'yi çalıştırır. Sertifikalar bir ara CA DigiCert tarafından sağlanır.

MySQL, ssl kullanıyor olmalıdır 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

MySQL'i başlattığımda, arka plan programı hatasız başlıyor. Bu, sertifika dosyalarının okunabilir olduğunu gösterir.

Ancak web sunucusundan veritabanı sunucusuna bağlanmaya çalıştığımda bir hata alıyorum:

[root@webserver ~]# mysql -h mysql.example.org -u user -p
ERROR 2026 (HY000): SSL connection error

Ve eğer openssl ile daha fazla hata ayıklamaya çalışırsanız:

[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:

Bu, MySQL veritabanı sunucusuna SSL bağlantısını test etmenin geçerli bir yolu mu? SSL23_GET_SERVER_HELLO:unknown protocolEğer SSL olmayan trafik için tasarlanmış bir bağlantı noktasında SSL konuşuyormuş bu genellikle göreceğiniz beri mesajı garip.

Aynı openssl komutu LDAP ve HTTP sunucuları ile iyi çalışıyor gibi görünüyor:

$ 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

Bir MySQL sunucusuna SSL trafiğini incelemek için Wireshark'ı da kullanabileceğinizi unutmayın, bkz. İ.imgur.com/5uTkLqU.png .
Jaime Hablutzel

Yanıtlar:


11

İçin verilen destek (11 Sep 2018 tarihinde yayımlanan) OpenSSL sürüm 1.1.1 -starttls mysqlyılında a2d9cfbac5d87b03496d62079aef01c601193b58 işlemek . Ne yazık ki bu yeni özelliğe başvuruyu OpenSSL değişiklik günlüğünde bulamıyorum.

Dağıtımınızın henüz bu sürümü yoksa, https://testssl.sh/openssl-1.0.2k-dev-chacha.pm.ipv6.Linux+FreeBSD.tar.gz adresinde statik olarak derlenmiş bir openssl ikili dosyası vardır. -starttls mysql. Referansı http://www.danneman.org/presentations/Automating_TLS_Configuration_Verification.pdf adresinde buldum .

Windows için OpenSSL 1.1.1 ikili dosyaları https://wiki.openssl.org/index.php/Binaries adresinde bulunabilir

SSL sertifikalarını https://dev.mysql.com/doc/refman/5.7/en/creating-ssl-files-using-openssl.html adresinde açıklandığı gibi oluşturdum , çalıştı ve çalışıyor:

$ 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

Orada da -starttlsPostgres'e ve ldap desteği de OpenSSL 1.1.1 yılında. Tam liste için https://github.com/openssl/openssl/blob/OpenSSL_1_1_1-stable/apps/s_client.c#L815-L831 adresine bakın .


12

Kendi sorumu cevaplıyorum. İyi ve güvenilir kaynaklarla daha iyi bir cevabınız varsa, lütfen bir cevap gönderin.

Kısa cevap; Hayır, OpenSSL MySQL SSL bağlantılarında hata ayıklamak için kullanılamaz. Bunun nedeni, MySQL'in oturumu düz metin kullanarak başlatması ve daha sonra SSL'ye geçmesidir.

Https://dev.mysql.com/doc/dev/mysql-server/latest/page_protocol_connection_phase.html okunurken , MySQL düz metin bağlantısıyla başlar ve daha sonra gerçek SSL başlatılır. Bu, MySQL'in hem düz metin hem de şifreli bağlantılar için bir bağlantı noktasını (bağlantı noktası 3306) nasıl dinleyebildiğini açıklar. Bunu, bir bağlantı noktasının düz metin bağlantıları için kullanıldığı ve ikinci bağlantı noktasının şifreli bağlantılar için kullanıldığı bir HTTP veya LDAP sunucusuyla karşılaştırın.

Bir ERR paketi gönderip el sıkışmasını bitirebilen veya istemcinin bir El Sıkışma Yanıt Paketi ile yanıtladığı bir İlk El Sıkışma Paketi gönderebilen sunucuya istemci connect () ile başlar. Bu aşamada istemci SSL bağlantısı isteyebilir, bu durumda istemci kimlik doğrulama yanıtını göndermeden önce bir SSL iletişim kanalı kurulur


1
Bu, STARTTLS kullandığınızda SMTP ile aynıdır ve aynı bağlantı noktasında şifreli ve şifresiz connectiosn kullanmanıza izin verir.
Synchro

Hım, en.wikipedia.org/wiki/STARTTLS'ye göre bahsettiğim davranış STARTTLS'in nasıl çalıştığıdır .
Stefan Lasiewski

2
MySQL " STARTTLS gibi " çalışsa da, aslında en azından OpenSSL'nin başarılı bir şekilde etkileşimde bulunabileceğini bulduğum şekilde STARTTLS uygulamıyor.
Christopher Schultz


0

Bir Ubuntu sunucusuyla iletişim kuran MacOS X istemcisi ile benzer bir sorunla karşılaşıyorum.

İstemci tarafı sertifikasını ve istemci anahtarını dışarıda bırakırsanız, sadece sunucu sertifikası için CA'ya sahipseniz bağlantının çalışıp çalışmadığını kontrol edebilir misiniz? Şifreli bir bağlantı kurabiliyor musunuz? Bu normalde ilişkili kullanıcının ssl_type sütunu için ANY ayarını gerektirir.


0

Sadece MySQL ile istemci arasında bir yük dengeleyici (F5 veya HAProxy gibi) kullanmak istiyorsanız, SSL sertifikanızı yük dengeleyiciden MySQL sunucusuna aktarmak isteyeceğinizi düşünmek istedik. Bunun nedeni STARTTLS benzeri bağlantı başlatmasıdır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.