8

CherryPy 3.0 और बाद, एक तरह से एसएसएल बस सर्वर प्रमाणपत्र और निजी कुंजी की ओर इशारा करते रूप से चालू किया जा सकता है, इस तरह से:CherryPy साथ 2 तरह एसएसएल

import cherrypy 

class HelloWorld(object): 
    def index(self): 
     return "Hello SSL World!" 
    index.exposed = True 

cherrypy.server.ssl_certificate = "keys/server.crt" 
cherrypy.server.ssl_private_key = "keys/server.crtkey" 
cherrypy.quickstart(HelloWorld()) 

यह सक्षम बनाता है मान्य करने के लिए ग्राहकों सर्वर की प्रामाणिकता। क्या किसी को पता है कि चेरीपी 2-तरफा एसएसएल का समर्थन करता है, उदाहरण के लिए जहां क्लाइंट प्रमाण पत्र सत्यापित करके सर्वर क्लाइंट प्रामाणिकता भी देख सकता है?

यदि हां, तो कोई भी उदाहरण दे सकता है कि यह कैसे किया जाता है? या एक उदाहरण के लिए एक संदर्भ पोस्ट करें?

उत्तर

4

यह बॉक्स से बाहर नहीं है। उस सुविधा को प्रदान करने के लिए आपको wsgiserver को पैच करना होगा। http://www.cherrypy.org/ticket/1001 पर प्रगति पर एक टिकट (और पैच) है।

+2

अब https://bitbucket.org/cherrypy/cherrypy/issue/1001/adding-support-for-client-certificate पर – Pim

3

मैं वही चीज़ ढूंढ रहा हूं। मुझे पता है चेरीपी साइट पर कुछ पैच हैं।

मुझे निम्नलिखित CherryPy SSL Client Authentication पर भी मिला। मैंने चेरीपी पैच बनाम इसकी तुलना नहीं की है, लेकिन शायद जानकारी उपयोगी होगी।

हमने हाल ही में एक त्वरित लेकिन लचीला बाकी आवेदन को विकसित करने की जरूरत है और में पाया गया कि CherryPy हमारी जरूरतों के अलावा अन्य अजगर चौखटे नेटवर्किंग, मुड़ की तरह बेहतर उपयुक्त है। दुर्भाग्यवश, इसकी सादगी में महत्वपूर्ण विशेषता थी, जिसकी हमें आवश्यकता थी, सर्वर/क्लाइंट SSL प्रमाणपत्र सत्यापन। इसलिए हमने वर्तमान रिलीज, 3.1.2 में कुछ त्वरित संशोधनों को लिखने में कुछ घंटे बिताए। निम्नलिखित कोड के टुकड़े संशोधनों हम बना रहे हैं:

cherrypy/_cpserver.py 

@@ -55,7 +55,6 @@ instance = None ssl_certificate = None ssl_private_key 
= None 
+ ssl_ca_certificate = None nodelay = True 

def __init__(self): 

cherrypy/wsgiserver/__init__.py 

@@ -1480,6 +1480,7 @@ 
# Paths to certificate and private key files ssl_certificate = None ssl_private_key = None 
+ ssl_ca_certificate = None 

def __init__(self, bind_addr, wsgi_app, numthreads=10, server_name=None, max=-1, request_queue_size=5, timeout=10, shutdown_timeout=5): 

@@ -1619,7 +1620,9 @@ 

self.socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) if self.nodelay: self.socket.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1) 
-  if self.ssl_certificate and self.ssl_private_key: 
+  if self.ssl_certificate and self.ssl_private_key and \ 
+   self.ssl_ca_certificate: 
+ if SSL is None: raise ImportError("You must install pyOpenSSL to use HTTPS.") 

@@ -1627,6 +1630,11 @@ ctx = SSL.Context(SSL.SSLv23_METHOD) ctx.use_privatekey_file(self.ssl_private_key) ctx.use_certificate_file(self.ssl_certificate) 
+   x509 = crypto.load_certificate(crypto.FILETYPE_PEM, 
+    open(self.ssl_ca_certificate).read()) 
+   store = ctx.get_cert_store() 
+   store.add_cert(x509) 
+   ctx.set_verify(SSL.VERIFY_PEER | SSL.VERIFY_FAIL_IF_NO_PEER_CERT, lambda *x:True) self.socket = SSLConnection(ctx, self.socket) self.populate_ssl_environ() 

ऊपर पैच CherryPy सर्वर विन्यास, server.ssl_ca_certificate के अंदर एक नया विन्यास विकल्प की शामिल किए जाने की आवश्यकता है। यह विकल्प प्राधिकरण फ़ाइल को पहचानता है जो को कनेक्ट करने वाले प्राधिकरण फ़ाइल के विरुद्ध मान्य होगा, यदि क्लाइंट वैध क्लाइंट प्रमाण पत्र प्रस्तुत नहीं करता है तो यह तुरंत कनेक्शन बंद कर देगा।

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

सर्वोत्कृष्ट समाधान ग्राहक CherryPy सॉकेट से कनेक्ट और क्लाइंट प्रमाणपत्र आवेदन ढेर में ऊपर भेजने की अनुमति होगी।फिर कस्टम चेरीपी उपकरण एप्लिकेशन स्टैक के अंदर प्रमाण पत्र को मान्य करेगा और यदि आवश्यक हो तो कनेक्शन बंद करें; दुर्भाग्यवश चेरीपी के की संरचना के कारण pyOpenSSL कार्यान्वयन एप्लिकेशन के अंदर प्रमाण पत्र स्टैक पुनर्प्राप्त करना मुश्किल है।

बेशक उपरोक्त पैच केवल आपके जोखिम पर उपयोग किए जाने चाहिए। यदि आप बेहतर समाधान के साथ आते हैं तो कृपया हमें बताएं।

0

CherryPy के वर्तमान संस्करण क्लाइंट प्रमाणपत्र सत्यापन का समर्थन नहीं करता है, यह CherryPy कॉन्फ़िगर करने के लिए संभव है, 127.0.0.1:80 को सुनने HAProxy स्थापित करने के लिए 443 को सुनने और क्लाइंट साइड प्रमाण पत्र को सत्यापित करने और के लिए यातायात को अग्रेषित करने के लिए 127.0.0.1:80 हैप्रोक्सी सरल, हल्का, तेज़ और भरोसेमंद है। An example of HAProxy configuration

संबंधित मुद्दे