2017-02-09 17 views
1

Использование this guide Я пытаюсь настроить MariaDB (MySQL) для использования SSL между DbServer и AppClient.MariaDB через SSL не работает, «сертификат верифицировать не удалось»

Я создал серверные и клиентские сертификаты на сервере в соответствии с руководством. Затем я скопировал три необходимые клиентские файлы AppClient и установить право собственности и права:

[[email protected] mysql]# ll /etc/pki/tls/certs/ 
drwxr-xr-x. 2 mysql mysql 88 Feb 9 13:31 mysql 

[[email protected] mysql]# ll /etc/pki/tls/certs/mysql/ 
-rw-------. 1 mysql mysql 1372 Feb 9 13:31 ca-cert.pem 
-rw-------. 1 mysql mysql 1230 Feb 9 14:16 client-cert.pem 
-rw-------. 1 mysql mysql 1705 Feb 9 14:16 client-key.pem 

Вот полный my.cnf на AppClient:

[mysqld] 
datadir=/var/lib/mysql 
socket=/var/lib/mysql/mysql.sock 
symbolic-links=0 

[client] 
ssl-ca=/etc/pki/tls/certs/mysql/ca-cert.pem 
ssl-cert=/etc/pki/tls/certs/mysql/client-cert.pem 
ssl-key=/etc/pki/tls/certs/mysql/client-key.pem 

[mysqld_safe] 
log-error=/var/log/mariadb/mariadb.log 
pid-file=/var/run/mariadb/mariadb.pid 

!includedir /etc/my.cnf.d 

Далее я проверил, что порт 3306 открыт на DbServer:

[[email protected] mysql]# telnet dbserver 3306 
Connected to dbserver. 
Escape character is '^]'. 
R 
5.5.52-MariaDB 

Далее я проверил MariaDB (MySQL) Ssl переменные на DbServer:

MariaDB [(none)]> show variables like '%ssl%'; 
+---------------+------------------------------------------+ 
| Variable_name | Value         | 
+---------------+------------------------------------------+ 
| have_openssl | YES          | 
| have_ssl  | YES          | 
| ssl_ca  | /etc/pki/tls/certs/mysql/ca-cert.pem  | 
| ssl_capath |           | 
| ssl_cert  | /etc/pki/tls/certs/mysql/server-cert.pem | 
| ssl_cipher |           | 
| ssl_key  | /etc/pki/tls/certs/mysql/server-key.pem | 
+---------------+------------------------------------------+ 

Далее я проверил MariaDB (MySQL) переменные Ssl на AppClient:

MariaDB [(none)]> show variables LIKE '%ssl%'; 
+---------------+----------+ 
| Variable_name | Value | 
+---------------+----------+ 
| have_openssl | DISABLED | 
| have_ssl  | DISABLED | 
| ssl_ca  |   | 
| ssl_capath |   | 
| ssl_cert  |   | 
| ssl_cipher |   | 
| ssl_key  |   | 
+---------------+----------+ 
7 rows in set (0.00 sec) 

Это выглядит как старт/источник проблемы.

Если я пытаюсь подключиться к DbServer от AppClient все равно:

[[email protected] mysql]# mysql -h dbserver -u ssluser -p 
Enter password: 
ERROR 2026 (HY000): SSL connection error: error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed 

Нет Буэно.

Проверка AppClient «s с OpenSSL сертификатов ...

[[email protected] mysql]# cd /etc/pki/tls/certs/mysql/ 
[[email protected] mysql]# openssl verify -CAfile ca-cert.pem server-cert.pem client-cert.pem 
Error opening certificate file server-cert.pem 
139864320337824:error:02001002:system library:fopen:No such file or directory:bss_file.c:398:fopen('server-cert.pem','r') 
139864320337824:error:20074002:BIO routines:FILE_CTRL:system lib:bss_file.c:400: 
unable to load certificate 
client-cert.pem: OK 

Для пинков, я запускал тот же самый тест OpenSSL на DbServer:

[[email protected] mysql]# openssl verify -CAfile ca-cert.pem server-cert.pem client-cert.pem 
server-cert.pem: C = XX, ST = XX, L = CityName, O = MyOrganization, OU = MyGroup, CN = dbserver 
error 18 at 0 depth lookup:self signed certificate 
OK 
client-cert.pem: OK 

В учебнике упоминается только копирование ca-cert.pem , client-cert.pem и client-key.pem клиенту, но провал выше указывает на отсутствующий server-cert.pem на клиенте.

Нужно ли мне создавать сервер - * .pem-файлы на клиенте? Если да, то где они идут в файле /etc/my.cnf?

+0

Это самозаверяющий сертификат? Поскольку openssl сообщает вам, что проверка сертификата не удалась, это указывает, что полномочия, которые вы использовали для подписания сертификата, должны быть добавлены в ОС, на котором вы выполняете это. Я не знаю, есть ли флаг, который запрещает проверку сертификата, может быть, может помочь какой-то поиск в этом направлении? –

+0

Он подписан сам. Все сертификаты были созданы на dbserver в документации. Обратите внимание, что openssl не прошел тест из-за отсутствия 'server-cert.pem', который не описан или не описан в учебнике. Это та часть, за которую я застрял. –

+0

Сделал небольшой прогресс от 'cat server-cert.pem client-cert.pem> ca.pem', а затем обновил my.cnf appclient, чтобы использовать' ssl-ca = ca.pem'. Вместо ошибки SSL я получаю ошибку проверки подлинности. –

ответ

1

Недостающий ингредиент из нескольких руководств по настройке SSL для MySQL/MariaDB гарантирует, что файл сертификата ssl-ca содержит как сервер, так и клиентский ca.

Вот шаг за шагом руководство, которое работает для меня:


Этот ответ предполагает два сервера:

  1. DbServer (где наша жизнь базы данных)
  2. AppClient (где живут наши приложения)

FWIW, оба сервера являются принудительными для SELinux.

Во-первых, необходимо войти на DbServer

Создайте временный каталог для создания сертификатов.

mkdir /root/certs/mysql/ && cd /root/certs/mysql/ 

Создания сервера сертификаты

сертификаты Перемещения сервера
openssl genrsa 2048 > ca-key.pem 
openssl req -sha1 -new -x509 -nodes -days 3650 -key ca-key.pem > ca-cert.pem 
openssl req -sha1 -newkey rsa:2048 -days 730 -nodes -keyout server-key.pem > server-req.pem 
openssl rsa -in server-key.pem -out server-key.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 

к /etc/pki/tls/certs/mysql/ пути каталогов предполагают CentOS или RHEL (корректировать по мере необходимости для других дистрибутивов):

mkdir /etc/pki/tls/certs/mysql/ 
cp /root/certs/mysql/* /etc/pki/tls/certs/mysql/ 

Обязательно установить разрешение в папке и файлах. mysql требует полного владения и доступа.

chown -R mysql:mysql /etc/pki/tls/certs/mysql 

Теперь необходимо настроить MySQL/MariaDB

# vi /etc/my.cnf 
# i 
[mysqld] 
bind-address=* 
ssl-ca=/etc/pki/tls/certs/ca-cert.pem 
ssl-cert=/etc/pki/tls/certs/server-cert.pem 
ssl-key=/etc/pki/tls/certs/server-key.pem 
# :wq 

Тогда

systemctl restart mariadb 

Не забудьте открыть брандмауэр, чтобы разрешить соединения от AppClient (с использованием IP 1.2.3.4)

firewall-cmd --zone=drop --permanent --add-rich-rule 'rule family="ipv4" source address="1.2.3.4" service name="mysql" accept' 
# I force everything to the drop zone. Season the above command to taste. 

Теперь перезапустите firewalld

service firewalld restart 

Далее, войдите в сервер MySQL DbServer в:

mysql -uroot -p 

Issue следующее создать пользователя для клиента. обратите внимание на REQUIRE SSL в заявлении GRANT.

GRANT ALL PRIVILEGES ON *.* TO ‘iamsecure’@’appclient’ IDENTIFIED BY ‘dingdingding’ REQUIRE SSL; 
FLUSH PRIVILEGES; 
# quit mysql 

Вы все равно должны находиться в/root/certs/mysql с первого шага. Если нет, cd вернется к нему для одной из приведенных ниже команд.

Создание клиентских сертификатов

openssl req -sha1 -newkey rsa:2048 -days 730 -nodes -keyout client-key.pem > client-req.pem 
openssl rsa -in client-key.pem -out client-key.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 

Примечание: Я использовал тот же общее имя для обоих серверов и клиентских сертификатов. YMMV.

Убедитесь, что вы по-прежнему/корень/сертификаты/MySQL/для этого следующую команду

Объединить сервер и сертификат ЦС клиента в один файл:

cat server-cert.pem client-cert.pem > ca.pem 

Убедитесь, что вы видите два сертификаты:

cat ca.pem 

END OF SERVER SIDE WORK FOR NOW.

Открыть другой терминал и

ssh appclient 

Как и прежде, создать постоянный дом для клиентских сертификатов

mkdir /etc/pki/tls/certs/mysql/ 

Теперь поместите клиентские сертификаты (созданные на DbServer) на AppClient. Вы можете либо скопировать их, либо просто скопировать и вставить файлы по одному.

scp dbserver 
# copy files from dbserver to appclient 
# exit scp 

Опять же, не забудьте установить разрешения на папку и файлы. mysql требует полного владения и доступа.

chown -R mysql:mysql /etc/pki/tls/certs/mysql 

Вы должны иметь три файла, каждый из которых принадлежит пользователю MySQL:

/etc/pki/tls/certs/mysql/ca.pem 
/etc/pki/tls/certs/mysql/client-cert.pem 
/etc/pki/tls/certs/mysql/client-key.pem 

Теперь редактировать MariaDB/MySQL конфигурации AppClient в разделе [client]. MariaDB служба

vi /etc/my.cnf 
# i 
[client] 
ssl-ca=/etc/pki/tls/certs/mysql/ca.pem 
ssl-cert=/etc/pki/tls/certs/mysql/client-cert.pem 
ssl-key=/etc/pki/tls/certs/mysql/client-key.pem 
# :wq 

RESTART AppClient в:

systemctl restart mariadb 

еще на клиенте здесь

Это должно вернуть: SSL ИСТИНА

mysql --ssl --help 

Теперь войдите в тузд например AppClient в

mysql -uroot -p 

Если ДА см обеим переменным ниже

show variables LIKE '%ssl'; 
    have_openssl YES 
    have_ssl    YES 

Сначала я увидел

have_openssl NO 

Быстрый взгляд в mariadb.log показал:

SSL error: Unable to get certificate from '/etc/pki/tls/certs/mysql/client-cert.pem'

Проблема, что корень принадлежит client-cert.pem и содержащую папку. Решением было установить право собственности на/etc/pki/tls/certs/mysql/на mysql.

chown -R mysql:mysql /etc/pki/tls/certs/mysql 

Restart MariaDB при необходимости на стадии непосредственно над

теперь мы готовы проверить Защищенное соединение

Мы все еще на AppClient здесь

Попытка подключиться к DbServer-х MySQL используя учетную запись, созданную выше.

mysql -h dbserver -u iamsecure -p 
# enter password dingdingding (hopefully you changed that to something else) 

С небольшой удачей вам необходимо войти в систему без ошибок.

Чтобы подтвердить, что вы связаны с поддержкой SSL, выполните следующую команду из командной строки MariaDB/MySQL:

\s 

Это обратная косая s, иначе статус

Это покажет статус ваше соединение, которое должно выглядеть примерно так:

Connection id:  4 
Current database: 
Current user:  [email protected] 
SSL:   Cipher in use is DHE-RSA-AES256-GCM-SHA384 
Current pager:  stdout 
Using outfile:  '' 
Using delimiter: ; 
Server:   MariaDB 
Server version:  5.X.X-MariaDB MariaDB Server 
Protocol version: 10 
Connection:  dbserver via TCP/IP 
Server characterset: latin1 
Db  characterset: latin1 
Client characterset: utf8 
Conn. characterset: utf8 
TCP port:  3306 
Uptime:   42 min 13 sec 

Если у вас есть разрешение отклонить ошибки на вас r, проверьте приведенный выше оператор GRANT, чтобы убедиться, что нет никаких бродячих символов или «следов».

Если у вас есть ошибки SSL, вернитесь к этому руководству, чтобы убедиться, что шаги упорядочены.

Это работало на RHEL7 и, вероятно, будет работать и на CentOS7. Не удается подтвердить, будут ли эти точные шаги работать в другом месте.

Надеюсь, это сэкономит кому-то еще немного времени и обострения.

1

Согласно mentioned guide, вы должны убедиться, что «Общее имя» отличается для всех трех сертификатов.

У меня была такая же ошибка, потому что я использовал тот же CN для всех трех сертификатов. После повторной генерации сертификатов с различными CNs ошибка исчезла.

+0

MariaDB на CentOS 7: может подтвердить это. После использования имени узла FQ как CN это не удалось, но при использовании четко выраженных предложений Vivek это сработало очень хорошо, как только сеанс начал корректно сообщать, используя SSL-шифр (запрос статуса). –

 Смежные вопросы

  • Нет связанных вопросов^_^