자체 서명 된 SSL 인증서를 사용하여 mysql에 연결 가능


15

자체 서명 된 SSL 인증서를 생성 한 후 원격 MySQL 서버에서이를 사용하도록 구성했습니다 (그리고 SSL이 활성화 됨)

원격 서버에 ssh하고 SSL을 사용하여 자체 mysqld에 연결을 시도하십시오 (MySQL 서버는 5.5.25입니다).

mysql -u <user> -p --ssl=1 --ssl-cert=client.cert --ssl-key=client.key --ssl-ca=ca.cert
Enter password: 
ERROR 2026 (HY000): SSL connection error: error:00000001:lib(0):func(0):reason(1)

좋아, SSL을 통해 동일한 서버에 연결하는 데 문제가 있다는 것을 기억합니다. 따라서 클라이언트 키를 로컬 상자로 다운로드하고 테스트합니다.

mysql -h <server> -u <user> -p --ssl=1 --ssl-cert=client.cert --ssl-key=client.key --ssl-ca=ca.cert 
Enter password: 
ERROR 2026 (HY000): SSL connection error

이 "SSL 연결 오류"오류가 무엇을 의미하는지 불분명하지만를 생략하면 -ssl-caSSL을 사용하여 연결할 수 있습니다.

mysql -h <server> -u <user> -p --ssl=1 --ssl-cert=client.cert --ssl-key=client.key 
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 37
Server version: 5.5.25 MySQL Community Server (GPL)

그러나 나는 이것이 연결을 암호화하고 실제로 인증서의 유효성을 확인하는 것이 아니라고 생각합니다 (중간자 공격에 잠재적으로 취약 할 수 있음)

SSL 인증서는 유효하지만 (자체 서명 되었음) 암호 문구가 없습니다. 그래서 내 질문은, 내가 뭘 잘못하고 있니? 자체 서명 된 인증서를 사용하여 SSL을 통해 연결하려면 어떻게해야합니까?

MySQL 서버 버전은 5.5.25이고 서버와 클라이언트는 CentOS 5입니다.

조언을 주셔서 감사합니다

편집 : 모든 경우에, 명령은 ssl 키가있는 동일한 디렉토리에서 실행되므로 절대 경로는 없습니다.

편집 (mgorven에 대한 응답으로) : ca.cert인증 기관 인증서입니다. 이는 인증 기관이 신뢰할 수 있음을 mysql에 알려줍니다.

구성 my.cnf

[mysqld]
ssl-ca=/etc/ssl/mysql/ca.cert
ssl-cert=/etc/ssl/mysql/server.cert
ssl-key=/etc/ssl/mysql/server.key

나는 또한 추가를 시도 ssl-cipher=DHE-RSA-AES256-SHA했지만 도움이되지 않아 제거했습니다.


2
무엇입니까 ca.cert? 서버의 자체 서명 인증서입니까? 인증을 위해 클라이언트 인증서를 사용하고 있습니까? 서버에서 SSL 관련 구성을 제공하십시오.
mgorven

감사합니다, 나는 서버의 응답 및 SSL 구성으로 질문을 업데이트했습니다. 연결하려고 할 때 명령 줄에 전달되는 인증서는 실제로 클라이언트 인증서입니다.
carpii 2016 년

실제로 좋은 질문입니다. 뒤늦은 견해 클라이언트가 서버 ssl-ca를 지정하는 것이 이치에 맞지 않습니다. 그러나 임없이 imrepssion에서 암호화 된 연결을 stricly 인증되지 않은
carpii

답변:


12

예, 지정 --ssl-ca하지 않으면 클라이언트가 서버 인증서를 전혀 확인하지 않는 것이 맞습니다 . 이 옵션을 사용하지 않고 작동하기 때문에 대부분의 실패 원인은 클라이언트가 서버 인증서를 신뢰하지 않기 때문입니다.

자체 서명 된 클라이언트 및 서버 인증서를 사용하는 경우 ca.cert파일에이 두 파일이 모두 포함되어야합니다. 이렇게하면 클라이언트는 서버 인증서를 신뢰하고 서버는 클라이언트 인증서를 신뢰합니다.

예를 들어
, 서버 키와 인증서를 생성하십시오.

$ openssl req -x509 -newkey rsa:1024 \
         -keyout server-key-enc.pem -out server-cert.pem \
         -subj '/DC=com/DC=example/CN=server' -passout pass:qwerty

$ openssl rsa -in server-key-enc.pem -out server-key.pem \
         -passin pass:qwerty -passout pass:

클라이언트 키 및 인증서를 생성하십시오.

$ openssl req -x509 -newkey rsa:1024 \
         -keyout client-key-enc.pem -out client-cert.pem \
         -subj '/DC=com/DC=example/CN=client' -passout pass:qwerty

$ openssl rsa -in client-key-enc.pem -out client-key.pem \
         -passin pass:qwerty -passout pass:

클라이언트 및 서버 인증서를 CA 인증서 파일로 결합하십시오.

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

정말 고맙습니다! 누락 된 단계는 서버 및 클라이언트 인증서를 ca.pem에 연결하지 않았다는 것입니다. 대신에 처음에 생성 된 ca.cert를 전달한 다음 (클라이언트 및 서버 인증서를 생성 할 때 --CA 키로 전달)
carpii

이상하지만 항상 클라이언트와 서버에서 동일한 하나의 CA 인증서로 항상 효과가있었습니다.
Dmitry Leskov

예, DN에 특별한 요구 사항이없는 한 (예 : CN이 특정 값인 경우) 클라이언트와 서버에서 동일한 키 및 자체 서명 인증서를 사용할 수 있습니다.
Keith Burdis

3

단방향 ssl을 사용하려면 다음을 시도하십시오.

mysql -u <user> -p --ssl=1 --ssl-ca=ca.cert --ssl-verify-server-cert

--ssl-cert--ssl-keymysql 클라이언트에 2 웨이 SSL에 사용됩니다. 이는 인증서 기반 인증을 의미합니다. 클라이언트 인증서의 제목은 사용자 이름이어야합니다.


2
또한 소켓 연결 및 --ssl-verify-server-cert서버 인증서의 CN 사용시 -h 명령 행 옵션에 지정한 호스트와 같아야합니다.
Keith Burdis

0

서버와 클라이언트 인증서에 동일한 공통 이름을 입력하지 않았습니까? 그렇다면 공통 이름이 달라 지도록 그 중 하나를 교체하십시오.


나를 위해 Dmitry Leskov의 솔루션이 효과가있었습니다. MySQL의 SSL 설명서에 따라 : ( dev.mysql.com/doc/refman/5.0/en/creating-ssl-certs.html )> 인증서 및 키 파일을 생성하는 데 사용하는 방법, 서버 및 클라이언트 인증서 / 키는 각각 CA 인증서에 사용 된 일반 이름 값과 달라야합니다. 그렇지 않으면 인증서 및 키 파일이 OpenSSL을 사용하여 컴파일 된 서버에서 작동하지 않습니다. 이 경우의 일반적인 오류는 다음과 같습니다. ERROR 2026 (HY000) : SSL 연결 오류 : error : 00000001 : lib (0) : func (0) : reason (1)
gmas
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.