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

gość93746
źródło
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
użytkownik262116
źródło
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.

użytkownik194410
źródło
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.

użytkownik273610
źródło
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
Isabi
źródło
Ś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.

Craig Wright
źródło
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.

rustyx
źródło
-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.

Christine
źródło