Kendinden imzalı SSL sertifikası kullanarak MySQL'e bağlanamıyorum


15

Kendinden imzalı bir SSL sertifikası oluşturduktan sonra, uzak MySQL sunucumu bunları kullanacak şekilde yapılandırdım (ve SSL etkin)

Uzak sunucuma ssh ve SSL (MySQL sunucusu 5.5.25) kullanarak kendi mysqld bağlanmayı deneyin.

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)

Okuduğumu hatırlıyorum, SSL üzerinden aynı sunucuya bağlanırken bazı sorunlar var. Bu yüzden istemci anahtarlarını yerel kutuma indiriyorum ve oradan test ediyorum ...

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

Bu "SSL bağlantı hatası" hatasının ne anlama geldiği belli değil, ancak atlarsam -ssl-caSSL kullanarak bağlanabiliyorum.

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)

Ancak, bunun sadece bağlantıyı şifrelediğine ve aslında sertifikanın geçerliliğini doğrulamadığına inanıyorum (yani ortadaki adam saldırısına karşı potansiyel olarak savunmasız olacağım anlamına geliyor)

SSL sertifikaları geçerlidir (kendinden imzalı olsa da) ve üzerinde bir parola yoktur. Benim sorum şu, neyi yanlış yapıyorum? Kendinden imzalı bir sertifika kullanarak SSL üzerinden nasıl bağlanabilirim?

MySQL Server sürümü 5.5.25 ve sunucu ve istemciler CentOS 5.

Herhangi bir tavsiye için teşekkürler

Düzenleme : Her durumda, komutun ssl anahtarlarının bulunduğu aynı dizinden verildiğini unutmayın (bu nedenle mutlak yol yoktur)

Düzenle (mgorven'a yanıt olarak): mysql'ye ca.certsertifika yetkilime güvenildiğini bildirmesi gereken Sertifika Yetkilisi sertifikasıdır.

Config my.cnfDİR

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

Ayrıca eklemeyi denedim ssl-cipher=DHE-RSA-AES256-SHAama o zamandan beri yardımcı olmadı.


2
Nedir ca.cert? Sunucunun kendinden imzalı sertifikası mı? Kimlik doğrulama için istemci sertifikaları kullanıyor musunuz? Lütfen sunucuda SSL ile ilgili yapılandırmayı sağlayın.
mgorven

Teşekkürler, sorumu sunucudan yanıt ve ssl config ile güncelledim. Bağlanmaya çalışırken komut satırında iletilen sertifikalar gerçekten istemci sertifikalarıdır.
carpii

Infact iyi bir soru. Gez ben istemci ssl-ca sunucuları belirtmek için mantıklı olduğundan emin değilim. Ama sonra ben imrepsion altında Im olmadan şifreli bağlantı sıkı bir şekilde doğrulanmadı
carpii

Yanıtlar:


12

Evet, belirtmezseniz --ssl-ca, istemcinin sunucu sertifikasını hiç kontrol etmediğinden emin olursunuz . Bu seçenek olmadan çalıştığından, hatanın en olası nedeni istemcinin sunucu sertifikasına güvenmemesidir.

Kendinden imzalı istemci ve sunucu sertifikaları kullanıyorsanız, ca.certdosya bu iki dosyayı da içermelidir. Bu şekilde istemci sunucu sertifikasına ve sunucu istemci sertifikasına güvenir.

Örneğin:
Sunucu anahtarını ve sertifikasını oluşturun:

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

İstemci anahtarını ve sertifikasını oluşturun:

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

İstemci ve sunucu sertifikalarını CA sertifikaları dosyasında birleştirin:

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

Çok teşekkür ederim! Eksik adım ben sunucu ve istemci certs bir ca.pem içine bitirme değil olmasıdır. Bunun yerine başlangıçta oluşturulan ca.cert'i geçiyordum (ve daha sonra istemci ve sunucu sertifikaları oluştururken --CA anahtarı olarak geçiyordu)
carpii

Garip, ama her zaman benim için sadece bir CA sertifikası ile çalıştı - aynı istemci ve sunucuda.
Dmitry Leskov

Evet, DN için özel bir gereklilik olmadığı sürece (örneğin CN belirli bir değerdir), istemcide ve sunucuda aynı anahtar ve kendinden imzalı sertifikayı kullanabilirsiniz.
Keith Burdis

3

Tek yönlü SSL kullanmak için aşağıdakileri denemelisiniz:

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

--ssl-certVe --ssl-keyMySQL istemci üzerinde 2 yönlü SSL için kullanılmaktadır. Bu sertifika tabanlı kimlik doğrulama anlamına gelir. İstemci sertifikasının konusu kullanıcı adı olmalıdır.


2
Ayrıca, bir soket bağlantısı kurarken --ssl-verify-server-certve sunucu sertifikasının CN'sini kullanırken -h komut satırı seçeneği için belirttiğiniz ana bilgisayarla aynı olması gerektiğini unutmayın.
Keith Burdis

0

Şans eseri, sunucu ve istemci sertifikaları için aynı Ortak Adı girmediniz mi? Evetse, Ortak Adlar farklı olacak şekilde birini değiştirin.


Benim için Dmitry Leskov'un çözümü işe yaradı. MySQL'in SSL dokümanlarına göre: ( dev.mysql.com/doc/refman/5.0/en/creating-ssl-certs.html )> Sertifika ve anahtar dosyalarını oluşturmak için hangi yöntemi kullanırsanız kullanın, sunucu için kullanılan Ortak Ad değeri ve istemci sertifikalarının / anahtarlarının her biri CA sertifikası için kullanılan Ortak Ad değerinden farklı olmalıdır. Aksi takdirde, sertifika ve anahtar dosyaları OpenSSL kullanılarak derlenen sunucular için çalışmaz. Bu durumda tipik bir hata: ERROR 2026 (HY000): SSL bağlantı hatası: hata: 00000001: lib (0): func (0): nedeni (1)
gmas
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.