पायथन के साथ एसएसएल प्रमाणपत्र सत्यापित करें


85

मुझे एक स्क्रिप्ट लिखने की ज़रूरत है जो HTTPS पर हमारे कॉर्पोरेट इंट्रानेट पर साइटों के एक समूह से जुड़ती है और सत्यापित करती है कि उनके एसएसएल प्रमाणपत्र मान्य हैं; वे समाप्त नहीं हुए हैं, कि वे सही पते के लिए जारी किए गए हैं, आदि। हम इन साइटों के लिए अपने स्वयं के आंतरिक कॉर्पोरेट प्रमाणपत्र प्राधिकरण का उपयोग करते हैं, इसलिए हमारे पास प्रमाण पत्र सत्यापित करने के लिए सीए की सार्वजनिक कुंजी है।

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

क्या कहीं एक अच्छी लाइब्रेरी है जो मुझे HTTPS से अधिक साइट से कनेक्ट करने और इस तरह से इसके प्रमाण पत्र को सत्यापित करने देगी?

मैं पायथन में एक प्रमाण पत्र कैसे सत्यापित करूं?


10
Twisted के बारे में आपकी टिप्पणी गलत है: Twisted pyopenssl का उपयोग करता है, न कि Python के अंतर्निहित SSL समर्थन का। हालांकि यह अपने HTTP क्लाइंट में HTTPS सर्टिफिकेट को डिफ़ॉल्ट रूप से मान्य नहीं करता है, आप एक मान्य संदर्भ फैक्ट्री का निर्माण करने के लिए getPage और डाउनलोडपेज के लिए "ReferenceFactory" तर्क का उपयोग कर सकते हैं। इसके विपरीत, मेरे ज्ञान के लिए कोई तरीका नहीं है कि अंतर्निहित "एसएसएल" मॉड्यूल को प्रमाणपत्र सत्यापन करने के लिए आश्वस्त किया जा सके।
ग्लिफ

4
Python 2.6 और बाद में SSL मॉड्यूल के साथ, आप अपना स्वयं का प्रमाणपत्र सत्यापनकर्ता लिख ​​सकते हैं। इष्टतम नहीं है, लेकिन उल्लेखनीय है।
हेइकी टिवोनेन सेप

3
स्थिति बदल गई है, अब डिफ़ॉल्ट रूप से पायथन प्रमाणपत्रों को मान्य करता है। मैंने नीचे एक नया उत्तर जोड़ा है।
डॉ। जन-फिलिप गेर्के 15

स्थिति भी मुड़ के लिए बदल गई (कुछ हद तक इससे पहले कि यह पायथन के लिए किया था, वास्तव में); यदि आप 14.0 संस्करण का उपयोग करते हैं treqया करते हैं twisted.web.client.Agent, तो डिफ़ॉल्ट रूप से मुड़ता हुआ प्रमाणपत्र सत्यापित करता है।
ग्लिफ़

जवाबों:


19

रिलीज़ संस्करण 2.7.9 / 3.4.3 से, प्रमाण पत्र सत्यापन करने के लिए डिफ़ॉल्ट प्रयासों द्वारा पायथन ।

यह PEP 467 में प्रस्तावित किया गया है, जो पढ़ने लायक है: https://www.python.org/dev/peps/pep-0476/

परिवर्तन सभी प्रासंगिक stdlib मॉड्यूल (urllib / urllib2, http, रिशप्लिब) को प्रभावित करते हैं।

प्रासंगिक दस्तावेज:

https://docs.python.org/2/library/httplib.html#httplib.HTTPSConnection

यह वर्ग अब डिफ़ॉल्ट रूप से सभी आवश्यक प्रमाणपत्र और होस्टनाम चेक करता है। पिछले, असत्यापित, व्यवहार ssl._create_unverified_context () के संदर्भ में वापस करने के लिए संदर्भ पैरामीटर में पारित किया जा सकता है।

https://docs.python.org/3/library/http.client.html#http.client.HTTPSConnection

संस्करण 3.4.3 में परिवर्तित: यह वर्ग अब डिफ़ॉल्ट रूप से सभी आवश्यक प्रमाणपत्र और होस्टनाम चेक करता है। पिछले, असत्यापित, व्यवहार ssl._create_unverified_context () के संदर्भ में वापस करने के लिए संदर्भ पैरामीटर में पारित किया जा सकता है।

ध्यान दें कि नया बिल्ट-इन सत्यापन सिस्टम-प्रदत्त प्रमाणपत्र डेटाबेस पर आधारित है। उस के विरोध में, अनुरोध पैकेज अपने स्वयं के प्रमाणपत्र बंडल को जहाज करता है। पीईपी 476 के ट्रस्ट डेटाबेस अनुभाग में दोनों दृष्टिकोणों के पेशेवरों और विपक्षों पर चर्चा की गई है ।


अजगर के पिछले संस्करण के लिए प्रमाणपत्र के सत्यापन को सुनिश्चित करने के लिए कोई समाधान? एक हमेशा अजगर के संस्करण को अपग्रेड नहीं कर सकता है।
vabab

यह निरस्त प्रमाण पत्रों को मान्य नहीं करता है। Eg Revoked.badssl.com
Raz

क्या HTTPSConnectionकक्षा का उपयोग करना अनिवार्य है ? मैं उपयोग कर रहा था SSLSocket। मैं सत्यापन कैसे कर सकता / सकती हूं SSLSocket? क्या मुझे यहाँpyopenssl बताए अनुसार स्पष्ट रूप से मान्य होना चाहिए ?
अनिर

31

मैंने पायथन पैकेज इंडेक्स में एक वितरण जोड़ा है जो match_hostname()पायथन के sslपिछले संस्करणों पर उपलब्ध पायथन 3.2 पैकेज से कार्य करता है ।

http://pypi.python.org/pypi/backports.ssl_match_hostname/

आप इसे स्थापित कर सकते हैं:

pip install backports.ssl_match_hostname

या आप इसे अपनी परियोजना में सूचीबद्ध एक निर्भरता बना सकते हैं setup.py। किसी भी तरह से, यह इस तरह से इस्तेमाल किया जा सकता है:

from backports.ssl_match_hostname import match_hostname, CertificateError
...
sslsock = ssl.wrap_socket(sock, ssl_version=ssl.PROTOCOL_SSLv3,
                      cert_reqs=ssl.CERT_REQUIRED, ca_certs=...)
try:
    match_hostname(sslsock.getpeercert(), hostname)
except CertificateError, ce:
    ...

1
मुझे कुछ याद आ रहा है ... क्या आप कृपया ऊपर के रिक्त स्थान को भर सकते हैं या एक पूर्ण उदाहरण (Google जैसी साइट के लिए) प्रदान कर सकते हैं?
स्मोहलोए

उदाहरण अलग-अलग दिखाई देगा, जिसके आधार पर आप Google का उपयोग करने के लिए किस लाइब्रेरी का उपयोग कर रहे हैं, क्योंकि अलग-अलग पुस्तकालयों ने एसएसएल सॉकेट को अलग-अलग स्थानों पर रखा है, और यह एसएसएल सॉकेट है getpeercert()जिसे इसकी विधि की आवश्यकता है, ताकि आउटपुट को पास किया जा सके match_hostname()
ब्रैंडन रोड्स

12
मैं पायथन की ओर से शर्मिंदा हूं कि किसी को भी इसका उपयोग करना है। Python का बिल्ट इन SSL HTTPS लाइब्रेरी डिफॉल्ट रूप से बॉक्स से सर्टिफिकेट की पुष्टि नहीं करता है, यह पूरी तरह से पागलपन है, और यह कल्पना करना दर्दनाक है कि परिणामस्वरूप अब कितने असुरक्षित सिस्टम बाहर हैं।
ग्लेन मेनार्ड


26

प्रमाणपत्रों को सत्यापित करने के लिए आप ट्विस्टेड का उपयोग कर सकते हैं। मुख्य एपीआई सर्टिफिकेट है , जो contextFactoryविभिन्न कार्यों जैसे कि एचएसएसएल और स्टार्टटएलएस के तर्क के रूप में प्रदान किया जा सकता है ।

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

यहां एक सत्यापित ट्विस्ट HTTPS क्लाइंट का एक भोले नमूने का कार्यान्वयन है जो वाइल्डकार्ड और विषय-वस्तु एक्सटेंशन की उपेक्षा करता है, और अधिकांश उबंटू वितरण में 'ca- सर्टिफिकेट' पैकेज में मौजूद प्रमाणपत्र-प्राधिकरण प्रमाणपत्र का उपयोग करता है। अपने पसंदीदा मान्य और अमान्य प्रमाणपत्र साइटों के साथ इसे आज़माएँ :)।

import os
import glob
from OpenSSL.SSL import Context, TLSv1_METHOD, VERIFY_PEER, VERIFY_FAIL_IF_NO_PEER_CERT, OP_NO_SSLv2
from OpenSSL.crypto import load_certificate, FILETYPE_PEM
from twisted.python.urlpath import URLPath
from twisted.internet.ssl import ContextFactory
from twisted.internet import reactor
from twisted.web.client import getPage
certificateAuthorityMap = {}
for certFileName in glob.glob("/etc/ssl/certs/*.pem"):
    # There might be some dead symlinks in there, so let's make sure it's real.
    if os.path.exists(certFileName):
        data = open(certFileName).read()
        x509 = load_certificate(FILETYPE_PEM, data)
        digest = x509.digest('sha1')
        # Now, de-duplicate in case the same cert has multiple names.
        certificateAuthorityMap[digest] = x509
class HTTPSVerifyingContextFactory(ContextFactory):
    def __init__(self, hostname):
        self.hostname = hostname
    isClient = True
    def getContext(self):
        ctx = Context(TLSv1_METHOD)
        store = ctx.get_cert_store()
        for value in certificateAuthorityMap.values():
            store.add_cert(value)
        ctx.set_verify(VERIFY_PEER | VERIFY_FAIL_IF_NO_PEER_CERT, self.verifyHostname)
        ctx.set_options(OP_NO_SSLv2)
        return ctx
    def verifyHostname(self, connection, x509, errno, depth, preverifyOK):
        if preverifyOK:
            if self.hostname != x509.get_subject().commonName:
                return False
        return preverifyOK
def secureGet(url):
    return getPage(url, HTTPSVerifyingContextFactory(URLPath.fromString(url).netloc))
def done(result):
    print 'Done!', len(result)
secureGet("https://google.com/").addCallback(done)
reactor.run()

क्या आप इसे गैर-अवरुद्ध कर सकते हैं?
सीन रिले

धन्यवाद; मेरे पास अब एक नोट है कि मैंने इसे पढ़ा है और इसे समझा है: कॉलबैक सत्यापित करें कि जब कोई त्रुटि नहीं होती है और तब गलत होता है जब वहाँ है। आपका कोड मूल रूप से एक त्रुटि देता है जब सामान्य नाम लोकलहोस्ट नहीं होता है। मुझे यकीन नहीं है कि क्या आप का इरादा है, हालांकि यह कुछ मामलों में ऐसा करने के लिए समझ में आता है। मुझे लगा कि मैं इस उत्तर के भविष्य के पाठकों के लिए इसके बारे में एक टिप्पणी छोड़ दूंगा।
एली कोर्टराइट

उस मामले में "self.hostname" "लोकलहोस्ट" नहीं है; ध्यान दें URLPath(url).netloc: इसका मतलब है कि URL का होस्ट हिस्सा सिक्योरगेट में पास हुआ है। दूसरे शब्दों में, यह जाँच कर रहा है कि विषय का सामान्य नाम वही है जो कॉलर द्वारा अनुरोध किया जा रहा है।
ग्लिफ

मैं इस परीक्षण कोड का एक संस्करण चला रहा हूं और एक परीक्षण HTTPS सर्वर को हिट करने के लिए Firefox, wget और Chrome का उपयोग किया है। हालांकि मेरे परीक्षण में, मैं देख रहा हूं कि कॉलबैक वेरिफोस्टनेम को हर कनेक्शन से 3-4 गुना कहा जा रहा है। यह सिर्फ एक बार क्यों नहीं चल रहा है?
थीमेस्ट्रो

2
URLPath (blah) .netloc है हमेशा स्थानीय होस्ट: URLPath .__ init__ व्यक्ति यूआरएल घटकों लेता है, आप के रूप में "योजना" एक पूरे यूआरएल गुजर रहे हैं और 'स्थानीय होस्ट' का डिफ़ॉल्ट netloc इसके साथ जाने के लिए हो रही है। आप शायद URLPath.fromString (url) .netloc का उपयोग करने के लिए थे। दुर्भाग्य से यह पुष्टि करता है कि VerHostName में चेक पीछे की ओर है: यह अस्वीकार करना शुरू कर देता है https://www.google.com/क्योंकि विषयों में से एक 'www.google.com' है, जिससे फ़ंक्शन गलत हो जाता है। यह शायद नाम वापस करने के लिए सही (स्वीकृत) लौटने का मतलब है, और यदि वे नहीं करते हैं तो गलत है?
मेज़

25

PycURL यह खूबसूरती से करता है।

नीचे एक छोटा उदाहरण है। pycurl.errorअगर कुछ गड़बड़ है, तो आप इसे फेंक देंगे , जहां आपको त्रुटि कोड और एक मानव पठनीय संदेश के साथ एक ट्यूपल मिलता है।

import pycurl

curl = pycurl.Curl()
curl.setopt(pycurl.CAINFO, "myFineCA.crt")
curl.setopt(pycurl.SSL_VERIFYPEER, 1)
curl.setopt(pycurl.SSL_VERIFYHOST, 2)
curl.setopt(pycurl.URL, "https://internal.stuff/")

curl.perform()

आप शायद अधिक विकल्पों को कॉन्फ़िगर करना चाहते हैं, जैसे कि परिणाम कहां संग्रहीत करें, आदि। लेकिन गैर-आवश्यक के साथ उदाहरण को अव्यवस्थित करने की आवश्यकता नहीं है।

क्या अपवाद उठाए जा सकते हैं इसका उदाहरण:

(60, 'Peer certificate cannot be authenticated with known CA certificates')
(51, "common name 'CN=something.else.stuff,O=Example Corp,C=SE' does not match 'internal.stuff'")

कुछ लिंक जो मुझे उपयोगी लगे, वे सेटटॉप और गेटइनफो के लिए लिबासर्ल-डॉक्स हैं।


15

या बस अनुरोध पुस्तकालय का उपयोग करके अपने जीवन को आसान बनाएं :

import requests
requests.get('https://somesite.com', cert='/path/server.crt', verify=True)

इसके उपयोग के बारे में कुछ और शब्द।


10
certतर्क ग्राहक के पक्ष प्रमाण पत्र, नहीं के खिलाफ जांच करने के लिए एक सर्वर प्रमाणपत्र है। आप verifyतर्क का उपयोग करना चाहते हैं ।
पाओलो एबरमन

2
अनुरोध डिफ़ॉल्ट रूप से मान्य होता हैverifyअधिक स्पष्ट या अक्षम सत्यापन को छोड़कर, तर्क का उपयोग करने की आवश्यकता नहीं है ।
डॉ। जन-फिलिप गेहरके

1
यह एक आंतरिक मॉड्यूल नहीं है। आपको पाइप स्थापित अनुरोधों को चलाने की आवश्यकता है
रॉबर्ट टाउनले

14

यहां एक उदाहरण स्क्रिप्ट दी गई है जो प्रमाणपत्र सत्यापन प्रदर्शित करती है:

import httplib
import re
import socket
import sys
import urllib2
import ssl

class InvalidCertificateException(httplib.HTTPException, urllib2.URLError):
    def __init__(self, host, cert, reason):
        httplib.HTTPException.__init__(self)
        self.host = host
        self.cert = cert
        self.reason = reason

    def __str__(self):
        return ('Host %s returned an invalid certificate (%s) %s\n' %
                (self.host, self.reason, self.cert))

class CertValidatingHTTPSConnection(httplib.HTTPConnection):
    default_port = httplib.HTTPS_PORT

    def __init__(self, host, port=None, key_file=None, cert_file=None,
                             ca_certs=None, strict=None, **kwargs):
        httplib.HTTPConnection.__init__(self, host, port, strict, **kwargs)
        self.key_file = key_file
        self.cert_file = cert_file
        self.ca_certs = ca_certs
        if self.ca_certs:
            self.cert_reqs = ssl.CERT_REQUIRED
        else:
            self.cert_reqs = ssl.CERT_NONE

    def _GetValidHostsForCert(self, cert):
        if 'subjectAltName' in cert:
            return [x[1] for x in cert['subjectAltName']
                         if x[0].lower() == 'dns']
        else:
            return [x[0][1] for x in cert['subject']
                            if x[0][0].lower() == 'commonname']

    def _ValidateCertificateHostname(self, cert, hostname):
        hosts = self._GetValidHostsForCert(cert)
        for host in hosts:
            host_re = host.replace('.', '\.').replace('*', '[^.]*')
            if re.search('^%s$' % (host_re,), hostname, re.I):
                return True
        return False

    def connect(self):
        sock = socket.create_connection((self.host, self.port))
        self.sock = ssl.wrap_socket(sock, keyfile=self.key_file,
                                          certfile=self.cert_file,
                                          cert_reqs=self.cert_reqs,
                                          ca_certs=self.ca_certs)
        if self.cert_reqs & ssl.CERT_REQUIRED:
            cert = self.sock.getpeercert()
            hostname = self.host.split(':', 0)[0]
            if not self._ValidateCertificateHostname(cert, hostname):
                raise InvalidCertificateException(hostname, cert,
                                                  'hostname mismatch')


class VerifiedHTTPSHandler(urllib2.HTTPSHandler):
    def __init__(self, **kwargs):
        urllib2.AbstractHTTPHandler.__init__(self)
        self._connection_args = kwargs

    def https_open(self, req):
        def http_class_wrapper(host, **kwargs):
            full_kwargs = dict(self._connection_args)
            full_kwargs.update(kwargs)
            return CertValidatingHTTPSConnection(host, **full_kwargs)

        try:
            return self.do_open(http_class_wrapper, req)
        except urllib2.URLError, e:
            if type(e.reason) == ssl.SSLError and e.reason.args[0] == 1:
                raise InvalidCertificateException(req.host, '',
                                                  e.reason.args[1])
            raise

    https_request = urllib2.HTTPSHandler.do_request_

if __name__ == "__main__":
    if len(sys.argv) != 3:
        print "usage: python %s CA_CERT URL" % sys.argv[0]
        exit(2)

    handler = VerifiedHTTPSHandler(ca_certs = sys.argv[1])
    opener = urllib2.build_opener(handler)
    print opener.open(sys.argv[2]).read()

@tonfa: अच्छी पकड़; मैंने होस्टनाम चेकिंग को भी जोड़ा है, और मैंने अपना उत्तर उस कोड को शामिल करने के लिए संपादित किया है जिसका मैंने उपयोग किया था।
एली कोर्टराइट

मैं मूल लिंक (यानी 'इस पृष्ठ') तक नहीं पहुँच सकता। क्या यह स्थानांतरित हो गया है?
मैट बॉल

@Matt: मुझे ऐसा लगता है, लेकिन FWIW मूल लिंक आवश्यक नहीं है, क्योंकि मेरा परीक्षण कार्यक्रम एक पूर्ण, आत्म-निहित, काम करने का उदाहरण है। मैं उस पृष्ठ से जुड़ा हुआ था जिसने मुझे उस कोड को लिखने में मदद की थी क्योंकि यह एट्रिब्यूशन प्रदान करने के लिए सभ्य चीज़ की तरह लग रहा था। लेकिन चूंकि यह अब मौजूद नहीं है, इसलिए मैं इस लिंक को हटाने के लिए अपने पोस्ट को संपादित करूंगा, इस बात को इंगित करने के लिए धन्यवाद।
एली कोर्टराइट 14

मैनुअल सॉकेट कनेक्शन के कारण प्रॉक्सी हैंडलर जैसे अतिरिक्त हैंडलर के साथ यह काम नहीं करता है CertValidatingHTTPSConnection.connect। देखें इस पुल अनुरोध जानकारी के लिए (और एक ठीक)।
श्लमर

2
यहाँ एक साफ और साथ काम कर समाधान है backports.ssl_match_hostname
शलमर

8

M2Crypto सत्यापन कर सकते हैं । आप चाहें तो ट्विस्टेड के साथ M2Crypto का भी इस्तेमाल कर सकते हैं। चांडलर डेस्कटॉप क्लाइंट नेटवर्किंग के लिए ट्विस्टेड और SSL के लिए M2Crypto का उपयोग करता है , जिसमें प्रमाणपत्र सत्यापन शामिल है।

ग्लिफ़्स टिप्पणी के आधार पर ऐसा लगता है कि M2Crypto वर्तमान में pyOpenSSL के साथ जो कुछ भी कर सकता है, उसकी तुलना में डिफ़ॉल्ट रूप से बेहतर प्रमाणपत्र सत्यापन करता है, क्योंकि M2Crypto subjectAltName फ़ील्ड की भी जाँच करता है।

मैंने यह भी ब्लॉग किया है कि पायथन में मोज़िला फ़ायरफ़ॉक्स जहाजों के प्रमाण पत्र कैसे प्राप्त करें और पायथन एसएसएल समाधानों के साथ प्रयोग करने योग्य हैं।


4

Jython DOES डिफ़ॉल्ट रूप से प्रमाणपत्र सत्यापन करता है, इसलिए मानक पुस्तकालय मॉड्यूल का उपयोग करता है, उदाहरण के लिए CANplib.HTTPSConnection, आदि, के साथ jython प्रमाणपत्रों को सत्यापित करेगा और विफलताओं के लिए अपवाद देगा, अर्थात बेमेल पहचान, समाप्त हो चुके सिरे आदि।

वास्तव में, आपको अजगर को बर्ताव करने के लिए कुछ अतिरिक्त काम करना होगा, जैसे कि खट्टेपन की तरह व्यवहार करना, यानी कि जेरॉन को सत्यापित नहीं करना।

मैंने jython पर प्रमाणपत्र जाँच को अक्षम करने के तरीके पर एक ब्लॉग पोस्ट लिखी है, क्योंकि यह चरणों के परीक्षण में उपयोगी हो सकता है, आदि।

Java और jython पर एक सर्व-विश्वसनीय सुरक्षा प्रदाता स्थापित करना।
http://jython.xhaus.com/installing-an-all-trusting-security-provider-on-java-and-jython/


2

निम्न कोड आपको सभी SSL सत्यापन जांचों (जैसे दिनांक वैधता, CA प्रमाणपत्र श्रृंखला ...) से लाभान्वित करने की अनुमति देता है, जैसे कि होस्टनाम को सत्यापित करने या अन्य अतिरिक्त प्रमाणपत्र सत्यापन चरणों को करने के लिए प्लग-इन सत्यापन चरण की जाँच करें।

from httplib import HTTPSConnection
import ssl


def create_custom_HTTPSConnection(host):

    def verify_cert(cert, host):
        # Write your code here
        # You can certainly base yourself on ssl.match_hostname
        # Raise ssl.CertificateError if verification fails
        print 'Host:', host
        print 'Peer cert:', cert

    class CustomHTTPSConnection(HTTPSConnection, object):
        def connect(self):
            super(CustomHTTPSConnection, self).connect()
            cert = self.sock.getpeercert()
            verify_cert(cert, host)

    context = ssl.create_default_context()
    context.check_hostname = False
    return CustomHTTPSConnection(host=host, context=context)


if __name__ == '__main__':
    # try expired.badssl.com or self-signed.badssl.com !
    conn = create_custom_HTTPSConnection('badssl.com')
    conn.request('GET', '/')
    conn.getresponse().read()

-1

pyOpenSSL OpenSSL लाइब्रेरी का एक इंटरफ़ेस है। इसमें आपको वह सब कुछ प्रदान करना चाहिए जो आपको चाहिए।


ओपनएसएसएल होस्टनाम मिलान का प्रदर्शन नहीं करता है। ओपनएसएसएल 1.1.0 के लिए इसकी योजना बनाई गई है।
jww

-1

मुझे वही समस्या हो रही थी लेकिन मैं 3 पार्टी निर्भरता को कम करना चाहता था (क्योंकि इस एक-बंद स्क्रिप्ट को कई उपयोगकर्ताओं द्वारा निष्पादित किया जाना था)। मेरा समाधान curlकॉल को लपेटना और यह सुनिश्चित करना था कि निकास कोड था 0। एक जादू की तरह काम किया।


मैं कहूंगा कि stackoverflow.com/a/1921551/1228491 pycurl का उपयोग करना एक बेहतर समाधान है।
मैरियन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.