समस्या यह है, कि openssl -verify
काम नहीं करता है।
जैसा कि प्रियादी ने उल्लेख किया है , openssl -verify
पहले स्व-हस्ताक्षरित प्रमाण पत्र पर रुक जाता है, इसलिए आप वास्तव में श्रृंखला का सत्यापन नहीं करते हैं, क्योंकि अक्सर मध्यवर्ती प्रमाण पत्र स्व-हस्ताक्षरित होता है।
मुझे लगता है कि आप 101% सुनिश्चित होना चाहते हैं, कि उत्पादक वेब सेवा में उन्हें स्थापित करने का प्रयास करने से पहले प्रमाणपत्र फ़ाइलें सही हैं। यह नुस्खा यहाँ इस पूर्व उड़ान की जाँच करता है।
कृपया ध्यान दें कि पीटर का उत्तर सही है , हालांकि इसका आउटपुट openssl -verify
कोई सुराग नहीं है कि सब कुछ वास्तव में बाद में काम करता है। हां, यह कुछ समस्याएं मिल सकती हैं, लेकिन सभी नहीं।
यहाँ एक स्क्रिप्ट है जो आपाचे में स्थापित करने से पहले एक प्रमाण पत्र श्रृंखला को सत्यापित करने का काम करती है। शायद इसे कुछ अधिक रहस्यवादी ओपनएसएसएल जादू के साथ बढ़ाया जा सकता है, लेकिन मैं कोई ओपनएसएसएल गुरु नहीं है और निम्नलिखित काम करता हूं:
#!/bin/bash
# This Works is placed under the terms of the Copyright Less License,
# see file COPYRIGHT.CLL. USE AT OWN RISK, ABSOLUTELY NO WARRANTY.
#
# COPYRIGHT.CLL can be found at http://permalink.de/tino/cll
# (CLL is CC0 as long as not covered by any Copyright)
OOPS() { echo "OOPS: $*" >&2; exit 23; }
PID=
kick() { [ -n "$PID" ] && kill "$PID" && sleep .2; PID=; }
trap 'kick' 0
serve()
{
kick
PID=
openssl s_server -key "$KEY" -cert "$CRT" "$@" -www &
PID=$!
sleep .5 # give it time to startup
}
check()
{
while read -r line
do
case "$line" in
'Verify return code: 0 (ok)') return 0;;
'Verify return code: '*) return 1;;
# *) echo "::: $line :::";;
esac
done < <(echo | openssl s_client -verify 8 -CApath /etc/ssl/certs/)
OOPS "Something failed, verification output not found!"
return 2
}
ARG="${1%.}"
KEY="$ARG.key"
CRT="$ARG.crt"
BND="$ARG.bundle"
for a in "$KEY" "$CRT" "$BND"
do
[ -s "$a" ] || OOPS "missing $a"
done
serve
check && echo "!!! =========> CA-Bundle is not needed! <========"
echo
serve -CAfile "$BND"
check
ret=$?
kick
echo
case $ret in
0) echo "EVERYTHING OK"
echo "SSLCertificateKeyFile $KEY"
echo "SSLCertificateFile $CRT"
echo "SSLCACertificateFile $BND"
;;
*) echo "!!! =========> something is wrong, verification failed! <======== ($ret)";;
esac
exit $ret
ध्यान दें कि आउटपुट के बाद EVERYTHING OK
Apache सेटिंग है, क्योंकि उपयोग करने वाले लोग NginX
या haproxy
आमतौर पर इसे पूरी तरह से पढ़ और समझ सकते हैं;)
इसमें एक GitHub Gist है जो कुछ अपडेट हो सकता है
इस स्क्रिप्ट के पूर्वापेक्षाएँ:
- आपके पास
/etc/ssl/certs
उबंटू पर उदाहरण के लिए हमेशा की तरह विश्वसनीय सीए रूट डेटा है
- निर्देशिका बनाएँ
DIR
जहाँ आप 3 फ़ाइलों को संग्रहीत करते हैं:
DIR/certificate.crt
जिसमें प्रमाणपत्र शामिल है
DIR/certificate.key
जिसमें आपके वेब सेवा (पासफ़्रेज़ के बिना) के लिए गुप्त कुंजी है
DIR/certificate.bundle
जिसमें CA-बंडल शामिल है। बंडल कैसे तैयार करें, नीचे देखें।
- अब स्क्रिप्ट चलाएँ:
./check DIR/certificate
(यह मानता है कि स्क्रिप्ट को check
वर्तमान निर्देशिका में नाम दिया गया है)
- एक बहुत ही संभावना नहीं है कि स्क्रिप्ट आउटपुट
CA-Bundle is not needed
। इसका मतलब है, कि आप (पढ़ें /etc/ssl/certs/
:) पहले से ही हस्ताक्षरित प्रमाण पत्र पर भरोसा करता है। लेकिन यह डब्ल्यूडब्ल्यूडब्ल्यू में अत्यधिक संभावना नहीं है।
- इस परीक्षण पोर्ट के लिए 4433 को आपके वर्कस्टेशन पर अप्रयुक्त होना चाहिए। और बेहतर केवल इसे सुरक्षित वातावरण में चलाते हैं, क्योंकि यह सार्वजनिक रूप से शीघ्र ही 4433 पोर्ट खोल देता है, जो एक शत्रुतापूर्ण वातावरण में विदेशी कनेक्ट को देख सकता है।
certificate.bundle
फाइल कैसे बनाये ?
WWW में विश्वास श्रृंखला आमतौर पर इस तरह दिखाई देती है:
- से विश्वसनीय प्रमाण पत्र
/etc/ssl/certs
- अज्ञात मध्यवर्ती प्रमाण पत्र, संभवतः दूसरे CA द्वारा हस्ताक्षरित क्रॉस
- आपका प्रमाण पत्र (
certificate.crt
)
अब, मूल्यांकन नीचे से ऊपर तक होता है, इसका मतलब है, पहले, आपका प्रमाण पत्र पढ़ा जाता है, फिर अज्ञात मध्यवर्ती प्रमाण पत्र की आवश्यकता होती है, फिर शायद क्रॉस-हस्ताक्षर-प्रमाण पत्र और फिर /etc/ssl/certs
उचित विश्वसनीय प्रमाण पत्र खोजने के लिए परामर्श किया जाता है।
सीए-बंडल को सही प्रसंस्करण क्रम में बनाया जाना चाहिए, इसका मतलब है, पहले आवश्यक प्रमाणपत्र (मध्यवर्ती प्रमाण पत्र जो आपके प्रमाण पत्र पर हस्ताक्षर करता है) बंडल में पहले आता है। फिर क्रॉस-साइनिंग-सर्टिफिकेट की जरूरत होती है।
आमतौर पर आपका सीए (आपके प्रमाणपत्र पर हस्ताक्षर करने वाले प्राधिकारी) इस तरह की एक उचित सीए-बंडल-फ़ाइल पहले से ही प्रदान करेगा। यदि नहीं, तो आपको सभी आवश्यक मध्यवर्ती प्रमाणपत्र लेने की आवश्यकता है और cat
उन्हें एक साथ एक फाइल (यूनिक्स पर) में डालना है। विंडोज पर आप केवल एक टेक्स्ट एडिटर (जैसे notepad.exe
) खोल सकते हैं और प्रमाण पत्र को फ़ाइल में पेस्ट कर सकते हैं, पहली जरूरत शीर्ष पर और दूसरों के बाद।
एक और बात है। फ़ाइलों को पीईएम प्रारूप में होना चाहिए। कुछ सीए डीईआर (एक बाइनरी) प्रारूप जारी करते हैं। पीईएम को स्पॉट करना आसान है: यह एएससीआईआई पठनीय है। पीईएम को कुछ में परिवर्तित करने के तरीके के बारे में जानने के लिए, देखें कि कैसे .prt को परिवर्तित करें और पीले ईंट की सड़क का अनुसरण करें।
उदाहरण:
आपके पास:
intermediate2.crt
मध्यवर्ती प्रमाणपत्र जो आपके हस्ताक्षरित है certificate.crt
intermediate1.crt
एक और मध्यवर्ती प्रमाण, जो गाता है intermediate2.crt
crossigned.crt
जो दूसरे CA का क्रॉस साइनिंग सर्टिफिकेट है, जिस पर हस्ताक्षर किए हैं intermediate1.crt
crossintermediate.crt
जो अन्य सीए से एक और मध्यवर्ती है जिसने हस्ताक्षर किए crossigned.crt
(आप शायद ऐसा कभी नहीं देखेंगे)
तब उचित cat
इस तरह दिखेगा:
cat intermediate2.crt intermediate1.crt crossigned.crt crossintermediate.crt > certificate.bundle
और आप यह कैसे पता लगा सकते हैं कि किन फाइलों की जरूरत है या नहीं और किस क्रम में है?
ठीक है, प्रयोग करें, जब तक check
कि आपको सब कुछ ठीक न हो जाए। यह पहेली को हल करने के लिए एक कंप्यूटर पहेली खेल की तरह है। हर एक। एक। समय। यहां तक कि पेशेवरों के लिए भी। लेकिन ऐसा करने के लिए आपको हर बार बेहतर होगा। तो आप निश्चित रूप से उस दर्द के साथ अकेले नहीं हैं। यह एसएसएल है, फिर पता है? एसएसएल शायद सबसे खराब डिजाइनों में से एक है जिसे मैंने 30 साल के पेशेवर सिस्टम प्रशासन में देखा है। कभी सोचा है कि पिछले 30 वर्षों में क्रिप्टो मुख्यधारा क्यों नहीं बन पाई है? इसीलिए। 'निफ ने कहा।
man verify
, मैंने पाया कि-untrusted
पैरामीटर मध्यवर्ती प्रमाणपत्र को निर्दिष्ट करते समय उपयोग करने के लिए सही है।