OpenSSL có thể được sử dụng để gỡ lỗi kết nối SSL đến máy chủ MySQL không?


21

Tôi muốn máy chủ web của tôi nói chuyện với máy chủ cơ sở dữ liệu MySQL qua kết nối SSL. Máy chủ web chạy CentOS5, Máy chủ cơ sở dữ liệu chạy FreeBSD. Các chứng chỉ được cung cấp bởi một CA DigiCert trung gian.

MySQL nên được sử dụng ssl, theo 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

Khi tôi khởi động MySQL, trình nền bắt đầu không có lỗi. Điều này cho thấy rằng các tập tin chứng chỉ đều có thể đọc được.

Nhưng khi tôi cố gắng kết nối từ máy chủ web đến máy chủ cơ sở dữ liệu, tôi gặp lỗi:

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

Và nếu tôi cố gắng gỡ lỗi thêm với 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:

Đây có phải là cách hợp lệ để kiểm tra kết nối SSL đến máy chủ cơ sở dữ liệu MySQL không? Các SSL23_GET_SERVER_HELLO:unknown protocolthông điệp là lạ vì đây thường những gì bạn sẽ thấy nếu bạn đang nói SSL trên một cổng dành cho giao thông không tuân thủ SSL.

Lệnh openssl tương tự này dường như hoạt động tốt với các máy chủ 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

Lưu ý rằng bạn cũng có thể sử dụng Wireshark để kiểm tra lưu lượng SSL đến máy chủ MySQL, xem i.imgur.com/5uTkLqU.png .
Jaime Hablutzel

Câu trả lời:


11

OpenSSL phiên bản 1.1.1 (phát hành vào ngày 11 tháng 9 năm 2018) thêm hỗ trợ cho -starttls mysqltrong phạm a2d9cfbac5d87b03496d62079aef01c601193b58 . Thật không may, tôi không thể tìm thấy tài liệu tham khảo cho tính năng mới này trong danh sách thay đổi OpenSSL.

Nếu bản phân phối của bạn chưa có phiên bản này, có một tệp nhị phân openssl được biên dịch tĩnh tại https://testssl.sh/openssl-1.0.2k-dev-chacha.pm.ipv6.Linux+FreeBSD.tar.gz có hỗ trợ -starttls mysql. Tôi đã tìm thấy tài liệu tham khảo về nó trong http://www.danneman.org/presentations/Automating_TLS_Configuration_Verification.pdf .

Đối với Windows, các nhị phân OpenSSL 1.1.1 có thể được tìm thấy tại https://wiki.openssl.org/index.php/Binaries

Tôi đã tạo chứng chỉ SSL như được mô tả trong https://dev.mysql.com/doc/refman/5.7/en/creating-ssl-files-USE-openssl.html , đã thử và nó hoạt động:

$ 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

Ngoài ra còn có -starttlshỗ trợ cho postgres và ldap trong OpenSSL 1.1.1. Xem https://github.com/openssl/openssl/blob/OpenSSL_1_1_1-urdy/apps/s_client.c#L815-L831 để biết danh sách đầy đủ.


12

Trả lời câu hỏi của riêng tôi. Nếu bạn có câu trả lời tốt hơn với các nguồn tốt, có thẩm quyền xin vui lòng gửi câu trả lời.

Câu trả lời ngắn; Không, OpenSSL không thể được sử dụng để gỡ lỗi các kết nối SSL SSL. Điều này là do MySQL bắt đầu phiên sử dụng văn bản gốc và chuyển sang SSL sau đó.

Khi đọc https://dev.mysql.com/doc/dev/mysql-server/latest/page_protatio_connection_phase.html , MySQL bắt đầu với một kết nối văn bản gốc và sau đó SSL thực tế được bắt đầu sau đó. Điều này giải thích cách MySQL có thể nghe trên một cổng (cổng 3306) cho cả kết nối văn bản gốc và mã hóa. So sánh điều này với máy chủ HTTP hoặc LDAP, trong đó một cổng được sử dụng cho các kết nối văn bản gốc và một cổng thứ hai được sử dụng cho các kết nối được mã hóa.

Nó bắt đầu với ứng dụng khách kết nối () với máy chủ có thể gửi gói ERR và hoàn thành bắt tay hoặc gửi Gói bắt tay ban đầu mà khách hàng trả lời bằng Gói phản hồi bắt tay. Ở giai đoạn này, khách hàng có thể yêu cầu kết nối SSL, trong trường hợp đó, kênh truyền thông SSL được thiết lập trước khi khách hàng gửi phản hồi xác thực


1
Điều này giống như cách thức hoạt động của SMTP khi bạn sử dụng STARTTLS và nó cũng cho phép bạn sử dụng các kết nối được mã hóa và không được mã hóa trên cùng một cổng.
Synchro

Hừm, tôi cho rằng hành vi mà tôi đang nói đến là cách STARTTLS hoạt động, theo en.wikipedia.org/wiki/STARTTLS .
Stefan Lasiewski

2
Mặc dù MySQL hoạt động " như STARTTLS", nhưng nó không thực sự triển khai STARTTLS, ít nhất là không theo bất kỳ cách nào mà tôi thấy OpenSSL có thể tương tác thành công.
Christopher Schultz


0

Tôi đang gặp vấn đề tương tự với máy khách MacOS X giao tiếp với máy chủ Ubuntu.

Bạn có thể kiểm tra xem kết nối có hoạt động không nếu bạn bỏ chứng chỉ phía máy khách và khóa máy khách, chỉ cần có CA cho chứng chỉ máy chủ? Bạn có thể thiết lập một kết nối được mã hóa? Điều này thường sẽ yêu cầu cài đặt BẤT K for cho cột ssl_type của người dùng được liên kết.


0

Chỉ muốn lưu ý cho hậu thế rằng nếu bạn muốn sử dụng bộ cân bằng tải (như F5 hoặc HAProxy) ở giữa MySQL và máy khách, bạn sẽ muốn nhập chứng chỉ SSL của mình từ bộ cân bằng tải vào máy chủ MySQL. Điều này là do khởi động kết nối giống như STARTTLS.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.