सर्टिफिकेट चेन का उपयोग करता है, जो ओपनस्लीप वेरिफिकेशन का उपयोग करके सत्यापित करें


128

मैं निम्नलिखित इटैलिकेंट्स के साथ एक स्वयं की प्रमाण-पत्र श्रृंखला बना रहा हूं:

Root Certificate - Intermediate Certificate - User Certificate

रूट सर्टिफिकेट एक स्व हस्ताक्षरित प्रमाणपत्र है, इंटरमीडिएट द्वारा रूट और उपयोगकर्ता द्वारा इंटरमीडिएट प्रमाणपत्र पर हस्ताक्षर किए जाते हैं।

अब मैं यह सत्यापित करना चाहता हूं कि यदि किसी उपयोगकर्ता प्रमाणपत्र में रूट प्रमाणपत्र द्वारा उसका लंगर है।

साथ में

openssl verify -verbose -CAfile RootCert.pem Intermediate.pem

सत्यापन ठीक है। अगले चरण में मैं उपयोगकर्ता प्रमाणपत्र को मान्य करता हूं

openssl verify -verbose -CAfile Intermediate.pem UserCert.pem

और सत्यापन दिखाता है

error 20 at 0 depth lookup:unable to get local issuer certificate

गलत क्या है?

जवाबों:


164

से verifyप्रलेखन:

यदि कोई प्रमाण पत्र पाया जाता है जो उसका अपना जारीकर्ता है तो इसे मूल सीए माना जाता है।

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

openssl verify -CAfile RootCert.pem -untrusted Intermediate.pem UserCert.pem

यह एक ही कमांड में आपकी पूरी चेन को सत्यापित करेगा।


2
मैं इस जवाब को वोट कर रहा हूं क्योंकि मुझे हाल ही में ऐसा करना पड़ा था और इसके द्वारा सूचीबद्ध विभिन्न विकल्पों की कोशिश करने के बाद man verify, मैंने पाया कि -untrustedपैरामीटर मध्यवर्ती प्रमाणपत्र को निर्दिष्ट करते समय उपयोग करने के लिए सही है।
एंथोनी जोगेगन

मुझे लगता है कि दूसरा उत्तर: stackoverflow.com/a/31205833/173062 अधिक सटीक है - यह प्रमाण पत्र की श्रृंखला को -afile पैरामीटर से गुजरता है।
ग्लेनजामिन

2
-untrustedजाँच नहीं करता है कि प्रमाण पत्र श्रृंखला पूरी तरह से वैध है या नहीं। कृपया इंटरमीडिएट और रूट दोनों को पास करने के लिए विचार करें जैसा -CAfileकि अन्य प्रश्न बताते हैं।
18-22 को

2
यदि संभव हो तो इंटरमीडिएट के लिए प्रयोग किया जाता है। यह संभव है कि निम्नलिखित होता है: mail.python.org/pipermail/cryptography-dev/2016-August/…
ग्रेग स्मेटेल्स

2
यह वही नहीं है जो ओपी ने पूछा है, लेकिन यदि आप स्वयं हस्ताक्षरित श्रृंखला को सत्यापित नहीं करना चाहते हैं, तो अपने स्वयं के बजाय सिस्टम / ब्राउज़र सीए फ़ाइल का उपयोग करें। उदाहरण के लिए ओएस एक्स के साथ होमब्रेक उपयोग से खुलता है:openssl verify -CAfile /usr/local/etc/openssl/cert.pem -untrusted Intermediate.pem UserCert.pem
ग्रेग डबिकि

50

इसके लिए कुछ वैध नौकरियों में से एक है cat:

openssl verify -verbose -CAfile <(cat Intermediate.pem RootCert.pem) UserCert.pem

अपडेट करें:

जैसा कि ग्रेग स्मेटहेल्स टिप्पणियों में बताते हैं, यह कमांड इंटरमीडिएट को स्पष्ट रूप से भरोसा करता है । मैं ग्रेग संदर्भों के बाद के पहले भाग को पढ़ने की सलाह देता हूं (दूसरा भाग विशेष रूप से pyOpenSSL के बारे में है और इस प्रश्न के लिए प्रासंगिक नहीं है)।

यदि पोस्ट हट जाती है तो मैं महत्वपूर्ण पैराग्राफ उद्धृत करूंगा:

दुर्भाग्य से, एक "मध्यवर्ती" प्रमाण जो वास्तव में एक रूट / स्व-हस्ताक्षरित है, को दिए गए अनुशंसित आदेश का उपयोग करते समय एक विश्वसनीय सीए के रूप में माना जाएगा :

$ Opensl सत्यापित -CAfile <(cat geotrust_global_ca.pem rogue_ca.pem) fake_sometechcompany_from_rogue_ca.com.pem फर्जी_sometechcomp_from_rogue_ca.com.pem: ठीक है

ऐसा लगता है कि ओनली सर्टिफिकेट जैसे ही एक रूट सर्टिफिकेट होगा, चेन को सत्यापित करना बंद कर देगा, जो कि इंटरमीडिएट भी हो सकता है। यदि यह स्व-हस्ताक्षरित है। उस स्थिति में RootCert.pem को नहीं माना जाता है। इसलिए यह सुनिश्चित करें कि ऊपर दिए गए आदेश पर भरोसा करने से पहले Intermediate.pem एक विश्वसनीय स्रोत से आ रहा है।


क्या यह वास्तव में रूट सर्टिफिकेट के खिलाफ इंटरमीडिएट सर्टिफिकेट को सत्यापित करेगा?
अगस्तुर

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

8
चेतावनी: यदि इंटरमीडिएट .pem सभी अविश्वास पर है, तो इसका उपयोग करें। अधिक जानकारी के लिए यहां पढ़ें: mail.python.org/pipermail/cryptography-dev/2016-August/…
ग्रेग स्मेटहेल्स

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

1
@somenickname, टोनी की टिप्पणी देखें। वैसे भी स्वैच्छिक विकल्प बेहतर है। मेरा सुझाव है कि यदि आप आगे सहायता चाहते हैं तो आप अपना प्रश्न पूछें। टिप्पणियाँ आपकी समस्या को डीबग करने का सही स्थान नहीं हैं।
पीटर

17

समस्या यह है, कि 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 OKApache सेटिंग है, क्योंकि उपयोग करने वाले लोग 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 वर्षों में क्रिप्टो मुख्यधारा क्यों नहीं बन पाई है? इसीलिए। 'निफ ने कहा।


नीच व्यक्ति को: कृपया बताएं कि मेरे उत्तर में क्या गलत है। धन्यवाद।
टीनो

2
मैं पददलितों में से एक हूं। नीचे की ओर क्या ट्रिगर किया गया है: "और आप यह कैसे पता लगा सकते हैं कि कौन सी फाइलों की जरूरत है या नहीं और किस क्रम में है? अच्छा, प्रयोग करें, जब तक कि जांच आपको बताए कि सब कुछ ठीक है"। मुझे नहीं लगता कि एसएसएल एक विशेष मामला है। इस तरह की समस्याओं का एक निर्धारक समाधान होना चाहिए।
13

2
@ लाइक थैंक्स! आपकी तरह मुझे भी नियतिवादी बातें पसंद हैं। सवाल था, "क्या गलत है" और इसे "ओप्सनल वेरिफिकेशन" के साथ कैसे करना है। जैसा कि हम स्टैकओवरफ़्लो पर हैं, मैंने समझाया कि, इसके बाद एक प्रोग्रामेटिक (इस प्रकार निर्धारक) हां / ना में उत्तर दिया जाता है। आप इसे उत्पादन में स्थापित करने से पहले नए बंडल के लिए चेक को स्वचालित करने के लिए भी उपयोग कर सकते हैं। यह पूरी तरह से सवाल का जवाब देता है। आप क्या नापसंद करते हैं कि मैंने "कैसे एक उचित बंडल बनाने के लिए?" पर निराशा के बारे में बताया। जैसा कि मुझे लगता है कि इसके लिए एक छोटा सा निर्धारक उत्तर नहीं हो सकता है, इसका उत्तर देना यहां के संदर्भ में अपमानजनक होगा।
टीनो

6
"जैसा कि प्रियादी ने उल्लेख किया है, पहले स्व-हस्ताक्षरित प्रमाण पत्र पर स्टॉप्सवर्ल-स्टॉपेज बंद हो जाता है, इसलिए आप वास्तव में श्रृंखला का सत्यापन नहीं करते हैं, क्योंकि अक्सर मध्यवर्ती प्रमाण पत्र स्व-हस्ताक्षरित होता है।" स्पष्ट रूप से मध्यवर्ती प्रमाण पत्र कभी भी स्व हस्ताक्षरित नहीं होते हैं (यदि वे मूल प्रमाण पत्र होते हैं)। और सत्यापन का पूरा बिंदु यह जांचना है कि आपने सभी प्रमाणपत्रों को श्रृंखला में सभी तरह से एक विश्वसनीय रूट प्रमाणपत्र में शामिल किया है। यह वही है जो Opensl सत्यापित करता है। हालांकि, ओब्स्सल अपनी भरोसेमंद नीतियों के साथ रूढ़िवादी हो जाता है ...
टिमो

4
"अक्सर मध्यवर्ती प्रमाण पत्र स्व-हस्ताक्षरित होता है"। यह गलत है, और इस तरह की शब्दावली भ्रम नए लोगों के लिए एक विषय को समझना कठिन बना देती है जो वास्तव में सरल है जब सही तरीके से समझाया गया है। RFC 5280 से: "[...] CA प्रमाणपत्रों को आगे तीन वर्गों में विभाजित किया जा सकता है: क्रॉस-सर्टिफिकेट, स्व-जारी प्रमाण पत्र और स्व-हस्ताक्षरित प्रमाण पत्र। क्रॉस-सर्टिफिकेट CA सर्टिफिकेट हैं, जिसमें जारीकर्ता और विषय अलग-अलग संस्थाएँ हैं क्रॉस-सर्टिफिकेट दो सीए के बीच एक विश्वास संबंध का वर्णन करते हैं। [...] "।
डॉ। जन-फिलिप गेर्के

8

मुझे एक letencrypt प्रमाणपत्र का सत्यापन करना था और मैंने इसे इस तरह किया:

  1. रूट- सर्टिफिकेट और इंटर- सर्टिफिकेट - सर्टिफिकेट ऑफ़ ट्रस्टसेप्ट्री डाउनलोड करें ।
  2. इस आदेश को जारी करें:

    $ openssl verify -CAfile letsencrypt-root-cert/isrgrootx1.pem.txt -untrusted letsencrypt-intermediate-cert/letsencryptauthorityx3.pem.txt /etc/letsencrypt/live/sitename.tld/cert.pem 
    /etc/letsencrypt/live/sitename.tld/cert.pem: OK
    

1
खैर, लगता है कि जॉन को यह पसंद नहीं आया कि मैंने आपको धन्यवाद कहा। मैं "थैंक यू" कठिन पर जोर देता हूं, इसलिए यहां डिलीट किया गया टेक्स्ट है: आशा है कि यह आपके लेटेन्सक्रिप्ट क्रेट्स के लिए आपकी मदद करता है। प्रियदी के लिए धन्यवाद, आपके समाधान ने मुझे इस आदेश को खोजने में मदद की। कृपया उसका समाधान सुनिश्चित करें।
माइकल

5

SSL सर्टिफिकेट पर कोई पूर्व ज्ञान नहीं होने के साथ, ठीक उसी मुद्दे पर पूरे दिन के ब्रेक के बाद, मैंने CERTivity Keystores Manager को डाउनलोड किया और अपना कीस्टॉर इम्पोर्ट किया, और सर्टिफिकेट चेन का स्पष्ट दृश्य प्राप्त किया।

स्क्रीनशॉट:

यहाँ छवि विवरण दर्ज करें


1
सवाल का जवाब देने की कोशिश नहीं करता है कि कैसे उपयोग करना है openssl verify
binki

हां, लेकिन इस तरह का टूल आपको उस तरह की चीजों के लिए आवश्यक दृश्य दे सकता है यदि आप ओपनस् कमांड कमांड टूल की गुप्त जानकारी को नहीं समझते हैं :) तो यहां मेरा अपवोट है, कुछ ऑनलाइन सामान हो सकता है जो ऐसा भी करता है।
डेविड David वोंग

2

आप केवल उस जांच करना चाहते हैं जारीकर्ता की UserCert.pem वास्तव में है Intermediate.pem निम्नलिखित (उदाहरण का उपयोग करता है: कर OpenSSL 1.1.1):

openssl verify -no-CAfile -no-CApath -partial_chain -trusted Intermediate.pem UserCert.pem

और आपको मिलेगा:

UserCert.pem: OK

या

UserCert.pem: verification failed

openssl verify -no-CAfile -no-CApath -partial_chain -trusted Intermediate.pem UserCert.pemपायथन 3.7 के लिए कोई समकक्ष आदेश है ?
बोगोटा

-5

आप आसानी से ओरिजनल के साथ एक सर्टिफिकेट चेन का सत्यापन कर सकते हैं। फुलचैन में सीए सर्टिफिकेट शामिल होगा इसलिए आपको सीए और सर्टिफिकेट के बारे में खुद ही देख लेना चाहिए।

Opensl x509 -in fullchain.pem -text -noout


4
1) यह पूरी तरह से किसी भी तरह के स्पष्टीकरण के बिना है। 2) यह एक सवाल का जवाब है जो पूछने वाले ने बिना किसी संदर्भ के नहीं पूछा।
शादुर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.