পাইথনের সাথে এসএসএল শংসাপত্রগুলি বৈধ করুন


85

আমাকে এমন একটি স্ক্রিপ্ট লিখতে হবে যা এইচটিটিপিএস-এর মাধ্যমে আমাদের কর্পোরেট ইন্ট্রানেটের কয়েকটি গুচ্ছ সাইটের সাথে সংযুক্ত এবং তাদের এসএসএল শংসাপত্রগুলি বৈধ কিনা তা যাচাই করে; এগুলির মেয়াদ শেষ নয়, সঠিক ঠিকানা ইত্যাদির জন্য জারি করা হয়েছে etc. ইত্যাদি We

পাইথন ডিফল্টরূপে এইচটিটিপিএস ব্যবহার করার সময় কেবল এসএসএল শংসাপত্র গ্রহণ করে এবং ব্যবহার করে, সুতরাং কোনও শংসাপত্র অবৈধ হলেও urllib2 এবং টুইস্টের মতো পাইথন লাইব্রেরি কেবল আনন্দের সাথে শংসাপত্রটি ব্যবহার করবে।

কোথাও কি কোনও ভাল গ্রন্থাগার রয়েছে যা আমাকে এইচটিটিপিএসের উপর দিয়ে কোনও সাইটের সাথে সংযুক্ত করতে এবং এর শংসাপত্রটি এভাবে এভাবে যাচাই করতে দেবে?

পাইথনে আমি কীভাবে একটি শংসাপত্র যাচাই করব?


10
ট্যুইস্টেড সম্পর্কে আপনার মন্তব্যটি ভুল: বাঁকাটি পাইথেনসেল ব্যবহার করে, পাইথনের অন্তর্নির্মিত এসএসএল সমর্থন নয়। যদিও এটি HTTP ক্লায়েন্টে এইচটিটিপিএস শংসাপত্রগুলি ডিফল্টরূপে বৈধতা দেয় না, আপনি বৈধকরণের প্রসঙ্গ কারখানাটি নির্মাণের জন্য পেইজ এবং ডাউনলোডপেজ পেতে "কনটেক্সটফ্যাক্টরি" যুক্তিটি ব্যবহার করতে পারেন। বিপরীতে, আমার জ্ঞানের বিপরীতে বিল্ট-ইন "এসএসএল" মডিউল শংসাপত্রের বৈধতা যাচাই করতে রাজি হতে পারে এমন কোনও উপায় নেই।
গ্লাইফ

4
পাইথন ২.6 এবং এর পরে SSL মডিউলটি দিয়ে আপনি নিজের শংসাপত্রের বৈধ প্রমাণক লিখতে পারেন write অনুকূল নয়, তবেযোগ্য।
হাইক্কি তোভোনেন

4
পরিস্থিতি পরিবর্তিত হয়েছে, পাইথন এখন ডিফল্টরূপে শংসাপত্রগুলি বৈধ করে। আমি নীচে একটি নতুন উত্তর যুক্ত করেছি।
ডাঃ জানু-ফিলিপ গেহর্কেকে

ট্যুইস্টের জন্যও পরিস্থিতি পরিবর্তিত হয়েছিল (পাইথনের ক্ষেত্রে কিছুটা আগে আসার আগে); আপনি যদি 14.0 সংস্করণ ব্যবহার করেন treqবা এটি twisted.web.client.Agentথেকে, বাঁকানো ডিফল্টরূপে শংসাপত্রগুলি যাচাই করে।
গ্লাইফ

উত্তর:


19

রিলিজ সংস্করণ 2.7.9 / 3.4.3 থেকে, পাইথন ডিফল্টরূপে শংসাপত্রের বৈধতা সম্পাদনের চেষ্টা করে।

এটি পিইপি 467 তে প্রস্তাবিত হয়েছে, যা পড়ার মতো: https://www.python.org/dev/peps/pep-0476/

পরিবর্তনগুলি সমস্ত প্রাসঙ্গিক stdlib মডিউলগুলিকে প্রভাবিত করে (urllib / urllib2, http, httplib)।

প্রাসঙ্গিক ডকুমেন্টেশন:

https://docs.python.org/2/library/httplib.html#httplib.HTTPS সংযোগ

এই শ্রেণিটি এখন ডিফল্টরূপে সমস্ত প্রয়োজনীয় শংসাপত্র এবং হোস্টনাম চেকগুলি সম্পাদন করে। পূর্ববর্তী, যাচাই করা হয়নি, আচরণ ssl._create_unverified_context () প্রসঙ্গের প্যারামিটারে যেতে পারে।

https://docs.python.org/3/library/http.client.html#http.client.HTTPS সংযোগ

সংস্করণ 3.4.3 এ পরিবর্তিত হয়েছে: এই শ্রেণীটি এখন ডিফল্টরূপে সমস্ত প্রয়োজনীয় শংসাপত্র এবং হোস্টনাম চেকগুলি সম্পাদন করে। পূর্ববর্তী, যাচাই করা হয়নি, আচরণ ssl._create_unverified_context () প্রসঙ্গের প্যারামিটারে যেতে পারে।

মনে রাখবেন যে নতুন অন্তর্নির্মিত যাচাই সিস্টেম-সরবরাহিত শংসাপত্রের ডাটাবেসের ভিত্তিতে । এর বিরোধিতা করে, অনুরোধ প্যাকেজটি তার নিজস্ব শংসাপত্রের বান্ডেলটি পাঠায়। পিইপি 476 এর ট্রাস্টি ডাটাবেস বিভাগে উভয় পদ্ধতির পেশাদার এবং কনসটি আলোচনা করা হয়েছে ।


পাইথনের আগের সংস্করণটির শংসাপত্রের যাচাইকরণের কোনও সমাধান? পাইথনের সংস্করণটি সর্বদা আপগ্রেড করা যায় না।
vaab

এটি প্রত্যাহার করা শংসাপত্রগুলি বৈধতা দেয় না। উদাহরণস্বরূপ revused.badssl.com
রাজ

HTTPSConnectionক্লাস ব্যবহার করা কি বাধ্যতামূলক ? আমি ব্যবহার করছিলাম SSLSocket। কিভাবে আমি এর সাথে বৈধতা করতে পারি SSLSocket? আমাকে এখানে বর্ণিত pyopensslহিসাবে স্পষ্টভাবে বৈধতা দিতে হবে ?
আনির

31

আমি পাইথন প্যাকেজ সূচীতে একটি বিতরণ যুক্ত করেছি যা match_hostname()পাইথনের sslপূর্ববর্তী সংস্করণগুলিতে পাইথন ৩.২ প্যাকেজটি থেকে ফাংশনটি উপলব্ধ করে।

http://pypi.python.org/pypi/backport.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:
    ...

4
আমি কিছু মিস করছি ... আপনি কি দয়া করে উপরের শূন্যস্থান পূরণ করতে পারেন বা একটি সম্পূর্ণ উদাহরণ প্রদান করতে পারেন (গুগলের মতো সাইটের জন্য)?
স্মোগলয়ে

গুগল অ্যাক্সেস করার জন্য আপনি কোন লাইব্রেরি ব্যবহার করছেন তার উপর নির্ভর করে উদাহরণটি পৃথক দেখাবে, যেহেতু বিভিন্ন পাঠাগারগুলি এসএসএল সকেটকে বিভিন্ন জায়গায় রাখে, এবং এটি এসএসএল সকেটকে তার getpeercert()পদ্ধতির প্রয়োজন হয় যাতে আউটপুটটি পাস হতে পারে match_hostname()
ব্র্যান্ডন রোডস

12
পাইথনের পক্ষে আমি বিব্রতবোধ করছি যে কাউকে এটি ব্যবহার করতে হবে। পাইথনের অন্তর্নির্মিত এসএসএল এইচটিপিপিএস লাইব্রেরিগুলি ডিফল্টরূপে বাক্সের বাইরে শংসাপত্রগুলি যাচাই না করে পুরোপুরি উন্মাদ এবং ফলস্বরূপ এখন সেখানে কতটা সুরক্ষিত সিস্টেম রয়েছে তা কল্পনা করা বেদনাদায়ক।
গ্লেন মেইনার্ড


26

শংসাপত্রগুলি যাচাই করতে আপনি ট্যুইস্টেড ব্যবহার করতে পারেন। প্রধান এপিআই হ'ল সার্টিফিকেটঅপশনস , যা শ্রুতি এসএসএল এবং স্টার্টটিএলএসেরcontextFactory মতো বিভিন্ন ক্রিয়াকলাপের পক্ষে যুক্তি হিসাবে সরবরাহ করা যেতে পারে ।

দুর্ভাগ্যক্রমে, পাইথন বা টুইস্ট উভয়ই সিএ শংসাপত্রের স্তূপের সাথে আসলে এইচটিটিপিএস যাচাইকরণের প্রয়োজন হয় না, বা এইচটিপিপিএস বৈধতা যুক্তিও দেয় না। পাইওপেনএসএল-এর সীমাবদ্ধতার কারণে এখনও এটি পুরোপুরি সঠিকভাবে করতে পারবেন না তবে প্রায় সমস্ত শংসাপত্রগুলিতে একটি বিষয় সাধারণ নাম অন্তর্ভুক্ত রয়েছে বলে আপনাকে ধন্যবাদ, আপনি যথেষ্ট পরিমাণে পেতে পারেন।

এখানে যাচাই করা ট্যুইস্টেড এইচটিটিপিএস ক্লায়েন্টের একটি নিখুঁত নমুনা বাস্তবায়ন যা ওয়াইল্ডকার্ড এবং সাবজেক্ট অল্টনেম এক্সটেনশানগুলি উপেক্ষা করে এবং বেশিরভাগ উবুন্টু বিতরণে 'সিএ-শংসাপত্র' প্যাকেজে উপস্থিত শংসাপত্র-কর্তৃপক্ষের শংসাপত্রগুলি ব্যবহার করে। আপনার প্রিয় বৈধ এবং অবৈধ শংসাপত্র সাইট :) দিয়ে এটি ব্যবহার করে দেখুন।

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()

আপনি কি এটিকে অবরুদ্ধ করতে পারবেন?
শান রিলে

ধন্যবাদ; আমার এখন একটি নোট আছে যা আমি এটি পড়েছি এবং বুঝতে পেরেছি: যাচাই করার সময় কলব্যাকগুলি সত্য হওয়া উচিত এবং যখন কোনও ত্রুটি নেই তখন মিথ্যা থাকে। আপনার কোডটি মূলত যখন সাধারণ নাম স্থানীয় হস্ট না হয় তখন একটি ত্রুটি প্রদান করে। আপনার ইচ্ছা কি এটি ছিল কিনা তা সম্পর্কে আমি নিশ্চিত নই, যদিও কিছু ক্ষেত্রে এটি করা বোধগম্য হবে। আমি কেবল অনুভব করেছি যে আমি এই উত্তরটির ভবিষ্যতের পাঠকদের সুবিধার জন্য এ সম্পর্কে একটি মন্তব্য করব।
এলি কোর্টরাইট

এই ক্ষেত্রে "সেলফ হস্টনাম" "লোকালহোস্ট" নয়; দ্রষ্টব্য URLPath(url).netloc: এর অর্থ URL টির হোস্ট অংশটি নিরাপদগেটে পাস হয়েছে। অন্য কথায়, এটি যাচাই করা হচ্ছে যে বিষয়টির সাধারণ নাম কলার দ্বারা অনুরোধ করা অনুরূপ।
গ্লাইফ

আমি এই পরীক্ষার কোডটির একটি সংস্করণ চালিয়ে যাচ্ছি এবং একটি পরীক্ষার এইচটিটিপিএস সার্ভারকে আঘাত করতে ফায়ারফক্স, উইজেট এবং ক্রোম ব্যবহার করেছি। যদিও আমার পরীক্ষাটি চলছে, আমি দেখছি যে প্রতিটি সংযোগে কলব্যাক যাচাইকরণের নামটি কল করা হচ্ছে 3-4 বার। কেন শুধু একবার চালানো হচ্ছে না?
থিমেস্ট্রো

4
URLPath (বাজে) .netloc হয় সবসময় স্থানীয় হোস্ট: URLPath .__ init__ পৃথক URL উপাদান লাগে, আপনি হিসাবে "স্কীম" একটি পুরো URL টি পার করছি এবং 'স্থানীয় হোস্ট' ডিফল্ট netloc এটি সঙ্গে যেতে পেয়ে। আপনি সম্ভবত ইউআরএলপ্যাথ.ফর্ম স্ট্রিং (ইউআরএল)। নেটলোক ব্যবহার করতে চেয়েছিলেন। দুর্ভাগ্যক্রমে এটি যাচাইকরণের চেকটি উদ্বোধন করেছে হোস্টনাম পিছনের দিকে: এটি প্রত্যাখ্যান করা শুরু করে https://www.google.com/কারণ বিষয়গুলির মধ্যে একটি 'www.google.com.com', যার ফলে ফাংশনটি মিথ্যা ফিরবে। এর অর্থ সম্ভবত নামগুলি মিললে সত্য (স্বীকৃত) ফিরিয়ে দেওয়া হয়, এবং যদি না হয় তবে মিথ্যা?
এমজেড

25

পাইক URL করে।

নীচে একটি সংক্ষিপ্ত উদাহরণ দেওয়া আছে। এটি 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()

আপনি সম্ভবত আরও বিকল্পগুলি কনফিগার করতে চাইবেন, যেমন ফলাফলগুলি কোথায় সঞ্চয় করতে হবে ইত্যাদি But তবে অ-প্রয়োজনীয়তার সাথে উদাহরণটি বিশৃঙ্খলা করার দরকার নেই।

কি ব্যতিক্রম উত্থাপিত হতে পারে উদাহরণ:

(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যুক্তিটি ব্যবহার করতে চান ।
পাওলো ইবারম্যান

4
অনুরোধগুলি ডিফল্টরূপে বৈধ হয়verifyআরও সুস্পষ্ট হওয়া বা যাচাইকরণ অক্ষম করা ছাড়া তর্কটি ব্যবহার করার দরকার নেই ।
ডাঃ জানু-ফিলিপ গেহর্কেকে

4
এটি কোনও অভ্যন্তরীণ মডিউল নয়। আপনার পাইপ ইনস্টল করার অনুরোধগুলি চালানো দরকার
রবার্ট টাউনলি

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()

@ টোনফা: ভাল ক্যাচ; আমি হোস্ট-নেম চেকিংও শেষ করেছি এবং আমি আমার ব্যবহার কোডটি অন্তর্ভুক্ত করার জন্য আমার উত্তরটি সম্পাদনা করেছি।
এলি কোর্টরাইট

আমি আসল লিঙ্কে পৌঁছাতে পারছি না (যেমন 'এই পৃষ্ঠা')। এটি সরানো হয়েছে?
ম্যাট বল

@ ম্যাট: আমার ধারণা, তবে এফডাব্লুআইডাব্লু মূল লিঙ্কটি প্রয়োজনীয় নয়, যেহেতু আমার পরীক্ষার প্রোগ্রামটি একটি সম্পূর্ণ, স্ব-অন্তর্ভুক্ত, কার্যকারী উদাহরণ। আমি পৃষ্ঠাটিতে লিঙ্ক করেছি যা এ কোডটি লিখতে আমাকে সহায়তা করেছিল যেহেতু এট্রিবিউশন সরবরাহ করার মতো শালীন জিনিস বলে মনে হচ্ছে। তবে যেহেতু এটির আর অস্তিত্ব নেই তাই আমি লিঙ্কটি সরাতে আমার পোস্টটি সম্পাদনা করব, এটি উল্লেখ করার জন্য ধন্যবাদ।
এলি কোর্টরাইট

ম্যানুয়াল সকেট সংযোগের কারণে প্রক্সি হ্যান্ডলারের মতো অতিরিক্ত হ্যান্ডলারের সাথে এটি কাজ করে না CertValidatingHTTPSConnection.connect। বিশদ (এবং একটি স্থির) জন্য এই টান অনুরোধ দেখুন ।
স্ক্লামার

4
এখানে একটি পরিষ্কার এবং কাজ সমাধান সহ backports.ssl_match_hostname
স্ক্লামার

8

এম 2 ক্রিপ্টো বৈধতা করতে পারে । আপনি চাইলে ট্যুইস্টেড সহ এম 2 ক্রিপ্টোও ব্যবহার করতে পারেন। চ্যান্ডলার ডেস্কটপ ক্লায়েন্টটি নেটওয়ার্কিংয়ের জন্য টুইস্টেড এবং এসএসএলের জন্য এম 2 ক্রাইপ্টো ব্যবহার করে শংসাপত্রের বৈধতা সহ।

গ্লিফস মন্তব্যের ভিত্তিতে মনে হয় এম-ক্রাইপ্টো বর্তমানে পাইপয়েনএসএসএল-এর সাথে আপনি যা করতে পারেন তার চেয়ে ডিফল্টরূপে আরও ভাল শংসাপত্র যাচাই করেন, কারণ এম 2 ক্রাইপ্টো সাবজেক্টআল্টনাম ফিল্ডও পরীক্ষা করে।

আমি পাইথন সহ মোজিলা ফায়ারফক্স জাহাজ এবং পাইথন এসএসএল সমাধানগুলির সাথে ব্যবহারের যোগ্য শংসাপত্রগুলি কীভাবে পেতে পারি সে সম্পর্কেও আমি ব্লগ করেছি ।


4

জাইথন ​​ডিফল্টরূপে শংসাপত্র যাচাই সম্পাদন করে, তাই স্ট্যান্ডার্ড লাইব্রেরী মডিউলগুলি ব্যবহার করে, যেমন, জাইথনের সাথে HTLib.HTTPSConnication, ইত্যাদি শংসাপত্রগুলি যাচাই করবে এবং ব্যর্থতার জন্য ব্যতিক্রমগুলি দেবে, অর্থাত্ মিলহীন পরিচয়, মেয়াদোত্তীর্ণ শংসাপত্র ইত্যাদি give

আসলে, সিপাইথনের মতো আচরণ করার জন্য জাইথন ​​পেতে আপনাকে কিছু অতিরিক্ত কাজ করতে হবে, অর্থাৎ শংসাপত্রগুলি যাচাই না করার জন্য জাইথন ​​পেতে হবে।

জাইথনে শংসাপত্র চেকিং কীভাবে অক্ষম করা যায় সে সম্পর্কে আমি একটি ব্লগ পোস্ট লিখেছি, কারণ এটি পর্যায়ক্রমে পরীক্ষার ক্ষেত্রে কার্যকর হতে পারে ইত্যাদি etc.

জাভা এবং জাইথনে একটি সর্ব-বিশ্বাসযোগ্য সুরক্ষা সরবরাহকারী ইনস্টল করা।
http://jython.xhaus.com/installing-an-all-trusting-security-provider-on-java-and-jython/


2

নিম্নলিখিত কোডটি আপনাকে সমস্ত এসএসএল বৈধতা যাচাই করে (যেমন তারিখের বৈধতা, সিএ শংসাপত্র শৃঙ্খলা ...) উপকার করতে দেয় প্লাগযোগ্যযোগ্য যাচাইকরণ পদক্ষেপ যেমন হোস্টনাম যাচাই করতে বা অন্য অতিরিক্ত শংসাপত্র যাচাইকরণের পদক্ষেপগুলি সম্পাদন করুন CE

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

পাইওপেনএসএল এল ওপেনএসএসএল লাইব্রেরির একটি ইন্টারফেস। এটি আপনার প্রয়োজনীয় সমস্ত সরবরাহ করা উচিত।


ওপেনএসএসএল হোস্টনেম মিলছে না। এটি ওপেনএসএসএল 1.1.0 এর জন্য পরিকল্পনা করা হয়েছে।
jwww

-1

আমার একই সমস্যা ছিল তবে তৃতীয় পক্ষের নির্ভরতা হ্রাস করতে চেয়েছিলাম (কারণ এই এক-অফ স্ক্রিপ্টটি অনেক ব্যবহারকারী দ্বারা চালিত করা উচিত)। আমার সমাধানটি ছিল একটি curlকল মোড়ানো এবং প্রস্থান কোডটি ছিল তা নিশ্চিত করা 0। কবজির মতো কাজ করেছেন।


আমি বলব স্ট্যাকওভারফ্লো. com/a/1921551/1228491 পাইকারল ব্যবহার করা তখনকার চেয়ে আরও ভাল সমাধান।
মারিয়ান 21
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.