OpenSSL을 사용하여 MySQL 서버에 대한 SSL 연결을 디버깅 할 수 있습니까?


21

내 웹 서버가 SSL 연결을 통해 MySQL 데이터베이스 서버와 통신하기를 원합니다. 웹 서버는 CentOS5를 실행하고 데이터베이스 서버는 FreeBSD를 실행합니다. 인증서는 중간 CA DigiCert에서 제공합니다.

MySQL은 다음과 같이 ssl을 사용해야합니다 my.cnf.

# The MySQL server
[mysqld]
port            = 3306
socket          = /tmp/mysql.sock
ssl
ssl-capath = /opt/mysql/pki/CA
ssl-cert = /opt/mysql/pki/server-cert.pem
ssl-key = /opt/mysql/pki/server-key.pem

MySQL을 시작하면 데몬이 오류없이 시작됩니다. 이는 인증서 파일을 모두 읽을 수 있음을 나타냅니다.

그러나 웹 서버에서 데이터베이스 서버로 연결하려고하면 오류가 발생합니다.

[root@webserver ~]# mysql -h mysql.example.org -u user -p
ERROR 2026 (HY000): SSL connection error

그리고 openssl로 추가 디버깅을 시도하면 :

[root@webserver ~]# openssl s_client -connect mysql.example.org:3306 0>/dev/null
CONNECTED(00000003)
15706:error:140770FC:SSL routines:SSL23_GET_SERVER_HELLO:unknown protocol:s23_clnt.c:588:

이것이 MySQL 데이터베이스 서버에 대한 SSL 연결을 테스트하는 올바른 방법입니까? SSL23_GET_SERVER_HELLO:unknown protocolSSL 트래픽이 아닌 포트로 SSL을 사용하는 경우 일반적으로 표시 되는 메시지이기 때문에 메시지가 이상합니다.

이 동일한 openssl 명령은 LDAP 및 HTTP 서버에서 제대로 작동하는 것 같습니다.

$ openssl s_client -connect ldap.example.org:636  0>/dev/null
CONNECTED(00000003)
depth=2 /C=US/O=The Go Daddy Group, Inc./OU=Go Daddy Class 2 Certification Authority
...
$ openssl s_client -connect www.example.org:443  0>/dev/null
CONNECTED(00000003)
depth=0 /DC=org/DC=example/OU=Services/CN=www.example.org

Wireshark를 사용하여 MySQL 서버에 대한 SSL 트래픽을 검사 할 수도 있습니다 ( i.imgur.com/5uTkLqU.png 참조) .
Jaime Hablutzel

답변:


11

OpenSSL 버전 1.1.1 (2018 년 9 월 11 일 릴리스) -starttls mysql커밋 a2d9cfbac5d87b03496d62079aef01c601193b58에 대한 지원을 추가 했습니다 . 불행히도 OpenSSL 변경 로그에서이 새로운 기능에 대한 참조를 찾을 수 없습니다.

배포 아직이 버전이없는 경우에 정적으로 컴파일하려면 openssl 바이너리가 https://testssl.sh/openssl-1.0.2k-dev-chacha.pm.ipv6.Linux+FreeBSD.tar.gz 지원합니까 -starttls mysql. http://www.danneman.org/presentations/Automating_TLS_Configuration_Verification.pdf 에서 참조를 찾았습니다 .

Windows의 경우 OpenSSL 1.1.1 바이너리는 https://wiki.openssl.org/index.php/Binaries 에서 찾을 수 있습니다.

https://dev.mysql.com/doc/refman/5.7/en/creating-ssl-files-using-openssl.html에 설명 된대로 SSL 인증서를 생성하고 시도했으며 작동합니다.

$ echo | bin/openssl.Linux.x86_64.static s_client -starttls mysql -connect spx-bionic.censored.com:3306 -CAfile /tmp/ca.pem
CONNECTED(00000003)
depth=1 C = AU, ST = Some-State, O = Internet Widgits Pty Ltd, CN = mysql test CA
verify return:1
depth=0 C = AU, ST = Some-State, O = Internet Widgits Pty Ltd, CN = spx-bionic.censored.com
verify return:1
---
Certificate chain
 0 s:/C=AU/ST=Some-State/O=Internet Widgits Pty Ltd/CN=spx-bionic.censored.com
   i:/C=AU/ST=Some-State/O=Internet Widgits Pty Ltd/CN=mysql test CA
 1 s:/C=AU/ST=Some-State/O=Internet Widgits Pty Ltd/CN=mysql test CA
   i:/C=AU/ST=Some-State/O=Internet Widgits Pty Ltd/CN=mysql test CA
---
Server certificate
-----BEGIN CERTIFICATE-----
CENSORED
-----END CERTIFICATE-----
subject=/C=AU/ST=Some-State/O=Internet Widgits Pty Ltd/CN=spx-bionic.censored.com
issuer=/C=AU/ST=Some-State/O=Internet Widgits Pty Ltd/CN=mysql test CA
---
No client certificate CA names sent
Client Certificate Types: RSA sign, DSA sign, ECDSA sign
Requested Signature Algorithms: RSA+SHA512:DSA+SHA512:ECDSA+SHA512:RSA+SHA384:DSA+SHA384:ECDSA+SHA384:RSA+SHA256:DSA+SHA256:ECDSA+SHA256:RSA+SHA224:DSA+SHA224:ECDSA+SHA224:RSA+SHA1:DSA+SHA1:ECDSA+SHA1
Shared Requested Signature Algorithms: RSA+SHA512:DSA+SHA512:ECDSA+SHA512:RSA+SHA384:DSA+SHA384:ECDSA+SHA384:RSA+SHA256:DSA+SHA256:ECDSA+SHA256:RSA+SHA224:DSA+SHA224:ECDSA+SHA224:RSA+SHA1:DSA+SHA1:ECDSA+SHA1
Peer signing digest: SHA512
Server Temp Key: ECDH, P-521, 521 bits
---
SSL handshake has read 2599 bytes and written 632 bytes
---
New, TLSv1/SSLv3, Cipher is ECDHE-RSA-AES256-GCM-SHA384
Server public key is 2048 bit
Secure Renegotiation IS supported
Compression: NONE
Expansion: NONE
No ALPN negotiated
SSL-Session:
    Protocol  : TLSv1.2
    Cipher    : ECDHE-RSA-AES256-GCM-SHA384
    Session-ID: AD25B7C3018E4715F262188D982AAE141A232712316E0A3292B0C14178E0F505
    Session-ID-ctx: 
    Master-Key: C121967E8FAEC4D0E0157419000660434D415251B0281CCBFC6D7A2AE8B0CC63AEFE22B332E91D31424C1BF03E5AF319
    Key-Arg   : None
    PSK identity: None
    PSK identity hint: None
    SRP username: None
    TLS session ticket lifetime hint: 7200 (seconds)
    TLS session ticket:
    0000 - 82 db 03 0f c0 ce f2 26-62 bd 1b 18 71 03 88 db   .......&b...q...
    0010 - a6 66 7c 71 94 0c d5 ec-96 30 46 53 4a e6 cd 76   .f|q.....0FSJ..v
    0020 - 66 b3 22 86 7d 9f 7e 2c-14 1d 66 f2 46 8f d2 d3   f.".}.~,..f.F...
    0030 - f7 0a 0b f5 9e 05 97 e1-2b b3 ba 79 78 16 b8 59   ........+..yx..Y
    0040 - dc c5 0d a8 de 0b 3a df-4b ec f9 73 3f 4c c3 f1   ......:.K..s?L..
    0050 - 86 b6 f7 aa a7 92 84 77-9f 09 b2 cc 5d dd 35 41   .......w....].5A
    0060 - 23 5d 77 74 e1 96 91 ac-28 81 aa 83 fe fc d2 3c   #]wt....(......<
    0070 - f9 23 09 6d 00 e0 da ef-48 69 92 48 54 61 69 e8   .#.m....Hi.HTai.
    0080 - 30 0e 1f 49 7d 08 63 9e-91 70 fc 00 9f cd fe 51   0..I}.c..p.....Q
    0090 - 66 33 61 24 42 8f c2 16-57 54 48 ec 6a 87 dc 50   f3a$B...WTH.j..P

    Start Time: 1537350458
    Timeout   : 300 (sec)
    Verify return code: 0 (ok)
---
DONE

-starttlsOpenSSL 1.1.1에서도 postgres 및 ldap 도 지원됩니다. 전체 목록 은 https://github.com/openssl/openssl/blob/OpenSSL_1_1_1-stable/apps/s_client.c#L815-L831 을 참조 하십시오 .


12

내 자신의 질문에 대답. 좋은 정답을 가진 더 나은 답변이 있다면 답변을 게시하십시오.

짧은 답변; 아니요, OpenSSL을 사용하여 MySQL SSL 연결을 디버깅 할 수 없습니다. 이는 MySQL이 일반 텍스트를 사용하여 세션을 시작한 후 SSL로 전환하기 때문입니다.

https://dev.mysql.com/doc/dev/mysql-server/latest/page_protocol_connection_phase.html을 읽으면 MySQL이 일반 텍스트 연결로 시작한 다음 실제 SSL이 시작됩니다. 이것은 MySQL이 일반 텍스트와 암호화 된 연결을 위해 하나의 포트 (포트 3306)에서 수신하는 방법을 설명합니다. 이 포트를 HTTP 또는 LDAP 서버와 비교하십시오. 여기서 하나의 포트는 일반 텍스트 연결에 사용되고 다른 하나는 암호화 된 연결에 사용됩니다.

ERR 패킷을 보내고 핸드 셰이크를 완료하거나 클라이언트가 핸드 셰이크 응답 패킷으로 응답하는 초기 핸드 셰이크 패킷을 보낼 수있는 서버에 대한 클라이언트 connect ()로 시작합니다. 이 단계에서 클라이언트는 SSL 연결을 요청할 수 있습니다.이 경우 클라이언트가 인증 응답을 보내기 전에 SSL 통신 채널이 설정됩니다.


1
이는 STARTTLS를 사용할 때 SMTP가 작동하는 방식과 동일하며 동일한 포트에서 암호화 및 암호화되지 않은 연결을 사용할 수도 있습니다.
Synchro

흠, en.wikipedia.org/wiki/STARTTLS 에 따르면 내가 말하는 행동이 STARTTLS 작동 방식이라고 생각합니다 .
Stefan Lasiewski

2
MySQL은 " STARTTLS " 와 같이 작동하지만 실제로 OpenTL이 성공적으로 상호 작용할 수있는 방법은 아니지만 실제로 STARTTLS를 구현하지는 않습니다.
Christopher Schultz


0

MacOS X 클라이언트가 Ubuntu 서버와 통신하는 데 비슷한 문제가 발생했습니다.

서버 인증서에 대한 CA 만 있으면서 클라이언트 측 인증서와 클라이언트 키를 제외하고 연결이 작동하는지 확인할 수 있습니까? 암호화 된 연결을 설정할 수 있습니까? 일반적으로 연결된 사용자의 ssl_type 열에 대한 모든 설정이 필요합니다.


0

MySQL과 클라이언트간에로드 밸런서 (예 : F5 또는 HAProxy)를 사용하려는 경우 SSL 인증서를로드 밸런서에서 MySQL 서버로 가져오고 싶을뿐입니다. 이것은 STARTTLS와 같은 연결 시작 때문입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.