ข้อผิดพลาดในการเชื่อมต่อ MySQL 5.1.66 SSL ข้อผิดพลาด 2026 (HY000)


37

UPDATE2

ใช้ 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 (ล้มเหลว):

ป้อนคำอธิบายรูปภาพที่นี่

ทำไมสิ่งนี้ถึงเกิดขึ้น


UPDATE

สิ่งหนึ่งที่น่าสนใจ:
ฉันได้เชื่อมต่อกับ Master DB โดยใช้ Windows 8 ได้สำเร็จ(192.168.18.1)โดยการแก้ไขการตั้งค่า sslus บน Master สำหรับ192.168.18.1โฮสต์ - ทำการเปลี่ยนแปลง: จากREQUIRE SSLเป็นREQUIRE X509เป็น อย่างไรก็ตามสิ่งนี้ใช้ไม่ได้ในกรณีของเราด้วยการเชื่อมต่อแบบทาส - โท - โท


ฉันประสบกับปัญหาการจำลองแบบ SSL ใน CentOS-6.3 ฉันใช้ OpenSSL เพื่อสร้างทั้งไคลเอนต์และใบรับรองเซิร์ฟเวอร์และทั้งไคลเอนต์และใบรับรองเซิร์ฟเวอร์ได้รับการลงนามโดย CA เดียวกัน

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

ใบรับรองทั้งหมดที่ฉันได้รับโดยใช้ส่วน"การตั้งค่าใบรับรองและคีย์ SSL สำหรับ MySQL"ในหน้าช่วยเหลือของ MySQL

ไฟล์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

ใน Master I ตั้งค่าผู้ใช้ทาสด้วย SSL เช่นนี้:

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

ในการอัปเดต Slave ฉันใช้คำสั่งต่อไปนี้ (ตาม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

นี่คือทั้งอาจารย์และทาส

แต่เมื่อฉันตรวจสอบการเชื่อมต่อด้วยตนเองจาก Slave ไปยัง Master ฉันได้รับข้อผิดพลาด

นี่คือตัวเลือกที่ฉันได้ลองไปแล้ว (ผลลัพธ์เดียวกันจากทุกคน):

[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. การตั้งค่า / สร้างทั้งไคลเอนต์และเซิร์ฟเวอร์เซิร์ฟเวอร์ที่เซ็นชื่อโดยแคลิฟอร์เนียเดียวกัน
  2. ตั้งค่าทั้งไฟล์ my.cnf บนไคลเอนต์และเซิร์ฟเวอร์ตามที่กล่าวไว้ในหัวข้อนี้
  3. สร้าง ssluser บน master สำหรับ slave
  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

ข้อมูลใบรับรอง:

แคลิฟอร์เนีย:

[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

ไดเรกทอรีสิทธิ์:

กับอาจารย์:

[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

หากใครบางคนสามารถแนะนำวิธีการแก้ปัญหาฉันจะขอบคุณมันจริงๆ!


ความคิดเห็นไม่ได้มีไว้สำหรับการอภิปรายเพิ่มเติม การสนทนานี้ได้รับการย้ายไปแชท
พอลไวท์

คำตอบ:


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 ล้มเหลวข้อผิดพลาด 2026 (HY000) (Stack Overflow)


1

หากคุณลองทุกอย่าง แต่ SSL ไม่ทำงานและในเวลาเดียวกันคุณกำลังใช้ mysqld เป็น chroot ดังนั้นสาเหตุของข้อผิดพลาดเช่น:

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

หรือ

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

อาจเป็นได้ว่าคุณลืมที่จะสร้างอุปกรณ์ dev / random และอุปกรณ์ dev / urandom ในสภาพแวดล้อม chroot (และ openssl lib ไม่สามารถรับเอนโทรปี - มันจะเปิดอุปกรณ์เหล่านี้หลังจาก chroot) คุณสามารถแก้ไขได้ด้วยวิธีนี้ (แทนที่/srv/mysqldด้วย chroot dir ของคุณและmysqldด้วยผู้ใช้ mysqld ทำงานภายใต้):

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.