OpenSSL สามารถใช้เพื่อดีบักการเชื่อมต่อ SSL กับเซิร์ฟเวอร์ MySQL ได้หรือไม่?


21

ฉันต้องการให้เว็บเซิร์ฟเวอร์พูดกับเซิร์ฟเวอร์ฐานข้อมูล MySQL ผ่านการเชื่อมต่อ SSL เว็บเซิร์ฟเวอร์เรียกใช้ CentOS5 เซิร์ฟเวอร์ฐานข้อมูลรัน FreeBSD ใบรับรองดังกล่าวจัดทำโดย CA DigiCert ระดับกลาง

MySQL ควรใช้ ssl ตาม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 daemon จะเริ่มโดยไม่มีข้อผิดพลาด สิ่งนี้ชี้ให้เห็นว่าไฟล์ใบรับรองสามารถอ่านได้ทั้งหมด

แต่เมื่อฉันพยายามเชื่อมต่อจากเว็บเซิร์ฟเวอร์ไปยังเซิร์ฟเวอร์ฐานข้อมูลฉันได้รับข้อผิดพลาด:

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

และถ้าฉันพยายามแก้ไขเพิ่มเติมด้วย 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:

นี่เป็นวิธีที่ถูกต้องในการทดสอบการเชื่อมต่อ SSL กับเซิร์ฟเวอร์ฐานข้อมูล MySQL หรือไม่? SSL23_GET_SERVER_HELLO:unknown protocolข้อความแปลกตั้งแต่นี้โดยทั่วไปแล้วสิ่งที่คุณจะดูว่าคุณกำลังพูด SSL บนพอร์ตไว้สำหรับการจราจรไม่ใช่ SSL

คำสั่ง openssl เดียวกันนี้ดูเหมือนจะทำงานได้ดีกับเซิร์ฟเวอร์ 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

โปรดทราบว่าคุณสามารถใช้ Wireshark เกินไปที่จะตรวจสอบการใช้งาน SSL ไปยัง MySQL เซิร์ฟเวอร์ให้ดูi.imgur.com/5uTkLqU.png
Jaime Hablutzel

คำตอบ:


11

OpenSSL เวอร์ชัน 1.1.1 (ปล่อยออกมาเมื่อ 11 กันยายน 2018) เพิ่มการสนับสนุนสำหรับ-starttls mysqlในกระทำ a2d9cfbac5d87b03496d62079aef01c601193b58 น่าเสียดายที่ฉันไม่พบการอ้างอิงถึงฟีเจอร์ใหม่นี้ใน OpenSSL changelog

หากการแจกจ่ายของคุณยังไม่มีเวอร์ชั่นนี้จะมีไบนารี openssl ที่รวบรวมไว้แบบคงที่ที่https://testssl.sh/openssl-1.0.2k-dev-chacha.pm.ipv6.Linux+FreeBSD.tar.gzซึ่งรองรับ-starttls mysql. ผมพบว่าการอ้างอิงถึงในhttp://www.danneman.org/presentations/Automating_TLS_Configuration_Verification.pdf

สำหรับ Windows สามารถพบไบนารีของ OpenSSL 1.1.1 ได้ที่https://wiki.openssl.org/index.php/Binaries

ฉันสร้างใบรับรอง SSL ตามที่อธิบายไว้ในhttps://dev.mysql.com/doc/refman/5.7/en/creating-ssl-files-using-openssl.htmlลองแล้วจะทำงาน:

$ 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

นอกจากนี้ยัง-starttlsรองรับ postgres และ ldap ด้วยใน OpenSSL 1.1.1 ดูhttps://github.com/openssl/openssl/blob/OpenSSL_1_1_1-stable/apps/s_client.c#L815-L831สำหรับรายการทั้งหมด


12

ตอบคำถามของฉันเอง หากคุณมีคำตอบที่ดีกว่ากับแหล่งข้อมูลที่ดีและเชื่อถือได้โปรดโพสต์คำตอบ

คำตอบสั้น ๆ ไม่ OpenSSL ไม่สามารถใช้เพื่อดีบักการเชื่อมต่อ MySQL SSL ได้ เนื่องจาก MySQL เริ่มเซสชันโดยใช้เท็กซ์เท็กซ์และสลับไปใช้ SSL ในภายหลัง

ในการอ่านhttps://dev.mysql.com/doc/dev/mysql-server/latest/page_protocol_connection_phase.html , MySQL เริ่มต้นด้วยการเชื่อมต่อแบบธรรมดาแล้ว SSL จริงจะเริ่มขึ้นหลังจากนั้น สิ่งนี้อธิบายถึงวิธีที่ MySQL สามารถฟังบนพอร์ตเดียว (พอร์ต 3306) สำหรับการเชื่อมต่อแบบธรรมดาและแบบเข้ารหัส เปรียบเทียบสิ่งนี้กับเซิร์ฟเวอร์ HTTP หรือ LDAP ที่ใช้พอร์ตหนึ่งสำหรับการเชื่อมต่อแบบธรรมดาและพอร์ตที่สองใช้สำหรับการเชื่อมต่อแบบเข้ารหัส

มันเริ่มต้นด้วยการเชื่อมต่อไคลเอนต์ () ไอเอ็นจีไปยังเซิร์ฟเวอร์ซึ่งอาจส่งแพ็กเก็ต ERR และเสร็จสิ้นการจับมือกันหรือส่งแพ็คเก็ตเริ่มต้น Handshake ซึ่งลูกค้าตอบรับด้วย Handshake Response Packet ในขั้นตอนนี้ลูกค้าสามารถร้องขอการเชื่อมต่อ SSL ซึ่งในกรณีนี้จะมีการสร้างช่องทางการสื่อสาร SSL ก่อนที่ลูกค้าจะส่งการตอบสนองการตรวจสอบ


1
นี่เป็นวิธีเดียวกับที่ SMTP ทำงานเมื่อคุณใช้ STARTTLS และอนุญาตให้คุณใช้ connectiosn ที่เข้ารหัสและไม่เข้ารหัสบนพอร์ตเดียวกัน
ซิงโคร

หืมมมผมคิดว่าพฤติกรรมที่ฉันพูดคุยเกี่ยวกับการเป็นวิธีการทำงานของ STARTTLS ตามen.wikipedia.org/wiki/STARTTLS
Stefan Lasiewski

2
ในขณะที่ MySQL ใช้งานได้ " เช่น STARTTLS" แต่ก็ไม่ได้ติดตั้ง STARTTLS แต่อย่างน้อยก็ไม่ได้ใช้ OpenSSL ในการโต้ตอบได้สำเร็จ
Christopher Schultz

1

สาเหตุทั่วไปของปัญหานี้คือชื่อสามัญ (CN) ของใบรับรอง CA เหมือนกับเซิร์ฟเวอร์และ / หรือใบรับรองไคลเอ็นต์

ดูที่นี่: https://dev.mysql.com/doc/refman/5.6/en/creating-ssl-certs.html

ลองสร้าง CA และใบรับรองอีกครั้งและตรวจสอบให้แน่ใจว่าใช้ CN ที่ไม่ซ้ำกันในทุกกรณี


0

ฉันพบปัญหาที่คล้ายกันกับไคลเอ็นต์ MacOS X ที่สื่อสารกับเซิร์ฟเวอร์ Ubuntu

คุณสามารถตรวจสอบว่าการเชื่อมต่อจะใช้งานได้หรือไม่หากคุณไม่ใช้ใบรับรองฝั่งไคลเอ็นต์และรหัสลูกค้าเพียงแค่มี CA สำหรับใบรับรองเซิร์ฟเวอร์ คุณสามารถสร้างการเชื่อมต่อที่เข้ารหัสได้หรือไม่? โดยปกติจะต้องมีการตั้งค่าใด ๆ สำหรับคอลัมน์ ssl_type ของผู้ใช้


0

เพียงแค่ต้องการทราบสำหรับลูกหลานว่าถ้าคุณต้องการใช้ load balancer (เช่น F5 หรือ HAProxy) ในระหว่าง MySQL และไคลเอนต์คุณจะต้องนำเข้าใบรับรอง SSL ของคุณจาก load balancer ไปยังเซิร์ฟเวอร์ MySQL นี่เป็นเพราะการเริ่มต้นการเชื่อมต่อที่คล้ายกับ STARTTLS

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.