Włączanie SSL w MySQL


24

Używam Ubuntu Server 12.04 i chcę włączyć połączenia SSL z MySQL.

Wygenerowałem następujące pliki kluczy / certyfikatów za pomocą OpenSSL:

  • ca-cert.pem
  • server-cert.pem
  • server-key.pem

Zapisałem je w /etc/mysql, a następnie dodałem następujące wiersze do /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

Następnie zrestartowałem serwer za pomocą sudo service restart mysql.

Nie wydaje się jednak, aby włączało SSL. W ramach sesji 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  |
+---------------+----------------------------+

Jakieś pomysły, których mi brakuje? Dzięki


2
Sprawdź ten niesamowity wątek . Być może może ci pomóc.
SirCharlo,

Dzięki za link SirCharlo, ale problem poruszony w tym wątku nie dotyczy mojej sytuacji.
visitor93746

1
To, o czym wspomina @ SirCharlo, to miejsce, w którym chcesz szukać. W szczególności część Apparmor i post # 10 . Klucze, które wygenerowałem na Debian Squeeze lub starszym Ubuntu działają dobrze - regeneracja w 12.04 powoduje, że znowu się nie udaje. Zobacz także dzienniki błędów MySQL.
gertvdijk

2
Miałem to samo pytanie i spędziłem nad nim wiele godzin, ale odpowiedź @ user262116 go rozwiązała. Zachęcam do zaakceptowania tej odpowiedzi, jeśli ci pomogła!
elixenide

Odpowiedzi:


33

Ubuntu 12.04 jest wyposażony w OpenSSL 1.0.1, który ma nieco inne ustawienia domyślne niż starsza wersja OpenSSL 0.9.8.

Między innymi, jeśli używasz openssl req -newkey rsa:2048do generowania klucza RSA, otrzymasz klucz w formacie o nazwie PKCS # 8 . Klucze te, reprezentowane w formacie PEM, mają bardziej ogólny -----BEGIN PRIVATE KEY-----nagłówek, który nie mówi, jaki to rodzaj klucza (RSA, DSA, EC).

Poprzednio w OpenSSL 0.9.8 klucze były zawsze w formacie o nazwie PKCS # 1 , który reprezentowany był jako PEM, miał nagłówek -----BEGIN RSA PRIVATE KEY-----.

Z tego powodu nie można po prostu zmienić nagłówka i stopki z:

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

do

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

To nie to samo i nie zadziała. Zamiast tego musisz przekonwertować klucz na stary format za pomocą openssl rsa. Lubię to:

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

MySQL (wersja 5.5.35) w systemie Ubuntu 12.04 korzysta z implementacji protokołu SSL o nazwie yaSSL (wersja 2.2.2). Oczekuje, że klucze będą w formacie PKCS # 1 i nie obsługują formatu PKCS # 8 używanego przez OpenSSL 1.0 i nowsze. Jeśli po prostu zmienisz nagłówek i stopkę, jak sugerują inne posty w tym wątku, MySQL / yaSSL nie będzie narzekać, ale nie będziesz mógł się połączyć i zamiast tego skończy się taki błąd:

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

Ubuntu 14.04 zawiera OpenSSL 1.0.1f i ​​nowe ustawienia. Między innymi wygeneruje certyfikaty z skrótami SHA256 zamiast SHA1, który był używany we wcześniejszych wersjach. Nawiasem mówiąc, wersja yaSSL dołączona do MySQL również tego nie obsługuje.

Jeśli generujesz certyfikaty do użytku z MySQL, pamiętaj, aby upewnić się, że klucze RSA są konwertowane na tradycyjny format PEM PKCS # 1 i że certyfikaty używają skrótów SHA1.

Oto przykład, jak wygenerować własny urząd certyfikacji, certyfikat serwera i certyfikat klienta.

# 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
Ten post uratował mi dzień! Fantastyczne wyjaśnienie i rozwiązanie.
generalopinion

Mam komunikat „ERROR 2026 (HY000): Błąd połączenia SSL: ASN: przed datą w przyszłości”
Nitsan Baleli

Niestety nadal mam ERROR 2026 (HY000): SSL connection error: protocol version mismatchbłędy (przy użyciu OpenSSL 1.0.1f). Przełączyłem się na OpenSSL 1.0.1e i działało to z powyższymi instrukcjami.
Jarrett

2
Ta odpowiedź jest niesamowita - gdybym mógł, przyznałbym ogromną nagrodę. Świetne wyjaśnienie problemu.
elixenide

Kolejny głos do dodania do hordy. Przeszukiwałem Internet, próbując znaleźć rozwiązanie, dlaczego udokumentowana konfiguracja MySQL po prostu nie działa - dolna część tego postu całkowicie uratowała mi dzień.
Steve Chambers

4

Pomogło mi to:

Nagłówek i stopka pliku server-key.pem wyglądały tak:

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

Ale wymaga czegoś takiego:

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

Uwaga BEGIN RSA PRIVATE KEY

Aby zobaczyć dziennik:

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

Mam nadzieję że to pomoże.


Miałem podobny problem w moim Ubunbtu 12.04 z mysql 5.5.34, gdzie wszystkie pliki pem były czytelne dla wszystkich i nadal dały mi ten sam problem. Ale ta odpowiedź w połączeniu ze zmianą właściciela załatwiła sprawę.
Tommy Andersen

Nie dodawaj ręcznie „RSA” - to tylko pomija błąd, ale SSL nie działa (pojawi się kolejny błąd, „ Błąd połączenia SSL: niedopasowanie wersji protokołu ”). Zamiast tego openssl rsa
konwertuj z

3

Miałem te same problemy w dniu 12.04, ale w rzeczywistości przyczyną były problemy.

Znalazłem rozwiązanie na forach Ubuntu , przenosząc .pempliki w celu ich /etc/mysqlrozwiązania.

Możesz także zmienić konfigurację zbroi w /etc/apparmor.d/usr.sbin.mysqld.


To też miałem problem
Jonathan

czy to literówka? masz na myśli „przenoszenie plików pem do” zamiast „przenoszenie plików pem do”? przepraszam, że jestem taki pedantyczny, ale trochę się zdezorientowałem
knocte

1

Upewnij się, że użytkownik uruchamiający proces mysqld ma dostęp do odczytu kluczy i plików certyfikatów. Jeśli uruchomisz MySQL przy użyciu konta „mysql”, będziesz:

/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

W przeciwnym razie w dzienniku błędów mogą pojawić się następujące informacje:

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

Świetny. Ale jak można to zrobić? Poświęć trochę czasu i wyjaśnij dalej, podając więcej informacji :)
Lucio

To w połączeniu z dodaniem RSA do pliku server-key.pem załatwiło sprawę.
Tommy Andersen

1

Na Ubuntu 16.04, wpadłem mysql_ssl_rsa_setup, widział pliki w show zmiennych jak w pytaniu, ale have_ssli have_opensslnadal DISABLED.

Rozwiązaniem było chown mysql.mysql /var/lib/mysql/*.pem. Alternatywnie, zakładam, że jeśli uruchomisz mysql_ssl_rsa_setup jako użytkownik mysql, utworzy on pliki z odpowiednimi uprawnieniami.


Pytanie ma cztery lata i dwa miesiące ... Jest mało prawdopodobne, że OP odpowie na twoją odpowiedź.
WinEunuuchs2Unix

1
Opublikowałem to po prostu jako usługę dla przyszłych czytelników, ponieważ jest to jeden z najlepszych wyników wyszukiwania Google dla tego problemu i nic, co przeczytałem, nie pomogło rozwiązać mojego problemu. Wartość tej odpowiedzi dotyczącej stanu świata w Ubuntu 12.04, a nawet 14.04 traci na znaczeniu.
Craig Wright

@ WinEunuuchs2Unix Może nie OP, ale oto jestem, prawie dwa lata później szukam dokładnie tej odpowiedzi. Dziękuję Craig!
Oldskool

0

Plik klucza prywatnego powinien wyglądać (format PKCS # 1):

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

Jeśli zamiast tego Twój klucz prywatny zaczyna się od:

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

(Format PKCS # 8), powinieneś przekonwertować go w następujący sposób:

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

Nie dodawaj ręcznie RSAtagu „brakujące” ” , ponieważ format jest inny.


-1

Opcje uruchamiania SSL powinny znajdować się w górnej części pliku my.cnf, w przeciwnym razie mogą zostać zignorowane. Miałem problemy z uruchomieniem mysql 5.6 na RHEL 6.4, gdzie zmienne SSL były ignorowane, miałem je na końcu pliku my.cnf. Przeniosłem je na początek pliku (tuż poniżej [mysqld]), a następnie ponownie uruchomiłem serwer i wszystko było w porządku.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.