Để kiểm tra một số sự cố kết nối phổ biến trong MySQL, hãy làm theo các bước sau. Quy trình này giúp bạn biết mình đã bật SSL và cấp quyền sử dụng hay chưa
Để tìm giải pháp cho một số sự cố kết nối phổ biến trong MySQL
Kiểm tra
/etc/my.cnf
để đảm bảo SSL được bật cho MySQLTrong MySQL, hãy chạy lệnh sau
show status like 'Ssl%';
Nếu SSL đang hoạt động, bạn sẽ thấy kết quả như sau
+--------------------------------+----------------------+ | Variable_name | Value | +--------------------------------+----------------------+ | Ssl_accept_renegotiates | 0 | | Ssl_accepts | 1 | | Ssl_callback_cache_hits | 0 | | Ssl_cipher | | | Ssl_cipher_list | | | Ssl_client_connects | 0 | | Ssl_connect_renegotiates | 0 | | Ssl_ctx_verify_depth | 18446744073709551615 | | Ssl_ctx_verify_mode | 5 | | Ssl_default_timeout | 0 | | Ssl_finished_accepts | 0 | | Ssl_finished_connects | 0 | | Ssl_session_cache_hits | 0 | | Ssl_session_cache_misses | 0 | | Ssl_session_cache_mode | SERVER | | Ssl_session_cache_overflows | 0 | | Ssl_session_cache_size | 128 | | Ssl_session_cache_timeouts | 0 | | Ssl_sessions_reused | 0 | | Ssl_used_session_cache_entries | 0 | | Ssl_verify_depth | 0 | | Ssl_verify_mode | 0 | | Ssl_version | | +--------------------------------+----------------------+
Nếu SSL bị tắt, bạn sẽ thấy kết quả như sau
+--------------------------------+-------+ | Variable_name | Value | +--------------------------------+-------+ | Ssl_accept_renegotiates | 0 | | Ssl_accepts | 0 | | Ssl_callback_cache_hits | 0 | | Ssl_cipher | | | Ssl_cipher_list | | | Ssl_client_connects | 0 | | Ssl_connect_renegotiates | 0 | | Ssl_ctx_verify_depth | 0 | | Ssl_ctx_verify_mode | 0 | | Ssl_default_timeout | 0 | | Ssl_finished_accepts | 0 | | Ssl_finished_connects | 0 | | Ssl_session_cache_hits | 0 | | Ssl_session_cache_misses | 0 | | Ssl_session_cache_mode | NONE | | Ssl_session_cache_overflows | 0 | | Ssl_session_cache_size | 0 | | Ssl_session_cache_timeouts | 0 | | Ssl_sessions_reused | 0 | | Ssl_used_session_cache_entries | 0 | | Ssl_verify_depth | 0 | | Ssl_verify_mode | 0 | | Ssl_version | | +--------------------------------+-------+
Đảm bảo rằng bạn đã cài đặt chứng chỉ SSL được hỗ trợ trên máy chủ cơ sở dữ liệu
Cấp quyền sử dụng cho người dùng cụ thể để kết nối bằng SSL
GRANT USAGE ON *.* TO 'encrypted_user'@'%' REQUIRE SSL;
Để biết thêm chi tiết về giải pháp trong ví dụ này, hãy xem phần sau
Giao tiếp SSL bắt đầu với giai đoạn handshake
, trong đó public-crypto-key
đang được gửi cho khách hàng để sử dụng trong tương lai. Vì vậy, bạn không cần phải có nó, khách hàng của bạn sẽ nhận được nó.
Vậy thì tại sao chúng ta cần những Public SSL certificate
này?
Public SSL certificate
không bao gồm public-crypto-key
nên bạn thực sự có thể so sánh public-crypto-key
đến từ máy chủ với public-crypto-key
từ Public SSL certificate
của bạn. Bản thân điều này không thực sự có ý nghĩa trừ khi bạn cũng muốn kiểm tra xem public-crypto-key
này có được phát hành bởi một số
+--------------------------------+----------------------+
| Variable_name | Value |
+--------------------------------+----------------------+
| Ssl_accept_renegotiates | 0 |
| Ssl_accepts | 1 |
| Ssl_callback_cache_hits | 0 |
| Ssl_cipher | |
| Ssl_cipher_list | |
| Ssl_client_connects | 0 |
| Ssl_connect_renegotiates | 0 |
| Ssl_ctx_verify_depth | 18446744073709551615 |
| Ssl_ctx_verify_mode | 5 |
| Ssl_default_timeout | 0 |
| Ssl_finished_accepts | 0 |
| Ssl_finished_connects | 0 |
| Ssl_session_cache_hits | 0 |
| Ssl_session_cache_misses | 0 |
| Ssl_session_cache_mode | SERVER |
| Ssl_session_cache_overflows | 0 |
| Ssl_session_cache_size | 128 |
| Ssl_session_cache_timeouts | 0 |
| Ssl_sessions_reused | 0 |
| Ssl_used_session_cache_entries | 0 |
| Ssl_verify_depth | 0 |
| Ssl_verify_mode | 0 |
| Ssl_version | |
+--------------------------------+----------------------+
4 cụ thể hay khôngDù sao, tại sao chúng ta cần kiểm tra xem public-crypto-key
này có được phát hành bởi một số
+--------------------------------+----------------------+
| Variable_name | Value |
+--------------------------------+----------------------+
| Ssl_accept_renegotiates | 0 |
| Ssl_accepts | 1 |
| Ssl_callback_cache_hits | 0 |
| Ssl_cipher | |
| Ssl_cipher_list | |
| Ssl_client_connects | 0 |
| Ssl_connect_renegotiates | 0 |
| Ssl_ctx_verify_depth | 18446744073709551615 |
| Ssl_ctx_verify_mode | 5 |
| Ssl_default_timeout | 0 |
| Ssl_finished_accepts | 0 |
| Ssl_finished_connects | 0 |
| Ssl_session_cache_hits | 0 |
| Ssl_session_cache_misses | 0 |
| Ssl_session_cache_mode | SERVER |
| Ssl_session_cache_overflows | 0 |
| Ssl_session_cache_size | 128 |
| Ssl_session_cache_timeouts | 0 |
| Ssl_sessions_reused | 0 |
| Ssl_used_session_cache_entries | 0 |
| Ssl_verify_depth | 0 |
| Ssl_verify_mode | 0 |
| Ssl_version | |
+--------------------------------+----------------------+
4 cụ thể không? . Bởi vì bạn biết IP của máy chủ MySQL của mình và bạn đã tin tưởng nó
+--------------------------------+----------------------+
| Variable_name | Value |
+--------------------------------+----------------------+
| Ssl_accept_renegotiates | 0 |
| Ssl_accepts | 1 |
| Ssl_callback_cache_hits | 0 |
| Ssl_cipher | |
| Ssl_cipher_list | |
| Ssl_client_connects | 0 |
| Ssl_connect_renegotiates | 0 |
| Ssl_ctx_verify_depth | 18446744073709551615 |
| Ssl_ctx_verify_mode | 5 |
| Ssl_default_timeout | 0 |
| Ssl_finished_accepts | 0 |
| Ssl_finished_connects | 0 |
| Ssl_session_cache_hits | 0 |
| Ssl_session_cache_misses | 0 |
| Ssl_session_cache_mode | SERVER |
| Ssl_session_cache_overflows | 0 |
| Ssl_session_cache_size | 128 |
| Ssl_session_cache_timeouts | 0 |
| Ssl_sessions_reused | 0 |
| Ssl_used_session_cache_entries | 0 |
| Ssl_verify_depth | 0 |
| Ssl_verify_mode | 0 |
| Ssl_version | |
+--------------------------------+----------------------+
4 là một loại public-crypto-key
3 đến từ một cách sử dụng khác của các giao thức được bảo mật SSL được biết đến là public-crypto-key
4. Trong public-crypto-key
4, bạn kết nối với địa chỉ IP không xác định, nhưng có một điều bạn nên chắc chắn - public-crypto-key
6. Tên miền có thể được gán lại cho một địa chỉ IP mới mỗi phút. Và nó có thể được gán lại cho máy chủ cục bộ của riêng bạn [thông qua cấu hình của tệp 'hosts']. Chỉ cần tưởng tượng một loại vi-rút máy tính tinh vi xâm nhập vào máy tính của bạn, triển khai một máy chủ web và chỉ định lại "ngân hàng của bạn". com" đến máy chủ web đó. Lần tới khi bạn mở trình duyệt, bạn nhập thông tin đăng nhập tài khoản ngân hàng của mình, nhưng thay vì cấp cho bạn quyền truy cập vào tài khoản ngân hàng, máy chủ web sẽ gửi thông tin đăng nhập của bạn cho tin tặc. Nó sẽ khó chịu, phải không? Trong HTTPS, trình duyệt của bạn thực hiện một số kiểm tra cho bạn. Nó yêu cầu một public-crypto-key
từ một máy chủ web chỉ để so sánh nó với một danh sách các public-crypto-key
9 đã biết từ
+--------------------------------+----------------------+
| Variable_name | Value |
+--------------------------------+----------------------+
| Ssl_accept_renegotiates | 0 |
| Ssl_accepts | 1 |
| Ssl_callback_cache_hits | 0 |
| Ssl_cipher | |
| Ssl_cipher_list | |
| Ssl_client_connects | 0 |
| Ssl_connect_renegotiates | 0 |
| Ssl_ctx_verify_depth | 18446744073709551615 |
| Ssl_ctx_verify_mode | 5 |
| Ssl_default_timeout | 0 |
| Ssl_finished_accepts | 0 |
| Ssl_finished_connects | 0 |
| Ssl_session_cache_hits | 0 |
| Ssl_session_cache_misses | 0 |
| Ssl_session_cache_mode | SERVER |
| Ssl_session_cache_overflows | 0 |
| Ssl_session_cache_size | 128 |
| Ssl_session_cache_timeouts | 0 |
| Ssl_sessions_reused | 0 |
| Ssl_used_session_cache_entries | 0 |
| Ssl_verify_depth | 0 |
| Ssl_verify_mode | 0 |
| Ssl_version | |
+--------------------------------+----------------------+
4 đáng tin cậy. Sau đó, nó kiểm tra tên miền được gán cho public-crypto-key
9 này và thiết lập xem máy chủ web này có thực sự được phép cung cấp nội dung cho miền được cung cấp hay khôngNhưng sau đó, tại sao "virus tinh vi" của chúng tôi không thể phân tích cú pháp một handshake
và trích xuất một public-crypto-key
từ trang web thực chỉ để cung cấp cho trình duyệt của bạn?
Câu trả lời là - "nó có thể". Và nó có thể cho phép public-crypto-key
4 ủy quyền đi qua, nhưng sau đó máy chủ web lừa đảo sẽ cần phải "nói chuyện" với trình duyệt của bạn. Và để có thể "nói chuyện", máy chủ web lừa đảo sẽ cần sử dụng Public SSL certificate
5 để mã hóa tin nhắn của máy chủ, nhưng rất khó để đạt được Public SSL certificate
5
Thấy chưa, chúng ta đã thắng
Kết thúc
Ngoại trừ một điều, AWS sử dụng tên miền để truy cập RDS chứ không phải địa chỉ IP. Vì vậy, chúng tôi cần public-crypto-key
9. Nhưng MySQL_Workbench không phải là một trình duyệt web nên bạn sẽ nghĩ rằng nó có thể không biết nhiều về Public SSL certificate
8. Nhưng trên thực tế, MySQL_Workbench biết về
+--------------------------------+----------------------+
| Variable_name | Value |
+--------------------------------+----------------------+
| Ssl_accept_renegotiates | 0 |
| Ssl_accepts | 1 |
| Ssl_callback_cache_hits | 0 |
| Ssl_cipher | |
| Ssl_cipher_list | |
| Ssl_client_connects | 0 |
| Ssl_connect_renegotiates | 0 |
| Ssl_ctx_verify_depth | 18446744073709551615 |
| Ssl_ctx_verify_mode | 5 |
| Ssl_default_timeout | 0 |
| Ssl_finished_accepts | 0 |
| Ssl_finished_connects | 0 |
| Ssl_session_cache_hits | 0 |
| Ssl_session_cache_misses | 0 |
| Ssl_session_cache_mode | SERVER |
| Ssl_session_cache_overflows | 0 |
| Ssl_session_cache_size | 128 |
| Ssl_session_cache_timeouts | 0 |
| Ssl_sessions_reused | 0 |
| Ssl_used_session_cache_entries | 0 |
| Ssl_verify_depth | 0 |
| Ssl_verify_mode | 0 |
| Ssl_version | |
+--------------------------------+----------------------+
4 và để kích hoạt nó, bạn cần chuyển đến tab "SSL" và đặt danh sách thả xuống "Sử dụng SSL" thành "Yêu cầu và xác minh CA" - trong trường hợp này, bạn cần cung cấp tệp Public SSL certificate
0 cho " . " đồng ruộngQuay lại câu hỏi của bạn. "tại sao khách hàng báo cáo rằng kết nối được mã hóa SSL khi tôi không cung cấp chứng chỉ?"
Bởi vì nó được mã hóa bằng một số chứng chỉ và khách hàng của bạn có thể sử dụng chứng chỉ do máy chủ MySQL cung cấp hoặc để xác minh CA và có thể từ chối nó. Bây giờ bạn hãy cho tôi biết, tại sao bạn lại thiết lập ứng dụng khách DB của mình để chấp nhận bất kỳ chứng chỉ nào từ máy chủ MySQL mà bỏ qua việc xác minh CA?