Я использую Ubuntu Server 12.04 и хочу включить SSL-соединения с MySQL.
Я сгенерировал следующие файлы ключей / сертификатов с OpenSSL:
Я сохранил их в /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 |
+---------------+----------------------------+
Есть идеи, что я пропускаю? Благодаря
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
Убедитесь, что пользователь, запущенный 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
У меня были те же проблемы 12.04, но на самом деле проблемы были вызваны apparmor.
Я нашел решение на форумах Ubuntu , перемещение Файлы .pem
в / etc / mysql
разрешили это.
Вы также можете изменить конфигурацию apparmor в /etc/apparmor.d/usr.sbin.mysqld
.
В Ubuntu 16.04 я запустил mysql_ssl_rsa_setup
мог видеть файлы в переменных показа, как в вопросе, но have_ssl
и have_openssl
по-прежнему ОТКЛЮЧЕНО
.
Решением было выбрать mysql.mysql /var/lib/mysql/*.pem
. В качестве альтернативы я предполагаю, что если вы запустите mysql_ssl_rsa_setup как пользователь mysql, он создаст файлы с правильными разрешениями.
Это помогло мне:
Заголовок и нижний колонтитул файл-сервера-ключ. 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
Надеюсь, это поможет.
Файл закрытого ключа должен выглядеть (формат 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
», потому что формат отличается.
Параметры запуска SSL должны быть в верхней части файла my.cnf, иначе они могут быть проигнорированы. У меня были проблемы с запуском mysql 5.6 на RHEL 6.4, где переменные SSL игнорировались, у меня они были в конце файла my.cnf. Я переместил их в начало файла (чуть ниже [mysqld]), затем перезапустил сервер, и все было в порядке.