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

और अगर मैं आगे खुलने के लिए डिबग करने की कोशिश करता हूं:

[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 protocolसंदेश अजीब है क्योंकि यह तब होता है जब आप गैर-एसएसएल ट्रैफिक के लिए एक पोर्ट पर एसएसएल बोल रहे होते हैं।

यह वही ओपन कमांड कमांड 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

ध्यान दें कि आप एक MySQL सर्वर पर SSL ट्रैफ़िक का निरीक्षण करने के लिए Wireshark का भी उपयोग कर सकते हैं, i.imgur.com/5uTkLqU.png देखें ।
Jaime Hablutzel

जवाबों:


11

OpenSSL संस्करण 1.1.1 के लिए जोड़ा समर्थन (11 सितं, 2018 को जारी) -starttls mysqlमें a2d9cfbac5d87b03496d62079aef01c601193b58 प्रतिबद्ध । दुर्भाग्य से मुझे ओपनएसएसएल चैंज में इस नई सुविधा का संदर्भ नहीं मिला।

यदि आपके वितरण में अभी तक यह संस्करण नहीं है, तो https://testssl.sh/openssl-1.0.2k-dev-chacha.pm.ipv6.Linux+FreeBSl.tar.gz पर एक सांख्यिकीय संकलित ओपन बाइनरी है जो समर्थन नहीं करता है -starttls mysql। मुझे इसका संदर्भ http://www.danneman.org/pretations/Automating_TLS_Configuration_Verification.pdf में मिला ।

विंडोज के लिए ओपनएसएसएल 1.1.1 बायनेरिज़ https://wiki.openssl.org/index.php/Blaries पर मिल सकते हैं

जैसा कि https://dev.mysql.com/doc/refman/5.7/en/creating-ssl-files-use-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 में पोस्टग्रेज और ldap के लिए भी समर्थन है। पूरी सूची के लिए https://github.com/openssl/openssl/blob/OpenSSL_1_1_1-stable/apps/s_client.c#L815-L831 देखें ।


12

मेरे ही प्रश्न का उत्तर दे रहा हूं। यदि आपके पास अच्छे, आधिकारिक स्रोतों के साथ बेहतर उत्तर है, तो कृपया उत्तर दें।

संक्षिप्त जवाब; नहीं, OpenSSL का उपयोग MySQL SSL कनेक्शन को डीबग करने के लिए नहीं किया जा सकता है। ऐसा इसलिए है क्योंकि MySQL ने सत्र को प्लेनटेक्स्ट का उपयोग करके शुरू किया और बाद में एसएसएल पर स्विच किया।

Https://dev.mysql.com/doc/dev/mysql-server/latest/page_protocol_connection_phase.html पढ़ने पर , MySQL एक सादा कनेक्शन के साथ शुरू होता है, और उसके बाद वास्तविक SSL आरंभ किया जाता है। यह बताता है कि कैसे सादे और एन्क्रिप्टेड कनेक्शन दोनों के लिए MySQL एक पोर्ट (पोर्ट 3306) को सुनने में सक्षम है। इसकी तुलना HTTP या LDAP सर्वर से करें, जहाँ एक पोर्ट का उपयोग प्लेनटेक्स्ट कनेक्शन के लिए और दूसरे पोर्ट का उपयोग एन्क्रिप्टेड कनेक्शन के लिए किया जाता है।

यह क्लाइंट कनेक्ट () से शुरू होता है जो उस सर्वर से जुड़ा होता है जो ERR पैकेट भेज सकता है और हैंडशेक खत्म कर सकता है या एक प्रारंभिक हैंडशेक पैकेट भेज सकता है जिसका क्लाइंट हैंडशेक रिस्पांस पैकेट के साथ जवाब देता है। इस स्तर पर क्लाइंट एसएसएल कनेक्शन के लिए अनुरोध कर सकता है, ग्राहक के प्रमाणीकरण की प्रतिक्रिया भेजने से पहले एक एसएसएल संचार चैनल स्थापित होने की स्थिति में


1
यह उसी तरह है जैसे कि जब आप STARTTLS का उपयोग करते हैं तो SMTP कैसे काम करता है, और यह आपको उसी पोर्ट पर एन्क्रिप्टेड और अनएन्क्रिप्टेड कनेक्टिऑन का उपयोग करने की भी अनुमति देता है।
सांच्रो

Hm, मुझे लगता है कि मैं बात कर रहा हूं कि en.wikipedia.org/wiki/STARTTLS के अनुसार STARTTLS कैसे काम करता है ।
स्टेफन लासिवस्की

2
जबकि MySQL " STARTTLS की तरह " काम करता है , यह वास्तव में STARTTLS को लागू नहीं करता है, कम से कम किसी भी तरह से नहीं जो मैंने ओपनएसएसएल पाया है वह सफलतापूर्वक बातचीत कर सकता है।
क्रिस्टोफर शुल्त् 16

1

इस समस्या का एक सामान्य कारण यह है कि CA प्रमाणपत्र का सामान्य नाम (CN) सर्वर और / या क्लाइंट प्रमाणपत्र के समान है।

यहां देखें: https://dev.mysql.com/doc/refman/5.6/en/creating-ssl-certs.html

अपने CA और प्रमाणपत्र (नों) को फिर से बनाने की कोशिश करें और सभी मामलों में एक अद्वितीय CN का उपयोग सुनिश्चित करें।


0

मैं MacOS X क्लाइंट के साथ एक उबंटू सर्वर के साथ संचार करते हुए एक अपरिचित मुद्दे पर चल रहा हूं।

क्या आप जाँच सकते हैं कि क्या कनेक्शन काम करेगा यदि आप क्लाइंट साइड सर्टिफिकेट और क्लाइंट की को छोड़ देते हैं, तो सर्वर सर्टिफिकेट के लिए सिर्फ सीए होना चाहिए? क्या आप एक एन्क्रिप्टेड कनेक्शन स्थापित करने में सक्षम हैं? यह आमतौर पर संबंधित उपयोगकर्ता के ssl_type कॉलम के लिए किसी भी सेटिंग की आवश्यकता होगी।


0

बस पोस्टरिटी के लिए यह नोट करना चाहता था कि यदि आप MySQL और क्लाइंट के बीच लोड बैलेंसर (जैसे F5 या HAProxy) का उपयोग करना चाहते हैं, तो आप अपने SSL प्रमाणपत्र को लोड balancer से MySQL सर्वर में आयात करना चाहेंगे। यह STARTTLS जैसे कनेक्शन स्टार्टअप के कारण है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.