ไม่สามารถเชื่อมต่อกับ mysql โดยใช้ใบรับรอง SSL ที่ลงชื่อเอง


15

หลังจากสร้างใบรับรอง SSL ที่ลงชื่อด้วยตนเองฉันได้กำหนดค่าเซิร์ฟเวอร์ MySQL ระยะไกลให้ใช้ (และเปิดใช้งาน SSL)

ฉัน ssh ลงในเซิร์ฟเวอร์ระยะไกลของฉันและลองเชื่อมต่อกับ mysqld ของตัวเองโดยใช้ SSL (เซิร์ฟเวอร์ MySQL คือ 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)

ตกลงฉันจำการอ่านมีปัญหาบางอย่างกับการเชื่อมต่อกับเซิร์ฟเวอร์เดียวกันผ่าน SSL ดังนั้นฉันจึงดาวน์โหลดคีย์ลูกค้าลงในกล่องท้องถิ่นของฉันและทดสอบจากที่นั่น ...

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

มันไม่ชัดเจนว่าข้อผิดพลาด "ข้อผิดพลาดการเชื่อมต่อ SSL" นี้อ้างถึง แต่ถ้าฉันไม่ได้ใช้งาน-ssl-caแล้วฉันสามารถเชื่อมต่อโดยใช้ 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)

อย่างไรก็ตามฉันเชื่อว่านี่เป็นการเข้ารหัสการเชื่อมต่อเท่านั้นและไม่ได้ตรวจสอบความถูกต้องของใบรับรอง (หมายถึงฉันอาจเสี่ยงต่อการถูกโจมตีจากคนกลาง)

SSL certs นั้นถูกต้อง (แม้ว่าจะเซ็นชื่อด้วยตนเอง) และไม่มีข้อความรหัสผ่าน ดังนั้นคำถามของฉันคือฉันทำอะไรผิด ฉันจะเชื่อมต่อผ่าน SSL โดยใช้ใบรับรองที่ลงชื่อด้วยตนเองได้อย่างไร

รุ่นของเซิร์ฟเวอร์ MySQL คือ 5.5.25 และเซิร์ฟเวอร์และไคลเอนต์คือ CentOS 5

ขอบคุณสำหรับคำแนะนำใด ๆ

แก้ไข : โปรดทราบว่าในทุกกรณีคำสั่งจะถูกเรียกใช้จากไดเรกทอรีเดียวกันที่มีคีย์ ssl อยู่ (ดังนั้นจึงไม่มีพา ธ สัมบูรณ์)

แก้ไข (เพื่อตอบสนองต่อ mgorven): ca.certเป็นผู้ออกใบรับรองซึ่งควรจะบอก mysql ว่าผู้ออกใบรับรองของฉันเชื่อถือได้

การกำหนดค่าจากmy.cnfคือ

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

ฉันลองเพิ่มssl-cipher=DHE-RSA-AES256-SHAแต่ลบออกไปเพราะมันไม่ได้ช่วยอะไร


2
คือca.certอะไร มันเป็นใบรับรองที่ลงนามเองของเซิร์ฟเวอร์หรือไม่ คุณใช้ใบรับรองไคลเอ็นต์สำหรับการตรวจสอบสิทธิ์หรือไม่ โปรดระบุการกำหนดค่าที่เกี่ยวข้องกับ SSL บนเซิร์ฟเวอร์
mgorven

ขอบคุณฉันได้ปรับปรุงคำถามของฉันด้วยการตอบสนองและการตั้งค่า SSL จากเซิร์ฟเวอร์ ใบรับรองที่ถูกส่งผ่าน commandline เมื่อพยายามเชื่อมต่อเป็นใบรับรองของลูกค้า
carpii

Infact เป็นคำถามที่ดี ในการเข้าใจถึงปัญหาหลังไม่แน่ใจว่าเหมาะสมสำหรับไคลเอ็นต์ที่จะระบุเซิร์ฟเวอร์ ssl-ca แต่ถ้าไม่มี Im ภายใต้ imrepssion การเชื่อมต่อที่เข้ารหัสจะไม่ได้รับการรับรองความถูกต้องอย่าง
เข้มงวด

คำตอบ:


12

ใช่คุณถูกต้องหากคุณไม่ได้ระบุ--ssl-caลูกค้าจะไม่ตรวจสอบใบรับรองเซิร์ฟเวอร์เลย เนื่องจากมันทำงานโดยไม่มีตัวเลือกนั้นเหตุผลที่เป็นไปได้มากที่สุดสำหรับความล้มเหลวก็คือไคลเอนต์ไม่เชื่อถือใบรับรองเซิร์ฟเวอร์

หากคุณใช้ใบรับรองไคลเอ็นต์และเซิร์ฟเวอร์ที่ลงนามด้วยตนเองca.certไฟล์ควรมีทั้งไฟล์เหล่านี้ วิธีนี้ลูกค้าจะเชื่อถือใบรับรองเซิร์ฟเวอร์และเซิร์ฟเวอร์จะเชื่อถือใบรับรองลูกค้า

ตัวอย่างเช่น:
สร้างเซิร์ฟเวอร์คีย์และใบรับรอง:

$ 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:

สร้างรหัสลูกค้าและใบรับรอง:

$ 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:

รวมไคลเอ็นต์และใบรับรองเซิร์ฟเวอร์เข้ากับไฟล์ใบรับรอง CA:

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

ขอบคุณมาก! ขั้นตอนที่ขาดหายไปคือฉันไม่ได้ต่อเซิร์ฟเวอร์และไคลเอนต์เข้ากับ c.pem ฉันแทนที่จะส่งผ่าน ca.cert ซึ่งสร้างขึ้นในตอนแรก (และผ่านเป็น --CA- คีย์เมื่อสร้างไคลเอนต์และเซิร์ฟเวอร์เซิร์ฟเวอร์)
carpii

แปลก แต่มันก็ใช้ได้กับฉันเสมอด้วยใบรับรอง CA เพียงใบเดียว - เหมือนกันบนไคลเอนต์และเซิร์ฟเวอร์
Dmitry Leskov

ใช่ตราบใดที่ไม่มีข้อกำหนดพิเศษสำหรับ DN - เช่น CN เป็นค่าเฉพาะ - จากนั้นคุณสามารถใช้คีย์เดียวกันและใบรับรองแบบลงนามด้วยตนเองบนไคลเอนต์และเซิร์ฟเวอร์
Keith Burdis

3

หากต้องการใช้ ssl แบบทางเดียวคุณควรลองทำสิ่งต่อไปนี้

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

--ssl-certและ--ssl-keyใน MySQL ลูกค้าที่มีการใช้ 2 วิธี SSL นี่หมายถึงการรับรองความถูกต้องตามใบรับรอง หัวเรื่องของใบรับรองไคลเอ็นต์ควรเป็นชื่อผู้ใช้


2
โปรดจำไว้ว่าเมื่อทำการเชื่อมต่อซ็อกเก็ตและการใช้--ssl-verify-server-certCN ของใบรับรองเซิร์ฟเวอร์จะต้องเหมือนกับโฮสต์ที่คุณระบุสำหรับตัวเลือกบรรทัดคำสั่ง -h
Keith Burdis

0

ไม่ว่าในกรณีใดก็ตามคุณไม่ได้ป้อนชื่อสามัญเหมือนกันสำหรับเซิร์ฟเวอร์และไคลเอนต์ ถ้าใช่ให้แทนที่หนึ่งในนั้นเพื่อให้ชื่อสามัญแตกต่างกัน


สำหรับฉันแล้วโซลูชันของ Dmitry Leskov ทำงานได้ ตามเอกสาร SSL ของ MySQL: ( dev.mysql.com/doc/refman/5.0/en/creating-ssl-certs.html )> ไม่ว่าคุณจะใช้วิธีใดในการสร้างใบรับรองและไฟล์คีย์ค่าชื่อสามัญที่ใช้สำหรับเซิร์ฟเวอร์และ ใบรับรอง / คีย์ไคลเอ็นต์แต่ละรายการจะต้องแตกต่างจากค่าชื่อสามัญที่ใช้สำหรับใบรับรอง CA มิฉะนั้นไฟล์ใบรับรองและคีย์จะไม่ทำงานสำหรับเซิร์ฟเวอร์ที่คอมไพล์ด้วย OpenSSL มีข้อผิดพลาดทั่วไปในกรณีนี้คือ: ข้อผิดพลาด 2026 (HY000): ข้อผิดพลาดการเชื่อมต่อ SSL: ข้อผิดพลาด: 00000001: lib (0): func (0): เหตุผล (1)
gmas
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.