MySQL 5.1.66 SSL 연결 오류 오류 2026 (HY000)


37

업데이트 2

WireShark를 사용하여 문제 문자열을 찾았습니다.

28 | 9.582638 | 192.168.18.128 | 192.168.18.129 | MySQL Response Error 1043

그리고 오류는 ( 문서 에 따라 )입니다.

Error: 1043 SQLSTATE: 08S01 (ER_HANDSHAKE_ERROR)
Message: Bad handshake 

다음은 두 가지 경우에 WireShark의 스크린 샷입니다.

Windows 8에서의 연결 (성공) :

여기에 이미지 설명을 입력하십시오

CentOS에서 연결 (실패) :

여기에 이미지 설명을 입력하십시오

왜 이런 일이 발생합니까?


최신 정보

한 가지 흥미로운 통지 : 호스트에서 변경 한 Master에서 ssluser 설정을 수정
하여 Windows 8 (192.168.18.1)을 사용하여 Master DB와 성공적으로 연결 했습니다 . 그러나 슬레이브 대 마스터 연결의 경우에는 작동하지 않습니다.192.168.18.1REQUIRE SSLREQUIRE X509


CentOS-6.3에서 SSL 복제 문제에 직면했습니다. 클라이언트와 서버 인증서를 모두 생성하기 위해 OpenSSL을 사용하고 있으며 클라이언트와 서버 인증서 모두 동일한 CA에 의해 서명되었습니다.

Server IP: 192.168.18.128
Slave  IP: 192.168.18.129
MySQL version 5.1.66 SSL

MySQL 도움말 페이지의 "MySQL 용 SSL 인증서 및 키 설정" 섹션을 사용하여받은 모든 인증서 .

서버의 my.cnf 파일 :

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

클라이언트의 my.cnf 파일 :

[client]
ssl-ca=/etc/mysql/ssl/ca-cert.pem
ssl-key=/etc/mysql/ssl/client-key.pem
ssl-cert=/etc/mysql/ssl/client-cert.pem

마스터에서 다음과 같이 SSL을 사용하여 슬레이브 사용자를 설정합니다.

CREATE USER 'ssluser'@'192.168.18.129' IDENTIFIED BY 'sslpass';
GRANT REPLICATION SLAVE ON *.* TO 'ssluser'@'192.168.18.129' REQUIRE SSL;

슬레이브를 업데이트하려면 다음 명령을 사용하고 있습니다 (명령에 따라 show master status).

SLAVE STOP;
CHANGE MASTER TO \
             MASTER_HOST='192.168.18.128',                      \
             MASTER_USER='sslreplicant',                        \
             MASTER_PASSWORD='db.sslreplicantprimary',          \
             MASTER_LOG_FILE='mysql-bin.000026',                \
             MASTER_LOG_POS=106,                                \
             MASTER_SSL=1,                                      \
             MASTER_SSL_CA='/etc/mysql/certs/ca-cert.pem',      \
             MASTER_SSL_CAPATH='/etc/mysql/certs/',             \
             MASTER_SSL_CERT='/etc/mysql/certs/client-cert.pem',\
             MASTER_SSL_KEY='/etc/mysql/certs/client-key.pem';
SLAVE START;

복제 자체가 잘 작동합니다.

mysql> SHOW VARIABLES LIKE '%ssl%';

have_openssl  = YES
have_ssl      = YES
ssl_ca        = /etc/mysql/certs/ca-cert.pem
ssl_capath    =
ssl_cert      = /etc/mysql/certs/server-cert.pem
ssl_cipher    =
ssl_key       = /etc/mysql/certs/server-key.pem

이것은 마스터와 슬레이브에 있습니다.

그러나 슬레이브에서 마스터로의 연결을 수동으로 확인하면 오류가 발생합니다.

지금까지 시도한 옵션은 다음과 같습니다 (모든 사람과 동일한 결과).

[gahcep@localhost  ~]$ mysql -u ssluser -h 192.168.18.128 -p

[gahcep@localhost  ~]$ mysql --ssl --ssl-ca=/etc/mysql/certs/ca-cert.pem \
                             -u ssluser -h 192.168.18.128 -p

[gahcep@localhost ~]$ mysql --ssl-ca=/etc/mysql/certs/ca-cert.pem \
                            --ssl-cert=/etc/mysql/certs/client-cert.pem \
                            --ssl-key=/etc/mysql/certs/client-key.pem \
                            -u ssluser -h 192.168.18.128 -p

Enter password:
ERROR 2026 (HY000): SSL connection error

재현 단계 :

  1. 동일한 ca로 서명 한 클라이언트 및 서버 인증서를 모두 설정 / 생성합니다.
  2. 이 스레드에서 언급 한대로 클라이언트와 서버에서 my.cnf 파일을 모두 설정하십시오.
  3. 슬레이브에 대한 마스터에 ssluser를 만듭니다.
  4. mysql -u ssluser -h 192.168.18.128 -p

실제로 모든 인증서에 대해 CA, clien 및 서버의 다른 공통 이름 을 사용했습니다 .


추가 정보

검증 결과 :

[gahcep@localhost ~]$ sudo openssl verify -purpose sslclient \
           -CAfile /etc/mysql/certs/ca-cert.pem /etc/mysql/certs/client-cert.pem
/etc/mysql/certs/client-cert.pem: OK

[gahcep@localhost ~]$ sudo openssl verify -purpose sslserver \
           -CAfile /etc/mysql/certs/ca-cert.pem /etc/mysql/certs/server-cert.pem
/etc/mysql/certs/server-cert.pem: OK

정보를 제공합니다.

CA :

[gahcep@localhost ~]$ sudo openssl x509 -noout -subject -issuer -dates \
           -serial -hash -fingerprint -in /etc/mysql/certs/ca-cert.pem
subject= /C=RU/L=Vladivostok/O=Default Company Ltd/CN=PriSec
issuer= /C=RU/L=Vladivostok/O=Default Company Ltd/CN=PriSec
notBefore=Jan  4 06:27:46 2013 GMT
notAfter=Nov 13 06:27:46 2022 GMT
serial=B45D177E85F99578
c2c5b88b
SHA1 Fingerprint=5B:07:AA:39:28:24:CE:1A:CF:35:FA:14:36:23:65:8F:84:61:B0:1C

고객 인증서 :

[gahcep@localhost ~]$ sudo openssl x509 -noout -subject -issuer -dates \
           -serial -hash -fingerprint -in /etc/mysql/certs/client-cert.pem
subject= /C=RU/L=Vladivostok/O=Default Company Ltd/CN=Secondary
issuer= /C=RU/L=Vladivostok/O=Default Company Ltd/CN=PriSec
notBefore=Jan  4 06:29:07 2013 GMT
notAfter=Nov 13 06:29:07 2022 GMT
serial=01
6df9551f
SHA1 Fingerprint=F5:9F:4A:14:E8:96:26:BC:71:79:43:5E:18:BA:B2:24:BE:76:17:52

서버 인증서 :

[gahcep@localhost ~]$ sudo openssl x509 -noout -subject -issuer -dates \
            -serial -hash -fingerprint -in /etc/mysql/certs/server-cert.pem
subject= /C=RU/L=Vladivostok/O=Default Company Ltd/CN=Primary
issuer= /C=RU/L=Vladivostok/O=Default Company Ltd/CN=PriSec
notBefore=Jan  4 06:28:25 2013 GMT
notAfter=Nov 13 06:28:25 2022 GMT
serial=01
64626d57
SHA1 Fingerprint=39:9E:7A:9E:60:9A:58:68:81:2F:90:A5:9B:BF:E8:26:C5:9D:3C:AB

디렉토리 Permissions :

마스터에서 :

[gahcep@localhost ~]$ ls -la /etc/mysql/certs/
drwx------. 3 mysql  mysql  4096 Jan  3 23:49 .
drwx------. 3 mysql  mysql  4096 Jan  3 07:34 ..
-rw-rw-r--. 1 gahcep gahcep 1261 Jan  3 22:27 ca-cert.pem
-rw-rw-r--. 1 gahcep gahcep 1675 Jan  3 22:27 ca-key.pem
-rw-rw-r--. 1 gahcep gahcep 1135 Jan  3 22:28 server-cert.pem
-rw-rw-r--. 1 gahcep gahcep 1679 Jan  3 22:28 server-key.pem
-rw-rw-r--. 1 gahcep gahcep  976 Jan  3 22:28 server-req.pem

슬레이브에 :

[gahcep@localhost ~]$ ls -la /etc/mysql/certs/
drwx------. 3 mysql mysql 4096 Jan  3 22:57 .
drwx------. 3 mysql mysql 4096 Jan  3 07:50 ..
-rw-r--r--. 1 root  root  1261 Jan  3 22:56 ca-cert.pem
-rw-r--r--. 1 root  root  1139 Jan  3 22:57 client-cert.pem
-rw-r--r--. 1 root  root  1675 Jan  3 22:57 client-key.pem

누군가가 해결책을 제안 할 수 있다면 정말 감사하겠습니다!


의견은 긴 토론을위한 것이 아닙니다. 이 대화는 채팅 으로 이동 되었습니다 .
Paul White

답변:


2

mysql 사용자가 소유 한 인증서 파일을 다른 사용자가 읽을 수 없도록 만드십시오.

고정 암호로 시도 할 수도 있습니다.

mysql ... --ssl-cipher=AES128-SHA

그리고 변경 마스터의 경우 :

CHANGE MASTER TO ... MASTER_SSL_CIPHER='AES128-SHA'


1

가능한 해결책:

MySQL 서버가 yaSSL을 사용하는지 OpenSSL을 사용하는지 확인하는 방법

적절한 글로벌 상태 값이없는 경우 해결 방법을 보여줍니다. 아이디어는 Rsa_public_key상태 변수 를 확인하는 것입니다 .

mysql> show status like '%rsa%';
+----------------+-------+
| Variable_name  | Value |
+----------------+-------+
| Rsa_public_key |       |
+----------------+-------+
1 row in set (0.00 sec)

OpenSSL을 사용중인 경우 해당 변수가 존재합니다. 그렇지 않으면 yaSSL입니다.

다른 가능성 :

MySQL 및 SSL 연결 실패 ERROR 2026 (HY000) (스택 오버플로)


1

모든 것을 시도했지만 SSL이 작동하지 않고 chroot에서 mysqld를 실행하는 경우 다음과 같은 오류의 원인이 있습니다.

ERROR 2026 (HY000): SSL connection error: error:00000001:lib(0):func(0):reason(1)

또는

ERROR 2026 (HY000): SSL connection error: protocol version mismatch

chroot 환경에서 dev / random 및 dev / urandom 장치를 만드는 것을 잊었을 수 있습니다 (그리고 openssl lib는 엔트로피를 얻을 수 없습니다-chroot 후에 이러한 장치를 엽니 다 ). 이 방법으로 문제를 해결할 수 있습니다 ( /srv/mysqldchroot dir 및 mysqldmysqld가 실행중인 사용자로 대체 ).

sudo install -d -o mysqld -g mysqld -m 500 /srv/mysqld/dev
sudo mknod -m 444 /srv/mysqld/dev/random c 1 8
sudo mknod -m 444 /srv/mysqld/dev/urandom c 1 9
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.