Không thể kết nối với mysql bằng chứng chỉ SSL tự ký


15

Sau khi tạo chứng chỉ SSL tự ký, tôi đã cấu hình máy chủ MySQL từ xa của mình để sử dụng chúng (và SSL được bật)

Tôi ssh vào máy chủ từ xa của mình và thử kết nối với mysqld của chính nó bằng SSL (máy chủ MySQL là 5.5.25) ..

mysql -u <user> -p --ssl=1 --ssl-cert=client.cert --ssl-key=client.key --ssl-ca=ca.cert
Enter password: 
ERROR 2026 (HY000): SSL connection error: error:00000001:lib(0):func(0):reason(1)

Ok, tôi nhớ đã đọc có một số vấn đề với việc kết nối với cùng một máy chủ thông qua SSL. Vì vậy, tôi tải các khóa máy khách xuống hộp cục bộ của mình và kiểm tra từ đó ...

mysql -h <server> -u <user> -p --ssl=1 --ssl-cert=client.cert --ssl-key=client.key --ssl-ca=ca.cert 
Enter password: 
ERROR 2026 (HY000): SSL connection error

Không rõ lỗi "lỗi kết nối SSL" này là gì, nhưng nếu tôi bỏ qua -ssl-ca, thì tôi có thể kết nối bằng SSL ..

mysql -h <server> -u <user> -p --ssl=1 --ssl-cert=client.cert --ssl-key=client.key 
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 37
Server version: 5.5.25 MySQL Community Server (GPL)

Tuy nhiên, tôi tin rằng đây chỉ là mã hóa kết nối và không thực sự xác minh tính hợp lệ của chứng chỉ (có nghĩa là tôi sẽ dễ bị tấn công giữa chừng)

Các chứng chỉ SSL là hợp lệ (mặc dù tự ký) và không có cụm mật khẩu trên chúng. Vì vậy, câu hỏi của tôi là, tôi đang làm gì sai? Làm cách nào tôi có thể kết nối qua SSL, bằng chứng chỉ tự ký?

Phiên bản máy chủ MySQL là 5.5.25 và máy chủ và máy khách là CentOS 5.

Cảm ơn vì lời khuyên

Chỉnh sửa : Lưu ý rằng trong mọi trường hợp, lệnh được phát ra từ cùng thư mục chứa các khóa ssl (do đó không có đường dẫn tuyệt đối)

Chỉnh sửa (để phản hồi với mgorven): ca.certlà chứng chỉ của Cơ quan cấp chứng chỉ, được cho là để thông báo cho mysql rằng cơ quan cấp chứng chỉ của tôi được tin cậy.

Cấu hình từ my.cnf

[mysqld]
ssl-ca=/etc/ssl/mysql/ca.cert
ssl-cert=/etc/ssl/mysql/server.cert
ssl-key=/etc/ssl/mysql/server.key

Tôi cũng đã thử thêm ssl-cipher=DHE-RSA-AES256-SHAnhưng đã loại bỏ nó vì nó không giúp ích gì.


2
ca.certgì Đây có phải là chứng chỉ tự ký của máy chủ không? Bạn đang sử dụng chứng chỉ ứng dụng khách để xác thực? Vui lòng cung cấp cấu hình liên quan đến SSL trên máy chủ.
mgorven

Cảm ơn, Ive đã cập nhật câu hỏi của tôi với phản hồi và ssl config từ máy chủ. Các chứng chỉ được truyền trên dòng lệnh khi cố gắng kết nối thực sự là chứng chỉ ứng dụng khách.
carpii

Thực hiện nó là một câu hỏi hay. Nhìn chung, tôi không chắc chắn khách hàng có thể chỉ định máy chủ ssl-ca. Nhưng sau đó không có Im dưới sự xâm nhập, kết nối được mã hóa không được xác thực
nghiêm ngặt

Câu trả lời:


12

Có, bạn đúng rằng nếu bạn không chỉ định --ssl-cathì máy khách hoàn toàn không kiểm tra chứng chỉ máy chủ. Vì nó hoạt động mà không có tùy chọn đó, lý do rất có thể cho sự thất bại là máy khách không tin tưởng vào chứng chỉ máy chủ.

Nếu bạn đang sử dụng chứng chỉ máy khách và máy chủ tự ký thì ca.certtệp sẽ bao gồm cả hai tệp này. Bằng cách đó, khách hàng sẽ tin tưởng vào chứng chỉ máy chủ và máy chủ sẽ tin tưởng vào chứng chỉ máy khách.

Ví dụ:
Tạo khóa máy chủ và chứng chỉ:

$ openssl req -x509 -newkey rsa:1024 \
         -keyout server-key-enc.pem -out server-cert.pem \
         -subj '/DC=com/DC=example/CN=server' -passout pass:qwerty

$ openssl rsa -in server-key-enc.pem -out server-key.pem \
         -passin pass:qwerty -passout pass:

Tạo khóa khách và chứng chỉ:

$ openssl req -x509 -newkey rsa:1024 \
         -keyout client-key-enc.pem -out client-cert.pem \
         -subj '/DC=com/DC=example/CN=client' -passout pass:qwerty

$ openssl rsa -in client-key-enc.pem -out client-key.pem \
         -passin pass:qwerty -passout pass:

Kết hợp các chứng chỉ máy khách và máy chủ vào tệp chứng chỉ CA:

$ cat server-cert.pem client-cert.pem > ca.pem

Cảm ơn bạn rất nhiều! Bước còn thiếu là tôi đã không ghép các máy chủ và máy khách vào một ca.pem. Thay vào đó, tôi đã chuyển ca.cert được tạo ban đầu (và sau đó được chuyển dưới dạng --CA-key khi tạo certs máy khách và máy chủ)
carpii

Lạ, nhưng nó luôn hoạt động với tôi chỉ với một chứng chỉ CA - tương tự trên máy khách và máy chủ.
Dmitry Leskov

Có, miễn là không có yêu cầu đặc biệt nào đối với DN - ví dụ CN là một giá trị cụ thể - thì bạn có thể sử dụng cùng một khóa và chứng chỉ tự ký trên máy khách và máy chủ.
Keith Burdis

3

Để sử dụng ssl một chiều, bạn nên thử với:

mysql -u <user> -p --ssl=1 --ssl-ca=ca.cert --ssl-verify-server-cert

Các --ssl-cert--ssl-keytrên máy khách mysql được sử dụng cho 2 chiều SSL. Điều này có nghĩa là chứng thực dựa trên chứng chỉ. Chủ đề của chứng chỉ ứng dụng khách phải là tên người dùng.


2
Cũng lưu ý rằng khi thực hiện kết nối ổ cắm và sử dụng --ssl-verify-server-certCN của chứng chỉ máy chủ phải giống với máy chủ bạn chỉ định cho tùy chọn dòng lệnh -h.
Keith Burdis

0

Trong mọi trường hợp, bạn đã không nhập cùng một Tên chung cho các máy chủ và máy khách? Nếu có, thay thế một trong số chúng để Tên chung khác nhau.


Đối với tôi, giải pháp của Dmitry Leskov có hiệu quả. Theo tài liệu SSL của MySQL: ( dev.mysql.com/doc/refman/5.0/en/creating-ssl-certs.html )> Dù bạn sử dụng phương pháp nào để tạo chứng chỉ và tệp chính, giá trị Tên chung được sử dụng cho máy chủ và mỗi chứng chỉ / khóa khách phải khác với giá trị Tên chung được sử dụng cho chứng chỉ CA. Mặt khác, các tệp chứng chỉ và khóa sẽ không hoạt động đối với các máy chủ được biên dịch bằng OpenSSL. Một lỗi điển hình trong trường hợp này là: ERROR 2026 (HY000): Lỗi kết nối SSL: lỗi: 00000001: lib (0): func (0): reason (1)
gmas
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.