Tidak dapat terhubung ke mysql menggunakan sertifikat SSL yang ditandatangani sendiri

15

Setelah membuat sertifikat SSL yang ditandatangani sendiri, saya telah mengonfigurasi server MySQL jarak jauh saya untuk menggunakannya (dan SSL diaktifkan)

Saya ssh ke server jauh saya, dan coba sambungkan ke mysqld-nya sendiri menggunakan SSL (server MySQL adalah 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, saya ingat pernah membaca ada masalah dengan menghubungkan ke server yang sama melalui SSL. Jadi saya mengunduh kunci klien ke kotak lokal saya, dan menguji dari sana ...

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

Tidak jelas apa yang dimaksud dengan galat "Sambungan SSL" ini, tetapi jika saya hilangkan -ssl-ca, maka saya dapat terhubung menggunakan 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)

Namun, saya percaya bahwa ini hanya mengenkripsi koneksi, dan tidak benar-benar memverifikasi validitas sertifikat (artinya saya akan berpotensi rentan terhadap serangan manusia-ke-tengah)

Sertifikat SSL valid (meskipun ditandatangani sendiri), dan tidak memiliki frasa sandi. Jadi pertanyaan saya adalah, apa yang saya lakukan salah? Bagaimana saya bisa terhubung melalui SSL, menggunakan sertifikat yang ditandatangani sendiri?

Versi MySQL Server adalah 5.5.25 dan server dan klien adalah CentOS 5.

Terima kasih atas sarannya

Sunting : Perhatikan bahwa dalam semua kasus, perintah dikeluarkan dari direktori yang sama di mana tombol ssl berada (karenanya tidak ada jalur absolut)

Sunting (sebagai tanggapan terhadap mgorven): ca.certadalah sertifikat Otoritas Sertifikat, yang seharusnya memberi tahu mysql bahwa otoritas sertifikat saya dipercaya.

Konfigurasi dari my.cnfadalah

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

Saya juga mencoba menambahkan ssl-cipher=DHE-RSA-AES256-SHAtetapi sejak itu dihapus karena tidak membantu.

carpii
sumber
2
Apa ca.cert? Apakah itu sertifikat yang ditandatangani sendiri oleh server? Apakah Anda menggunakan sertifikat klien untuk otentikasi? Harap berikan konfigurasi terkait SSL di server.
mgorven
Terima kasih, saya telah memperbarui pertanyaan saya dengan respons dan konfigurasi ssl dari server. Sertifikat yang diteruskan pada commandline saat mencoba menghubungkan memang sertifikat klien.
carpii
Infact itu pertanyaan yang bagus. Di belakang saya tidak yakin masuk akal bagi klien untuk menentukan server ssl-ca. Tapi kemudian tanpa Im di bawah imrepssion, koneksi terenkripsi tidak diautentikasi dengan benar
carpii

Jawaban:

12

Ya, Anda benar bahwa jika Anda tidak menentukan --ssl-camaka klien tidak memeriksa sertifikat server sama sekali. Karena berfungsi tanpa opsi itu, alasan yang paling mungkin untuk kegagalan adalah klien tidak mempercayai sertifikat server.

Jika Anda menggunakan sertifikat klien dan server yang ditandatangani sendiri maka ca.certfile tersebut harus menyertakan kedua file ini. Dengan begitu klien akan mempercayai sertifikat server dan server akan mempercayai sertifikat klien.

Misalnya:
Buat kunci server dan sertifikat:

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

Buat kunci dan sertifikat klien:

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

Gabungkan sertifikat klien dan server ke dalam file sertifikat CA:

$ cat server-cert.pem client-cert.pem > ca.pem
Keith Burdis
sumber
Terima kasih banyak! Langkah yang hilang adalah bahwa saya tidak menggabungkan sertifikat server dan klien menjadi ca.pem. Saya bukannya melewati ca.cert yang dihasilkan pada awalnya (dan kemudian diteruskan sebagai --CA-key ketika menghasilkan sertifikat klien dan server)
carpii
Aneh, tetapi selalu berhasil bagi saya hanya dengan satu CA CAF - sama pada klien dan server.
Dmitry Leskov
Ya, selama tidak ada persyaratan khusus untuk DN - misalnya CN menjadi nilai tertentu - maka Anda dapat menggunakan kunci yang sama dan sertifikat yang ditandatangani sendiri pada klien dan server.
Keith Burdis
3

Untuk menggunakan ssl satu arah, Anda harus mencoba dengan:

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

The --ssl-certdan --ssl-keypada klien mysql digunakan untuk SSL 2 cara. Ini berarti otentikasi berbasis sertifikat. Subjek sertifikat klien haruslah nama pengguna.

Mircea Vutcovici
sumber
2
Juga ingatlah bahwa ketika membuat koneksi soket dan menggunakan --ssl-verify-server-certCN dari sertifikat server harus sama dengan host yang Anda tentukan untuk opsi baris perintah -h.
Keith Burdis
0

Kebetulan, bukankah Anda sudah memasukkan Nama Umum yang sama untuk sertifikat server dan klien? Jika ya, ganti salah satunya sehingga Nama Umum berbeda.

Dmitry Leskov
sumber
Bagi saya, solusi Dmitry Leskov berhasil. Per dokumentasi SSL MySQL: ( dev.mysql.com/doc/refman/5.0/en/creating-ssl-certs.html )> Metode apa pun yang Anda gunakan untuk menghasilkan sertifikat dan file kunci, nilai Nama Umum digunakan untuk server dan sertifikat / kunci klien masing-masing harus berbeda dari nilai Nama Umum yang digunakan untuk sertifikat CA. Jika tidak, sertifikat dan file kunci tidak akan berfungsi untuk server yang dikompilasi menggunakan OpenSSL. Kesalahan khas dalam kasus ini adalah: ERROR 2026 (HY000): Kesalahan koneksi SSL: kesalahan: 00000001: lib (0): func (0): alasan (1)
gmas