Включение SSL в MySQL


24

Я использую Ubuntu Server 12.04 и хочу включить SSL-соединения с MySQL.

Я сгенерировал следующие файлы ключей / сертификатов с OpenSSL:

  • ча-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, но проблема, затронутая в этой теме, похоже, не относится к моей ситуации.
visitor93746

1
@SirCharlo упоминает, где вы хотите посмотреть. В частности, часть Apparmor и пост № 10 . Ключи, сгенерированные мной в Debian Squeeze или более ранней версии Ubuntu, работают нормально - при регенерации в 12.04 произойдет сбой снова. Смотрите также журналы ошибок MySQL.
gertvdijk

2
У меня был тот же вопрос и я провел на нем часами, но ответ @ user262116 решил его. Я бы посоветовал вам принять этот ответ, если он вам помог!
эликсид

Ответы:


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 , который представлен как PEM, имел заголовок -----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 преобразованы в традиционный формат PEM PKCS # 1 и что сертификаты используют дайджесты 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
Этот пост спас мне день! Фантастическое объяснение и решение.
Генералопинион

Я получил сообщение «ОШИБКА 2026 (HY000): ошибка соединения SSL: ASN: до даты в будущем»
Ницан Балели,

К сожалению, я все еще получил ERROR 2026 (HY000): SSL connection error: protocol version mismatchошибки (используя OpenSSL 1.0.1f). Я перешел на OpenSSL 1.0.1e, и он работал с вышеуказанными инструкциями.
Джаррет

2
Этот ответ удивителен - я бы присудил огромную награду. Отличное объяснение проблемы.
эликсид

Еще один голос, чтобы добавить в орду. Бродили по Интернету, пытаясь найти решение, почему задокументированная установка MySQL просто не сработала - нижняя часть этого поста полностью спасла мой день.
Стив Чемберс

4

Это помогло мне:

Верхний и нижний колонтитулы файла server-key.pem выглядят так:

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

Но для этого нужно нечто подобное:

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

Обратите внимание, НАЧАЛО RSA ЧАСТНЫЙ КЛЮЧ

Для просмотра журнала:

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

Надеюсь это поможет.


У меня была похожая проблема в моем Ubunbtu 12.04 с mysql 5.5.34, где все pem-файлы были доступны для чтения всем и все еще вызывали у меня ту же проблему. Но этот ответ в сочетании со сменой владельца сделал свое дело.
Томми Андерсен

Не добавляйте вручную «RSA» - это только подавит ошибку, но SSL не будет работать (вы получите другую ошибку, « Ошибка соединения SSL: несоответствие версии протокола »). Преобразуйте из PKCS # 8 в формат PKCS # 1 вместо этогоopenssl rsa
rustyx

3

У меня были те же проблемы 12 апреля, но на самом деле это был apparmor, который вызвал проблемы.

Я нашел решение на форумах Ubuntu , переместив .pemфайлы в /etc/mysqlего решение.

Вы также можете изменить конфигурацию устройства в /etc/apparmor.d/usr.sbin.mysqld.


Это была проблема, с которой я столкнулся
Джонатан

это опечатка? Вы имеете в виду «перемещение файлов 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 помогло.
Томми Андерсен

1

На Ubuntu 16.04 я запускал mysql_ssl_rsa_setup, мог видеть файлы в переменных показа, как в вопросе, но так have_sslи have_opensslосталось DISABLED.

Решение было chown mysql.mysql /var/lib/mysql/*.pem. В качестве альтернативы, я предполагаю, что если вы запустите mysql_ssl_rsa_setup от имени пользователя mysql, он создаст файлы с правильными разрешениями.


Вопросу четыре года и два месяца ... Маловероятно, что ОП ответит на ваш ответ.
WinEunuuchs2Unix

1
Я разместил это просто как сервис для будущих читателей, потому что это один из лучших результатов поиска Google для этой проблемы, и ничего, что я прочитал, не помогло решить мою проблему. Ценность этого ответа, относящегося к состоянию мира в Ubuntu 12.04 и даже 14.04, теряет актуальность.
Крейг Райт

@ WinEunuuchs2Unix Возможно, не ОП, но вот я, почти два года спустя, ищу именно этот ответ. Итак, спасибо, Крейг!
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]), затем перезапустил сервер, и все было в порядке.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.