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

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

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

  • ca-cert.pem
  • server-cert.pem
  • ключ сервера .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  |
+---------------+----------------------------+

Есть идеи, что я пропускаю? Благодаря

25
задан 28 September 2012 в 18:38

7 ответов

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 преобразованы в традиционный формат PKCS # 1 PEM и что сертификаты с использованием дайджестов 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
34
ответ дан 28 September 2012 в 18:38

Убедитесь, что пользователь, запущенный 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
1
ответ дан 28 September 2012 в 18:38

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

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

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

3
ответ дан 28 September 2012 в 18:38

В Ubuntu 16.04 я запустил mysql_ssl_rsa_setup мог видеть файлы в переменных показа, как в вопросе, но have_ssl и have_openssl по-прежнему ОТКЛЮЧЕНО .

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

1
ответ дан 28 September 2012 в 18:38

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

Заголовок и нижний колонтитул файл-сервера-ключ. pem выглядел так:

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

Но для этого нужно что-то вроде этого:

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

Обратите внимание на BEGIN RSA PRIVATE KEY

Чтобы увидеть лог:

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

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

4
ответ дан 28 September 2012 в 18:38

Файл закрытого ключа должен выглядеть (формат 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 », потому что формат отличается.

0
ответ дан 28 September 2012 в 18:38

Параметры запуска SSL должны быть в верхней части файла my.cnf, иначе они могут быть проигнорированы. У меня были проблемы с запуском mysql 5.6 на RHEL 6.4, где переменные SSL игнорировались, у меня они были в конце файла my.cnf. Я переместил их в начало файла (чуть ниже [mysqld]), затем перезапустил сервер, и все было в порядке.

-1
ответ дан 28 September 2012 в 18:38

Другие вопросы по тегам:

Похожие вопросы: