स्वयं हस्ताक्षरित एसएसएल प्रमाण पत्र का उपयोग करके खिचड़ी को mysql से कनेक्ट करें


15

स्व-हस्ताक्षरित एसएसएल प्रमाणपत्र बनाने के बाद, मैंने उनका उपयोग करने के लिए अपने दूरस्थ MySQL सर्वर को कॉन्फ़िगर किया है (और SSL सक्षम है)

मैं अपने दूरस्थ सर्वर में ssh, और SSL (MySQL सर्वर 5.5.25) का उपयोग करके अपने स्वयं के mysqld से कनेक्ट करने का प्रयास करता हूं।

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)

ठीक है, मुझे याद है कि एसएसएल के माध्यम से एक ही सर्वर से कनेक्ट होने के साथ रीडिंग कुछ समस्या है। इसलिए मैं क्लाइंट कुंजियों को अपने स्थानीय बॉक्स में डाउनलोड करता हूं, और वहां से परीक्षण करता हूं ...

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-caहूं, तो मैं SSL का उपयोग करके कनेक्ट करने में सक्षम हूं।

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 सेरेस्ट मान्य हैं (यद्यपि स्वयं हस्ताक्षरित), और उन पर पासफ़्रेज़ नहीं है। तो मेरा सवाल यह है कि मैं क्या गलत कर रहा हूं? मैं स्वयं हस्ताक्षरित प्रमाण पत्र का उपयोग करके एसएसएल के माध्यम से कैसे जुड़ सकता हूं?

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 संबंधित कॉन्फ़िगरेशन प्रदान करें।
मंगल १ven

धन्यवाद, Ive सर्वर से प्रतिक्रिया और एसएसएल विन्यास के साथ मेरे सवाल को अद्यतन किया। कनेक्ट करने की कोशिश करते समय कमांडलाइन पर पारित होने वाले प्रमाण पत्र वास्तव में ग्राहक प्रमाण पत्र हैं।
कारपाइ

एक अच्छा सवाल है। Hindsight Im में सुनिश्चित नहीं है कि यह क्लाइंट के लिए सर्वर ssl-ca निर्दिष्ट करने के लिए समझ में आता है। लेकिन फिर Im के बिना imrepssion के तहत एन्क्रिप्टेड कनेक्शन कड़ाई से प्रमाणित नहीं है
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

अजीब है, लेकिन यह हमेशा मेरे लिए सिर्फ एक सीए सर्टिफिकेट के साथ काम करता था - क्लाइंट और सर्वर पर समान।
दिमित्री लेकोव

हां, जब तक डीएन के लिए कोई विशेष आवश्यकताएं नहीं हैं - उदाहरण के लिए सीएन एक विशिष्ट मूल्य है - तब आप क्लाइंट और सर्वर पर एक ही कुंजी और स्व-हस्ताक्षरित प्रमाण पत्र का उपयोग कर सकते हैं।
कीथ बर्दिस

3

एक तरह से ssl का उपयोग करने के लिए, आपको इसके साथ प्रयास करना चाहिए:

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

--ssl-certऔर --ssl-keymysql ग्राहक पर 2 रास्ता एसएसएल के लिए उपयोग किया जाता है। इसका मतलब है प्रमाण पत्र आधारित प्रमाणीकरण। क्लाइंट प्रमाणपत्र का विषय उपयोगकर्ता नाम होना चाहिए।


2
यह भी ध्यान रखें कि सॉकेट कनेक्शन बनाते समय और --ssl-verify-server-certसर्वर सर्टिफिकेट के CN का उपयोग करते समय आपके द्वारा -h कमांड लाइन विकल्प के लिए निर्दिष्ट होस्ट के समान होना चाहिए।
कीथ बर्दिस

0

किसी भी संयोग से, क्या आपने सर्वर और क्लाइंट सेर्ट्स के लिए समान कॉमन नाम दर्ज नहीं किया है? यदि हाँ, तो उनमें से एक को बदल दें ताकि आम नाम अलग-अलग हों।


मेरे लिए, दिमित्री लेसकोव के समाधान ने काम किया। MySQL के SSL दस्तावेज के अनुसार: ( dev.mysql.com/doc/refman/5.0/en/creating-ssl-certs.html )> सर्टिफिकेट और की-फाइल्स जेनरेट करने के लिए जो भी तरीका आप इस्तेमाल करते हैं, सर्वर के लिए इस्तेमाल किया जाने वाला कॉमन नेम वैल्यू। क्लाइंट प्रमाणपत्र / कुंजी को CA प्रमाणपत्र के लिए उपयोग किए जाने वाले सामान्य नाम मूल्य से प्रत्येक भिन्न होना चाहिए। अन्यथा, OpenSSL का उपयोग करके संकलित सर्वर के लिए प्रमाण पत्र और कुंजी फाइलें काम नहीं करेंगी। इस मामले में एक विशिष्ट त्रुटि है: ERROR 2026 (HY000): SSL कनेक्शन त्रुटि: त्रुटि: 00000001: lib (0): func (0): कारण (1)
gmas
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.