MariaDB over SSL이 작동하지 않습니다. "인증서 확인 실패"
이 가이드를 사용하여 dbserver와 appclient 간에 SSL을 사용하기 위한 MariaDB(mysql)를 설정하려고 합니다.
가이드에 따라 서버 증명서와 클라이언트 증명서를 서버에 작성했습니다.그런 다음 필요한 3개의 클라이언트 파일을 appclient에 복사하고 소유권과 권한을 설정했습니다.
[root@appclient mysql]# ll /etc/pki/tls/certs/
drwxr-xr-x. 2 mysql mysql 88 Feb 9 13:31 mysql
[root@appclient 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
다음은 appclient의 my.cnf 전문입니다.
[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에서 열려 있는지 테스트했습니다.
[root@appclient mysql]# telnet dbserver 3306
Connected to dbserver.
Escape character is '^]'.
R
5.5.52-MariaDB
다음으로 dbserver의 MariaDB(mysql) ssl 변수를 체크했습니다.
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 |
+---------------+------------------------------------------+
다음으로 appclient에서 MariaDB(mysql) ssl 변수를 확인했습니다.
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)
그것이 문제의 발단이거나 원인인 것 같습니다.
appclient에서 dbserver에 연결하려고 하면 다음과 같이 됩니다.
[root@appclient 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
부에노는 없습니다.
openssl로 appclient의 인증서를 확인하는 중...
[root@appclient mysql]# cd /etc/pki/tls/certs/mysql/
[root@appclient 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
재미삼아 dbserver에서도 같은 openssl 테스트를 실행했습니다.
[root@dbserver 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
클라이언트에 있습니다.
server-*.pem은 server-*.pem?경우, 은 「 」 「 」 「 」 에서는 에 배치됩니까?/etc/my.cnf
파일? 파일?
중 몇가 누락되어 MySQL/MariaDB SSL이 확실하게 되어 있는지 합니다.ssl-ca
인증서 파일에는 서버와 클라이언트 CA가 모두 포함되어 있습니다.
여기 도움이 된 단계별 가이드가 있습니다.
이 답변에서는 다음 2개의 서버를 상정하고 있습니다.
- dbserver(데이터베이스 위치)
- 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/
렉토리패 cent센트OS 또는 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
방화벽을 열어 앱클라이언트(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.
이제 방화벽을 다시 시작합니다.
service firewalld restart
다음으로 dbserver의 mysql 서버에 로그인합니다.
mysql -uroot -p
클라이언트의 사용자를 작성하려면 다음 명령을 발행합니다.GRANT 스테이트먼트에 SSL이 필요합니다.
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
이 다음 명령어는 아직 /root/certs/mysql/이어야 합니다.
서버와 클라이언트 CA 증명서를 1개의 파일로 결합합니다.
cat server-cert.pem client-cert.pem > ca.pem
다음의 2개의 증명서가 있는 것을 확인합니다.
cat ca.pem
현시점에서는 서버측의 작업이 종료됩니다.
다른 터미널을 열고
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에 의해 각각 소유되는 3개의 파일이 있어야 합니다.
/etc/pki/tls/certs/mysql/ca.pem
/etc/pki/tls/certs/mysql/client-cert.pem
/etc/pki/tls/certs/mysql/client-key.pem
이제 에서 appclient의 MariaDB/MySQL 구성을 편집합니다.[client]
부분.
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
appclient의 mariadb 서비스를 다시 시작합니다.
systemctl restart mariadb
아직 여기 거래처에 있다
ssl TRUE가 반환됩니다.
mysql --ssl --help
이제 appclient의 mysql 인스턴스에 로그인합니다.
mysql -uroot -p
아래 두 변수 모두 YES로 표시되어야 합니다.
show variables LIKE '%ssl';
have_openssl YES
have_ssl YES
처음에 봤는데
have_openssl NO
mariadb.log를 간단히 살펴보면 다음과 같습니다.
SSL 오류:'/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
필요한 경우 바로 위의 단계에서 mariadb를 다시 시작합니다.
이것으로 안전한 접속을 테스트할 준비가 되었습니다.
아직 앱클라이언트에 접속하고 있습니다.
위에서 만든 계정을 사용하여 dbserver의 mysql 인스턴스에 연결을 시도합니다.
mysql -h dbserver -u iamsecure -p
# enter password dingdingding (hopefully you changed that to something else)
운이 좋으면 오류 없이 로그인할 수 있습니다.
SSL이 네이블로 되어 있는 것을 확인하려면 , MariaDB/MySQL 프롬프트에서 다음의 커맨드를 발행합니다.
\s
백슬래시(backslash) S, 일명 스테이터스입니다.
접속 상태가 표시됩니다.이 상태는 다음과 같습니다.
Connection id: 4
Current database:
Current user: iamsecure@appclient
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
접속 시도에서 권한 거부 오류가 발생한 경우 위의 GRANT 문을 확인하여 잘못된 문자나 마크가 없는지 확인하십시오.
SSL 에러가 발생했을 경우는, 이 메뉴얼을 참조해 순서가 정돈되어 있는 것을 확인해 주세요.
이것은 RHEL7에서 동작하고 CentOS7에서도 동작할 가능성이 있습니다.이러한 정확한 단계가 다른 곳에서도 작동하는지 확인할 수 없습니다.
이것이 다른 사람의 시간과 화를 덜어주길 바란다.
전술한 가이드에 의하면, 「공통명」이 3개의 증명서 모두에 대해서 다른 것을 확인할 필요가 있습니다.
3개의 증명서 모두에 같은 CN을 사용했기 때문에 같은 에러가 발생하고 있었습니다.다른 CN으로 증명서를 다시 생성하면 오류가 사라집니다.
언급URL : https://stackoverflow.com/questions/42145925/mariadb-over-ssl-not-working-certificate-verify-failed
'IT' 카테고리의 다른 글
원칙 2 DQL에서 now()를 사용하려면 어떻게 해야 합니까? (0) | 2022.11.17 |
---|---|
DataFrame 열 유형을 문자열에서 날짜/시간으로 변환 (0) | 2022.11.17 |
Mysql: 열 문자 집합 설정 (0) | 2022.11.17 |
WooCommerce 제품이 실제로 품절되지 않은 경우 "품절" 메시지를 표시합니다. (0) | 2022.11.17 |
SQL Query 결과를 PANDA Data Structure로 변환하는 방법 (0) | 2022.11.17 |