मैं वही चीज़ ढूंढ रहा हूं। मुझे पता है चेरीपी साइट पर कुछ पैच हैं।
मुझे निम्नलिखित 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 कार्यान्वयन एप्लिकेशन के अंदर प्रमाण पत्र स्टैक पुनर्प्राप्त करना मुश्किल है।
बेशक उपरोक्त पैच केवल आपके जोखिम पर उपयोग किए जाने चाहिए। यदि आप बेहतर समाधान के साथ आते हैं तो कृपया हमें बताएं।
अब https://bitbucket.org/cherrypy/cherrypy/issue/1001/adding-support-for-client-certificate पर – Pim