เปิดใช้งาน SSL ใน MySQL


24

ฉันใช้ Ubuntu Server 12.04 และฉันต้องการเปิดใช้งานการเชื่อมต่อ SSL กับ MySQL

ฉันสร้างไฟล์คีย์ / certs ต่อไปนี้ด้วย OpenSSL:

  • CA-cert.pem
  • เซิร์ฟเวอร์ cert.pem
  • เซิร์ฟเวอร์ key.pem

ฉันเก็บสิ่งเหล่านี้ที่/etc/mysqlแล้วเพิ่มบรรทัดต่อไปนี้ลงใน/etc/mysql/my.cnf:

ssl-ca=/etc/mysql/ca-cert.pem
ssl-cert=/etc/mysql/server-cert.pem
ssl-key=/etc/mysql/server-key.pem

sudo service restart mysqlต่อไปผมจะเริ่มต้นใหม่เซิร์ฟเวอร์ด้วย

อย่างไรก็ตามดูเหมือนจะไม่เปิดใช้งาน SSL ภายในช่วง mysql:

mysql> show variables like '%ssl%';
+---------------+----------------------------+
| Variable_name | Value                      |
+---------------+----------------------------+
| have_openssl  | DISABLED                   |
| have_ssl      | DISABLED                   |
| ssl_ca        | /etc/mysql/ca-cert.pem     |
| ssl_capath    |                            |
| ssl_cert      | /etc/mysql/server-cert.pem |
| ssl_cipher    |                            |
| ssl_key       | /etc/mysql/server-key.pem  |
+---------------+----------------------------+

ความคิดใด ๆ ที่ฉันขาดหายไป? ขอบคุณ


2
ลองดูกระทู้ที่ยอดเยี่ยมนี้บางทีมันอาจช่วยคุณได้
SirCharlo

ขอบคุณสำหรับลิงค์ SirCharlo แต่ปัญหาที่ระบุในเธรดนั้นดูเหมือนจะไม่สามารถนำไปใช้กับสถานการณ์ของฉันได้
เยี่ยมชม 93746

1
สิ่งที่ @SirCharlo กล่าวถึงคือที่ที่คุณต้องการค้นหา โดยเฉพาะ AppArmor ส่วนหนึ่งและโพสต์ # คีย์ที่ฉันสร้างขึ้นบน Debian Squeeze หรือ Ubuntu รุ่นเก่าทำงานได้ดีการสร้างใหม่ใน 12.04 ทำให้มันล้มเหลวอีกครั้ง ดูบันทึกข้อผิดพลาด MySQL เช่นกัน
gertvdijk

2
ฉันมีคำถามเดียวกันนี้และใช้เวลาเป็นชั่วโมง แต่คำตอบของ @ user262116 แก้ไขได้ ฉันขอแนะนำให้คุณยอมรับคำตอบนั้นถ้ามันช่วยคุณได้!
elixenide

คำตอบ:


33

Ubuntu 12.04 มาพร้อมกับ OpenSSL 1.0.1 ซึ่งมีค่าเริ่มต้นแตกต่างจากรุ่น OpenSSL 0.9.8 ที่ค่อนข้างเก่า

เหนือสิ่งอื่นใดหากคุณใช้openssl req -newkey rsa:2048ในการสร้างคีย์ RSA คุณจะจบลงด้วยการที่สำคัญในรูปแบบที่เรียกว่าPKCS # 8 แสดงในรูปแบบ PEM คีย์เหล่านี้มี-----BEGIN PRIVATE KEY-----ส่วนหัวทั่วไปมากกว่าซึ่งไม่ได้บอกคุณว่าเป็นคีย์ชนิดใด (RSA, DSA, EC)

ก่อนหน้านี้มี OpenSSL 0.9.8, กุญแจได้เสมอในรูปแบบที่เรียกว่าPKCS # 1-----BEGIN RSA PRIVATE KEY-----ซึ่งแสดงเป็นพีอีเอ็มมีส่วนหัว

ด้วยเหตุนี้คุณจึงไม่สามารถเปลี่ยนส่วนหัวและส่วนท้ายจาก:

-----BEGIN PRIVATE KEY-----

ไปยัง

-----BEGIN RSA PRIVATE KEY-----`

มันไม่เหมือนกันและมันจะไม่ทำงาน openssl rsaแต่คุณต้องแปลงกุญแจสำคัญในรูปแบบเก่าใช้ อย่างนี้:

openssl rsa -in key_in_pkcs1_or_pkcs8.pem -out key_in_pkcs1.pem

MySQL (v5.5.35) บน Ubuntu 12.04 กำลังใช้งาน SSL ที่ชื่อ yaSSL (v2.2.2) คาดว่ากุญแจจะอยู่ในรูปแบบ PKCS # 1 และไม่สนับสนุนรูปแบบ PKCS # 8 ที่ใช้โดย OpenSSL 1.0 และใหม่กว่า หากคุณเพียงแค่เปลี่ยนส่วนหัวและส่วนท้ายตามที่แนะนำโดยโพสต์อื่นในกระทู้นี้ MySQL / yaSSL จะไม่บ่น แต่คุณจะไม่สามารถเชื่อมต่อและจบลงด้วยข้อผิดพลาดดังนี้:

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

Ubuntu 14.04มาพร้อมกับ OpenSSL 1.0.1f และการตั้งค่าใหม่ เหนือสิ่งอื่นใดมันจะสร้างใบรับรองด้วยการแยกย่อย SHA256 แทน SHA1 ซึ่งใช้ในเวอร์ชันก่อนหน้า อนึ่งรุ่น yaSSL ที่มาพร้อมกับ MySQL ไม่รองรับสิ่งนี้

หากคุณกำลังสร้างใบรับรองเพื่อใช้กับ MySQL อย่าลืมตรวจสอบให้แน่ใจว่าคีย์ RSA นั้นถูกแปลงเป็นรูปแบบ PKCS # 1 PEM แบบดั้งเดิมและใบรับรองนั้นใช้ SHA1 ไดเจส

นี่คือตัวอย่างของวิธีการสร้าง CA ของคุณเองใบรับรองเซิร์ฟเวอร์และใบรับรองไคลเอ็นต์

# Generate a CA key and certificate with SHA1 digest
openssl genrsa 2048 > ca-key.pem
openssl req -sha1 -new -x509 -nodes -days 3650 -key ca-key.pem > ca-cert.pem

# Create server key and certficate with SHA1 digest, sign it and convert
# the RSA key from PKCS #8 (OpenSSL 1.0 and newer) to the old PKCS #1 format
openssl req -sha1 -newkey rsa:2048 -days 730 -nodes -keyout server-key.pem > server-req.pem
openssl x509 -sha1 -req -in server-req.pem -days 730  -CA ca-cert.pem -CAkey ca-key.pem -set_serial 01 > server-cert.pem
openssl rsa -in server-key.pem -out server-key.pem

# Create client key and certificate with SHA digest, sign it and convert
# the RSA key from PKCS #8 (OpenSSL 1.0 and newer) to the old PKCS #1 format
openssl req -sha1 -newkey rsa:2048 -days 730 -nodes -keyout client-key.pem > client-req.pem
openssl x509 -sha1 -req -in client-req.pem -days 730 -CA ca-cert.pem -CAkey ca-key.pem -set_serial 01 > client-cert.pem
openssl rsa -in client-key.pem -out client-key.pem

1
โพสต์นี้ได้บันทึกวันสำหรับฉัน! คำอธิบายและการแก้ปัญหาที่ยอดเยี่ยม
Generalopinion

ฉันได้รับ 'ข้อผิดพลาด 2026 (HY000): ข้อผิดพลาดในการเชื่อมต่อ SSL: ASN: ก่อนวันที่ในอนาคต'
Nitsan Baleli

น่าเสียดายที่ฉันยังคงมีERROR 2026 (HY000): SSL connection error: protocol version mismatchข้อผิดพลาด (โดยใช้ OpenSSL 1.0.1f) ฉันเปลี่ยนเป็น OpenSSL 1.0.1e และทำงานกับคำแนะนำด้านบน
Jarrett

2
คำตอบนี้น่าทึ่ง - จะได้รับรางวัลมากมายมหาศาลถ้าทำได้ คำอธิบายที่ดีของปัญหา
elixenide

เสียงอื่นที่จะเพิ่มไปยังฝูงชน พยายามสืบค้นทางอินเทอร์เน็ตเพื่อหาคำตอบว่าทำไมการจัดทำเอกสาร MySQL ไม่ทำงาน - ส่วนล่างของโพสต์นี้บันทึกวันของฉันไว้อย่างสมบูรณ์
Steve Chambers

4

สิ่งนี้ช่วยฉัน:

ส่วนหัวและส่วนท้ายของไฟล์ server-key.pem ดูเหมือนว่า:

-----BEGIN PRIVATE KEY-----
...
...
-----END PRIVATE KEY-----

แต่มันต้องการบางสิ่งเช่นนั้น:

-----BEGIN RSA PRIVATE KEY-----
...
...
-----END RSA PRIVATE KEY-----

จดรหัส BEGIN RSA PRIVATE

เพื่อที่จะดูบันทึก:

sudo vim /var/log/mysql/error.log

หวังว่านี่จะช่วยได้


ฉันมีปัญหาที่คล้ายกันใน Ubunbtu 12.04 ของฉันกับ mysql 5.5.34 ซึ่งไฟล์ pem ทั้งหมดสามารถอ่านได้โดยทุกคนและยังทำให้ฉันมีปัญหาเดียวกัน แต่คำตอบนี้รวมกับการเปลี่ยนเจ้าของทำเคล็ดลับ
Tommy Andersen

อย่าเพิ่ม "RSA" ด้วยตนเอง - สิ่งนี้จะระงับข้อผิดพลาดเท่านั้น แต่ SSL จะไม่ทำงาน (คุณจะได้รับข้อผิดพลาดอื่น " ข้อผิดพลาดในการเชื่อมต่อ SSL: รุ่นของโปรโตคอลไม่ตรงกัน ") แปลงจาก PKCS # 8 เป็นรูปแบบ PKCS # 1 แทนการใช้openssl rsa
rustyx

3

ฉันมีปัญหาเหมือนกันในวันที่ 12.04 แต่ในความเป็นจริงแล้วมันเป็นสิ่งที่ทำให้เกิดปัญหา

ฉันพบวิธีแก้ปัญหาที่ฟอรัม Ubuntuแล้วการย้าย.pemไฟล์ต่าง ๆ/etc/mysqlจะถูกแก้ไข

คุณยังสามารถเปลี่ยนการกำหนดค่า apparmor /etc/apparmor.d/usr.sbin.mysqldได้


นี่เป็นปัญหาที่ฉันมีเช่นกัน
Jonathan

นั่นคือการพิมพ์ผิด? คุณหมายถึง "การย้ายไฟล์ pem ไปที่" แทนที่จะ "ย้ายไฟล์ pem ใน" หรือไม่? ขอโทษสำหรับการให้อวดรู้ แต่ฉันมีบิตสับสน
knocte

1

ตรวจสอบให้แน่ใจว่าผู้ใช้ที่ใช้กระบวนการ mysqld มีสิทธิ์อ่านเพื่อเข้าถึงคีย์และไฟล์ใบรับรอง หากคุณเปิดใช้งาน MySQL โดยใช้บัญชี "mysql" คุณจะ:

/etc/mysql$ chown mysql:mysql *.pem
/etc/mysql$ ls -l *.pem
-rwxrwx--- 1 mysql mysql 1631 2013-09-16 14:27 ca-cert.pem
-rwxrwx--- 1 mysql mysql 1281 2013-09-16 14:27 server-cert.pem
-rwxrwx--- 1 mysql mysql 1679 2013-09-16 14:27 server-key.pem

มิฉะนั้นคุณอาจได้รับสิ่งต่อไปนี้ในบันทึกข้อผิดพลาดของคุณ:

SSL error: Unable to get certificate from '/etc/mysql/server-cert.pem'
130916 13:32:25 [Warning] Failed to setup SSL
130916 13:32:25 [Warning] SSL error: Unable to get certificate

ยิ่งใหญ่ แต่สิ่งนี้สามารถทำได้? ใช้เวลาและอธิบายเพิ่มเติมให้ข้อมูลเพิ่มเติม :)
Lucio

สิ่งนี้รวมกับการเพิ่ม RSA ไปยังไฟล์ server-key.pem
Tommy Andersen

1

บน Ubuntu 16.04 ผมวิ่งmysql_ssl_rsa_setupได้เห็นความสามารถไฟล์ในตัวแปรที่แสดงเป็นในคำถาม แต่have_sslและยังคงเป็นhave_opensslDISABLED

chown mysql.mysql /var/lib/mysql/*.pemวิธีแก้คือ อีกทางหนึ่งฉันคิดว่าถ้าคุณรัน mysql_ssl_rsa_setup ในฐานะผู้ใช้ mysql มันจะสร้างไฟล์ด้วยสิทธิ์ที่ถูกต้อง


คำถามคือสี่ปีและสองเดือน ... มันไม่น่าเป็นไปได้ที่ OP จะตอบคำถามของคุณ
WinEunuuchs2Unix

1
ฉันโพสต์สิ่งนี้เป็นเพียงบริการสำหรับผู้อ่านในอนาคตเพราะนี่คือหนึ่งในผลการค้นหา google อันดับต้น ๆ สำหรับปัญหานี้และไม่มีอะไรที่ฉันอ่านช่วยแก้ไขปัญหาของฉันได้ ค่าของคำตอบนี้อ้างอิงถึงสถานะของโลกใน Ubuntu 12.04 และแม้แต่ 14.04 ก็สูญเสียความเกี่ยวข้อง
Craig Wright

@ WinEunuuchs2Unix อาจไม่ใช่ OP แต่ที่นี่ฉันเกือบสองปีต่อมามองหาคำตอบนี้ ดังนั้นขอบคุณเครก!
Oldskool

0

ไฟล์กุญแจส่วนตัวควรดูเหมือน (รูปแบบ PKCS # 1):

-----BEGIN RSA PRIVATE KEY-----
. . .
-----END RSA PRIVATE KEY-----

หากรหัสส่วนตัวของคุณเริ่มต้นด้วย:

-----BEGIN PRIVATE KEY-----

(รูปแบบ PKCS # 8) จากนั้นคุณควรแปลงดังนี้:

openssl rsa -in server-key.pem -out server-key.pem

อย่าเพิ่มRSAแท็ก"ที่หายไป" " ด้วยตนเองเนื่องจากรูปแบบแตกต่างกัน


-1

ตัวเลือกการเริ่มต้น SSL ควรอยู่ด้านบนสุดของไฟล์ my.cnf ของคุณไม่เช่นนั้นอาจถูกเพิกเฉย ฉันมีปัญหาในการใช้ mysql 5.6 บน RHEL 6.4 ซึ่งเป็นที่ที่ตัวแปร SSL ถูกละเว้นฉันมีพวกเขาที่ท้ายไฟล์ my.cnf ฉันย้ายพวกเขาที่ด้านบนของไฟล์ (ใต้ [mysqld]) จากนั้นฉันรีสตาร์ทเซิร์ฟเวอร์และทุกอย่างเรียบร้อยดี

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.