2014-04-30 5 views
5

मैं ओपनएसएसएल विशेषज्ञ नहीं हूं, लेकिन मैं एसएसएल-सुरक्षित सर्वर से कनेक्ट करने वाले क्लाइंट के लिए ओसीएसपी स्टेपलिंग को संभालने के लिए कुछ कोड लिखने की कोशिश कर रहा हूं। ओसीएसपी की मेरी समझ यह है कि यह साबित करने के लिए प्रयोग किया जाता है कि प्रस्तुत किए जाने वाले प्रमाण पत्र को निरस्त नहीं किया गया है, जिसका अर्थ है कि मुझे जारीकर्ता द्वारा प्रकाशित सीआरएल के प्रबंधन से निपटने की आवश्यकता नहीं है।सत्यापन कॉलबैक के बाद ओसीएसपी स्टेपलिंग कॉलबैक क्यों कहा जाता है?

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

मैं अपने कोड संशोधित किया

SSL_set_tlsext_status_type(<the ssl object>, TLSEXT_STATUSTYPE_ocsp); 
SSL_CTX_set_tlsext_status_cb(<the context>, ssl_cb_ocsp_verify); 

जोड़ने और फिर मैं प्रतिक्रिया मिल और हैंडलर में यह देख सकते हैं। अब तक सब ठीक है!

लेकिन अजीब बात यह है कि मुझे लगता है मैं SSL_CTX_set_verify हैंडलर प्राप्त के बाद OCSP कॉलबैक मिलता है। मेरे (स्वीकार्य रूप से बेवकूफ) सोचने के लिए, इसका मतलब है कि मेरे पास दो विकल्प हैं:

1) सत्यापन कॉलबैक में निरस्तीकरण स्थिति की जांच करें, या तो सीआरएल का उपयोग करके, या अपना स्वयं का ओसीएसपी अनुरोध कर रहा है। यदि मैं ऐसा करता हूं, तो ओसीएसपी कॉलबैक में कुछ भी करने में कोई बात नहीं है, क्योंकि मैंने प्रमाण पत्र 2 की निरस्तीकरण स्थिति पहले ही निर्धारित कर दी है) सत्यापन कॉलबैक में निरस्तीकरण स्थिति की जांच न करें, और उम्मीद है कि ओसीएसपी हैंडलर कहा जाता है।

मैंने नोटिस किया कि ओसीएसपी हैंडलर से पहले हैडलर से पहले है यदि सर्वर से प्रतिक्रिया में एक स्टेपल ओसीएसपी संदेश शामिल नहीं है। तो एक संभावना यह है कि मैंने कुछ ध्वज को 'no_ocsp' शुरू में 0 पर सेट किया है, और फिर यदि मुझे कोई संदेश संलग्न नहीं होने पर ओसीएसपी कॉलबैक मिलता है, तो इसे 1 पर सेट करें। फिर सत्यापन हैंडलर में मैं इसे जांचने और निर्धारित करने के लिए जांच सकता हूं कि क्या ओसीएसपी हैंडलर को बाद में बुलाया जाएगा। यह एक कार की तरह लगता है जो किसी के रूप में खुद को अनलॉक करता है, और फिर यदि कोई व्यक्ति आने वाली गलत कुंजी डालता है, तो यह खुद को ताला लगा देता है - दूसरे शब्दों में, यह निश्चित रूप से सुरक्षा करने का 'सही' तरीका नहीं हो सकता है ?!

इसलिए, मुझे ओसीएसपी, ओपनएसएसएल, या दोनों का उपयोग करने के बारे में कुछ मौलिक गलतफहमी होनी चाहिए! मैं क्या गलत कर रहा हूं?

(मैं इसी तरह के सवाल जो वर्णन करती हैं कि करने के लिए मिल OCSP-स्टेपल संदेश, लेकिन मेरे सवाल यह है कि आप वास्तव में, एक समझदार तरह से इसका इस्तेमाल कॉलबैक के आदेश दिए गए से संबंधित है देखा है स्पष्ट है।: मैं बिना किसी समस्या के OCSP_RESPONSE प्राप्त कर सकता हूं)

+0

"। ... OpenSSL की अपनी आंतरिक सत्यापन प्रक्रिया के लिए अपवाद हैंडलिंग मुझे लगता है" की जाँच करें। यदि आवश्यक हो तो आपको ऐसा करना होगा। – jww

+0

आह, टिप के लिए धन्यवाद!मुझे एक श्वेतपत्र मिला है "सब कुछ जो आप हमेशा openssl के साथ प्रमाणपत्र सत्यापन के बारे में जानना चाहते थे (लेकिन पूछने से डरते थे)", जो इस पर कुछ अतिरिक्त जानकारी प्रदान करता है, लेकिन दुर्भाग्यवश ओसीएसपी पर नहीं (संक्षिप्त उल्लेख से अलग) – trime

+0

इससे पहले कि आप भरोसा करते हैं कि सर्वर आपको क्या कह रहा है (_e.g._ ओसीएसपी स्टेपलिंग), आप उस सर्वर पर पहली बार भरोसा करना चाहते हैं, इसलिए ओपनएसएसएल सर्वर के प्रमाण _first_ को सत्यापित क्यों कर रहा है, यह सुनिश्चित कर लें कि यह एक वैध और भरोसेमंद प्रमाणपत्र है _at सब_। फिर, मान लें कि प्रमाणपत्र वैध दिखता है, आप देखना चाहते हैं कि इसे निरस्त कर दिया गया है - और वह तब होता है जब आप स्टेपल ओसीएसपी प्रतिक्रिया को संभाल/संसाधित करेंगे। – Castaglia

उत्तर

0

तीसरा विकल्प सीआरएल अंक और ओसीएसपी उत्तर का अनुरोध करना होगा और फिर सही क्रम में स्वयं को सत्यापित करना होगा।

आप OCSP_basic_verify का उपयोग करते हुए कॉलबैक के भीतर ओसीएसपी स्टेपल उत्तर को मान्य करते हैं। यह भी ध्यान रखें कि OpenSSL से पहले 1.02 करता है * नहीं * होस्टनाम मिलान प्रदर्शन हो - फिर, एक बार कनेक्शन स्थापित किया गया था, तो आप सीआरएल द्वारा

X509_STORE_CTX* ctx = ... 

// fill up ctx, if not yet initialized 
ctx->chain = chain; 
ctx->get_crl = [](X509_STORE_CTX *ctx, X509_CRL **crl, X509 *x) -> int 
{ .. your method to download CRL .. } 
// disable additional CRL lookup by the library 
ctx->lookup_crls = [] (X509_STORE_CTX *ctx, X509_NAME *nm) ->STACK_OF(X509_CRL) * { return nullptr; }; 
// other possible options are: X509_V_FLAG_EXTENDED_CRL_SUPPORT, X509_V_FLAG_CRL_CHECK_ALL, X509_V_FLAG_USE_DELTAS 
ctx->param->flags = X509_V_FLAG_CRL_CHECK; 

// this will evaluate how well the CRL fits the leaf certificate you want to validate 
ctx->check_revocation(ctx); 

// this validates the CRL itself, if it is signed and stuff 
// 0 - bad 
// 1 - okay 
int ok = ctx->check_crl(ctx, m_crl); 

// This gives actual revocation result 
// 0 - bad (ctx->error = X509_V_ERR_CERT_REVOKED or something else) 
// 1 - okay 
// 2 - CRL_REASON_REMOVE_FROM_CRL 
int result = ctx->cert_crl(ctx, m_crl, leafCertificate); 
संबंधित मुद्दे