এসএসএল করার সময় কীভাবে শংসাপত্রের চেক উপেক্ষা করবেন


132

এইচটিটিপিএস সংস্থার অনুরোধ করার সময় আমি শংসাপত্রের চেক উপেক্ষা করার কোনও উপায় অনুসন্ধান করার চেষ্টা করছি, এখন পর্যন্ত আমি ইন্টারনেটে কিছু সহায়ক নিবন্ধ পেয়েছি।

তবে আমার এখনও কিছু সমস্যা আছে। আমার কোড পর্যালোচনা করুন। ServicePointManager.ServerCertificateValidationCallbackকোডটির অর্থ কী তা আমি বুঝতে পারি না ।

এই প্রতিনিধি পদ্ধতিটি কখন ডাকা হবে? এবং আরও একটি প্রশ্ন, আমি এই কোডটি কোন জায়গায় লিখব? ServicePointManager.ServerCertificateValidationCallbackমৃত্যুদণ্ড কার্যকর করার আগে নাকি আগে Stream stream = request.GetRequestStream()?

public HttpWebRequest GetRequest()
{
    CookieContainer cookieContainer = new CookieContainer();

    // Create a request to the server
    HttpWebRequest request = (HttpWebRequest)WebRequest.Create(_remoteUrl);

    #region Set request parameters

    request.Method = _context.Request.HttpMethod;
    request.UserAgent = _context.Request.UserAgent;
    request.KeepAlive = true;
    request.CookieContainer = cookieContainer;
    request.PreAuthenticate = true;
    request.AllowAutoRedirect = false;

    #endregion

    // For POST, write the post data extracted from the incoming request
    if (request.Method == "POST")
    {
        Stream clientStream = _context.Request.InputStream;
        request.ContentType = _context.Request.ContentType;
        request.ContentLength = clientStream.Length;

        ServicePointManager.ServerCertificateValidationCallback = delegate(
            Object obj, X509Certificate certificate, X509Chain chain, 
            SslPolicyErrors errors)
            {
                return (true);
            };

            Stream stream = request.GetRequestStream();

            ....
        }

        ....

        return request;
    }
}   

উত্তর:


67

যেহেতু কেবলমাত্র একটি বিশ্বব্যাপী সার্ভিসপয়েন্ট ম্যানেজার রয়েছে , তাই সার্ভিসপয়েন্ট ম্যানেজার.সভার সার্ভার্টিফিটভিডেশন ক্যালব্যাক সেট করে ফলস্বরূপ ফলিত হবে যে পরবর্তী সমস্ত অনুরোধগুলি এই নীতিটির উত্তরাধিকারী হবে। যেহেতু এটি একটি গ্লোবাল "সেটিং" তাই এটি এটিকে অ্যাপ্লিকেশন_সার্ট পদ্ধতিতে গ্লোবাল.এক্সে সেট করা পছন্দ করা হবে ।

কলব্যাক সেট করা ডিফল্ট আচরণকে ওভাররাইড করে এবং আপনি নিজেই একটি কাস্টম বৈধকরণ রুটিন তৈরি করতে পারেন।


গ্লোবাল.এক্স্যাক্স নেই এমন ক্লায়েন্টের কী হবে? আমি একটি হ্যান্ডহেল্ড ডিভাইস থেকে স্থানীয় নেটওয়ার্কে চলমান একটি REST পরিষেবা কল করছি।
বি ক্লে শ্যানন

3
প্রশ্ন নির্দিষ্ট HttpWebRequest। আপনি যদি অন্য কোনও উপায় ব্যবহার করে থাকেন তবে কীভাবে এটি সম্পাদন করতে হয় তা আপনাকে ডকুমেন্টেশনে দেখতে হবে।
সানি সিং হুত্তুনেন

আমি ওয়েবআরকোয়েস্ট ব্যবহার করছি, যা HTTPWebRequest এ কাস্ট হয়ে যায়, যেমন: ((HTTPWebRequest) অনুরোধ) .একসিপ = কনটেন্ট টাইপ;
বি ক্লে শ্যানন

আমার উত্তরে বলা হয়েছে: গ্লোবাল.এক্স্যাক্সে এটি সেট করা প্রিফার্ড করা দরকার not এমনকি আপনি এটি আরএসটি পরিষেবাতে কল করার আগে সেট করতে পারেন।
সানি সিং হুত্তুনেন

3
সম্ভাব্য সমাধানের জন্য এই লিঙ্কটি দেখুন See
সানি সিং হুত্তুনেন

174

প্রতি অনুরোধের ভিত্তিতে এই সমাধানটি প্রয়োগ করতে আগ্রহী প্রত্যেকের জন্য, এটি একটি বিকল্প এবং লাম্বদা এক্সপ্রেশনটি ব্যবহার করে। একই লাম্বদা এক্সপ্রেশনটি બ્લેক 3 আর দ্বারা উল্লিখিত গ্লোবাল ফিল্টারেও প্রয়োগ করা যেতে পারে। এই পদ্ধতিতে .NET 4.5 প্রয়োজন বলে মনে হচ্ছে।

String url = "https://www.stackoverflow.com";
HttpWebRequest request = HttpWebRequest.CreateHttp(url);
request.ServerCertificateValidationCallback += (sender, certificate, chain, sslPolicyErrors) => true;

.NET 4.0-তে, ল্যাম্বডা এক্সপ্রেশনটি গ্লোবাল ফিল্টারটিতে প্রয়োগ করা যেতে পারে

ServicePointManager.ServerCertificateValidationCallback += (sender, certificate, chain, sslPolicyErrors) => true;

2
FtpWebRequest জন্য প্রতি অনুরোধ সমাধান আছে?
টিমো

এটি আমার 4.0
নচট

আমি মনে করি এটি 'গ্লোবাল' বৈকল্পের একদম সুন্দর সমাধান, যদিও আপনি এটি কেন চান তা অবশ্যই আমি বুঝতে পারি। ব্যক্তিগতভাবে আমি একটি অনুরোধ কারখানার পক্ষে, যা এরপরে এই বৈধতা কলব্যাক পরিচালনা করে। ধন্যবাদ আদম, চমৎকার সমাধান।
সিনেটর

2
trueবিকাশের সময় পরীক্ষা-নিরীক্ষা করার সময় ফিরে আসা এমন কিছু যা আপনি করতে পারেন তবে তা অনিরাপদ। এটি শর্তযুক্ত হওয়া উচিত।
ফ্রেড

1
ব্যবহার (HttpWebRequest)WebRequest.Create(url)করা পুরোপুরি বৈধ, তবে আমার বাক্সে HttpWebRequest.Create(url)এখনও একটি প্রকল্প লক্ষ্যমাত্রায় বিদ্যমান। নেট 4.6.2। শেফের পছন্দ, তবে এই মুহুর্তে HttpClientসম্ভবত ব্যবহার করা আরও ভাল API।
অ্যাডাম ভেনিজিয়া

53

এটি আমার পক্ষে কাজ করেছে:

System.Net.ServicePointManager.ServerCertificateValidationCallback +=
delegate(object sender, System.Security.Cryptography.X509Certificates.X509Certificate certificate,
                        System.Security.Cryptography.X509Certificates.X509Chain chain,
                        System.Net.Security.SslPolicyErrors sslPolicyErrors)
    {
        return true; // **** Always accept
    };

স্নিপেটটি এখান থেকে: http://www.west-wind.com/weblog/posts/2011/Feb/11/HttpWebRequest-and- Ignoring-SSL- সার্টিফিকেট- ত্রুটি


17
সার্ভিসপয়েন্ট ম্যানেজ.সর্ভারসিটিফটিভালিডেশনক্যালব্যাক + = (প্রেরক, শংসাপত্র, শৃঙ্খলা, এসএসএলপলিসিরিফারস) => সত্য;
ডেভিড রুটগোস

3
সর্বদা সত্য প্রত্যাবর্তন অনিরাপদ। এটি শর্তাধীন সত্য ফিরে উচিত।
ফ্রেড

এটি প্রতি-প্রক্রিয়া, তাই এটি নিরাপদ নয়।
মিখাইল অরলভ

25

এছাড়াও সংক্ষিপ্ত প্রতিনিধি সমাধান রয়েছে:

ServicePointManager.ServerCertificateValidationCallback = delegate { return true; }; 

3
সর্বদা ফিরে আসা trueঅনিরাপদ।
ফ্রেড

7
হ্যাঁ, সবসময় সমস্ত এসএসএল শংসাপত্রের উপর নির্ভর করে সংজ্ঞা দ্বারা নিরাপদ। সম্ভব হলে তা করা থেকে বিরত থাকুন।
আন্দ্রেজ রোমেল

@ আন্দ্রেজ রোমেল আপনার উপায় কী প্রস্তাবিত?
কিকিনেট

2
প্রস্তাবিত উপায় হ'ল একটি বৈধ এসএসএল শংসাপত্র তৈরি করা এবং যদি সার্ভারের উপর আপনার নিয়ন্ত্রণ থাকে তবে এটি সঠিকভাবে ব্যবহার করুন। আমরা letsencrypt.org ব্যবহার করে একটি তৈরি শেষ করেছি।
আন্দ্রেজ রোমেল

5

উল্লেখ করা হয়েছে যে এর আগে .NET 4.5 এর অ্যাক্সেসের অনুরোধে সম্পত্তিটি ServicePointManagerপাওয়া যায় নি।

এখানে .NET 4.0 কোড রয়েছে যা আপনাকে ServicePointপ্রতি অনুরোধের ভিত্তিতে অ্যাক্সেস দেবে । এটি আপনাকে প্রতি অনুরোধ কলব্যাক অ্যাক্সেস দেয় না, তবে এটি আপনাকে সমস্যা সম্পর্কে আরও বিশদ জানতে দেবে। কেবলমাত্র scvPoint.Certificate(বা ClientCertificateযদি আপনি চান) বৈশিষ্ট্য অ্যাক্সেস করুন ।

WebRequest request = WebRequest.Create(uri);

// oddity: these two .Address values are not necessarily the same!
//  The service point appears to be related to the .Host, not the Uri itself.
//  So, check the .Host vlaues before fussing in the debugger.
//
ServicePoint svcPoint = ServicePointManager.FindServicePoint(uri);
if (null != svcPoint)
{
    if (!request.RequestUri.Host.Equals(svcPoint.Address.Host, StringComparison.OrdinalIgnoreCase))
    {
        Debug.WriteLine(".Address              == " + request.RequestUri.ToString());
        Debug.WriteLine(".ServicePoint.Address == " + svcPoint.Address.ToString());
    }
    Debug.WriteLine(".IssuerName           == " + svcPoint.Certificate.GetIssuerName());
}

একমত! তবে তারপরে, এই ওপি তাদের সম্পর্কে কীভাবে ignoreবিশ্বাস করবেন না।
জেসি চিশলম

যাইহোক, ব্যবহার করে ServicePointআমি সবসময় সমস্ত এসএসএল শংসাপত্রকে বিশ্বাস করতে পারি না , সমস্ত শংসাপত্রকেওServerCertificateValidationCallback
এড়ানো যায়

4

ঘটনাক্রমে, আমি জানি কোনও প্রদত্ত অ্যাপ্লিকেশনটিতে সমস্ত শংসাপত্রের বৈধতা বন্ধ করার এটি একটি সর্বনিম্ন ভারবস উপায়:

ServicePointManager.ServerCertificateValidationCallback = (a, b, c, d) => true;

4

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

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

using System.Net.Http;
using System.Net.Security;
using System.Security.Cryptography.X509Certificates;

public class MyController : ApiController
{

    // use this HttpClient instance when making calls that need cert errors suppressed
    private static readonly HttpClient httpClient;

    static MyController()
    {
        // create a separate handler for use in this controller
        var handler = new HttpClientHandler();

        // add a custom certificate validation callback to the handler
        handler.ServerCertificateCustomValidationCallback = ((sender, cert, chain, errors) => ValidateCert(sender, cert, chain, errors));

        // create an HttpClient that will use the handler
        httpClient = new HttpClient(handler);
    }

    protected static ValidateCert(object sender, X509Certificate cert, X509Chain chain, SslPolicyErrors errors)
    {

        // set a list of servers for which cert validation errors will be ignored
        var overrideCerts = new string[]
        {
            "myproblemserver",
            "someotherserver",
            "localhost"
        };

        // if the server is in the override list, then ignore any validation errors
        var serverName = cert.Subject.ToLower();
        if (overrideCerts.Any(overrideName => serverName.Contains(overrideName))) return true;

        // otherwise use the standard validation results
        return errors == SslPolicyErrors.None;
    }

}

এটি কি কেবল নেট নেটওয়ার্কের জন্য কাজ করবে না? (বা যখনই সার্ভারসির্টিফিকেট কাস্টমভালিডেশনক্যালব্যাকটি এইচটিপিপিপ্লিয়েন্টহ্যান্ডলারের সাথে যুক্ত হয়েছিল)?
ফিলিস্ক্লিক

এই সমাধানটি। নেট ফ্রেমওয়ার্ক 4.5 এবং এর পরে পাশাপাশি। নেট কোরটিতে কাজ করা উচিত (যদিও আমি এটি নেট কোরতে পরীক্ষা করে নি)।
শেল্ডন

@ শেল্ডন, এটি একটি মণি ছিল :) আমার লোকালহোস্ট এপিআই-কলগুলিতে সাফল্যের সাথে একটি নেট এবং একটি নেট নেটওয়ার্ক অ্যাপ্লিকেশনটির মধ্যে ব্যবহৃত হয়। সমস্ত গ্রহণ না করে চমৎকার কাজ।
বড়

3

আদমের উত্তর এবং রবের মন্তব্যের ভিত্তিতে আমি এটি ব্যবহার করেছি:

ServicePointManager.ServerCertificateValidationCallback += (sender, certificate, chain, sslPolicyErrors) => certificate.Issuer == "CN=localhost";

যা কিছুটা "উপেক্ষা" ফিল্টার করে। অবশ্যই অন্যান্য ইস্যুকারীদের অবশ্যই যোগ করা যায়। আমাদের কিছু লিগ্যাসি কোড সমর্থন করার জন্য এটি .NET 2.0 তে পরীক্ষা করা হয়েছিল।


@ করণাক দেরিতে জবাবের জন্য দুঃখিত - এটি আসল কলের আগে যে কোনও জায়গায় যুক্ত করা যেতে পারে, যেমন। অনুরোধ কল করার আগে .GetResponse ()। দ্রষ্টব্য যে ইস্যুকারী আপনার ক্ষেত্রে যদিও অন্য কিছু থাকতে পারে।
আন্দ্রেজ গ্রোবলার

3

CA5386: দূর্বলতা বিশ্লেষণ সরঞ্জামগুলি আপনাকে এই কোডগুলিতে সতর্ক করবে।

সঠিক কোড:

ServicePointManager.ServerCertificateValidationCallback += (sender, certificate, chain, sslPolicyErrors) =>
{
   return (sslPolicyErrors & SslPolicyErrors.RemoteCertificateNotAvailable) != SslPolicyErrors.RemoteCertificateNotAvailable;
};

3

। নেট কোর জন্য

using (var handler = new HttpClientHandler())
{ 
    // allow the bad certificate
    handler.ServerCertificateCustomValidationCallback = (request, cert, chain, errors) => true;
    using (var httpClient = new HttpClient(handler))
    {
        await httpClient.PostAsync("the_url", null);
    }
}

2

স্পষ্টভাবে প্রকাশ করা ...

ServicePointManager.ServerCertificateValidationCallback += new System.Net.Security.RemoteCertificateValidationCallback(CertCheck);

private static bool CertCheck(object sender, X509Certificate cert,
X509Chain chain, System.Net.Security.SslPolicyErrors error)
{
    return true;
}

0

সানির এবং ব্লাক 3 এর উত্তরগুলিতে যুক্ত করে, আমি আমার অ্যাপ্লিকেশনটির জন্য স্টার্টআপ কোডটিতে নিম্নলিখিতগুলি যুক্ত করেছি, তবে ভিবিতে:

'** Overriding the certificate validation check.
Net.ServicePointManager.ServerCertificateValidationCallback = Function(sender, certificate, chain, sslPolicyErrors) True

কৌতুক করতে পারে বলে মনে হচ্ছে।


0

টিপ: শীঘ্রই মেয়াদ শেষ হওয়ার কারণে শংসাপত্রগুলি ট্র্যাক করতে আপনি এই পদ্ধতিটিও ব্যবহার করতে পারেন। এটি আপনার বেকনকে বাঁচাতে পারে যদি আপনি কোনও শংসাপত্রের অবসান ঘটাতে পারেন এবং এটি সময়মতো স্থির করতে পারেন। তৃতীয় পক্ষের সংস্থাগুলির পক্ষেও ভাল - আমাদের জন্য এটি ডিএইচএল / ফেডেক্স। ডিএইচএল কেবল একটি শংসাপত্রের মেয়াদ শেষ হতে দিন যা থ্যাঙ্কসগিভিংয়ের 3 দিন আগে আমাদের স্ক্রু করছে। ভাগ্যক্রমে আমি এটি ঠিক করতে প্রায় আছি ... এবার!

    private static DateTime? _nextCertWarning;
    private static bool ValidateRemoteCertificate(object sender, X509Certificate cert, X509Chain chain, SslPolicyErrors error)
    {
        if (error == SslPolicyErrors.None)
        {
            var cert2 = cert as X509Certificate2;
            if (cert2 != null)
            { 
                // If cert expires within 2 days send an alert every 2 hours
                if (cert2.NotAfter.AddDays(-2) < DateTime.Now)
                {
                    if (_nextCertWarning == null || _nextCertWarning < DateTime.Now)
                    {
                        _nextCertWarning = DateTime.Now.AddHours(2);

                        ProwlUtil.StepReached("CERT EXPIRING WITHIN 2 DAYS " + cert, cert.GetCertHashString());   // this is my own function
                    }
                }
            }

            return true;
        }
        else
        {
            switch (cert.GetCertHashString())
            {
                // Machine certs - SELF SIGNED
                case "066CF9CAD814DE2097D367F22D3A7E398B87C4D6":    

                    return true;

                default:
                    ProwlUtil.StepReached("UNTRUSTED CERT " + cert, cert.GetCertHashString());
                    return false;
            }
        }
    }

আপনার সতর্কতা ব্যবস্থার মেয়াদ উত্তীর্ণ হওয়া শংসাপত্র থাকতে পারে এমন পরিস্থিতিটি পরিচালনা করার বিষয়টি নিশ্চিত করুন - অথবা আপনি স্ট্যাকওভারফ্লো দিয়ে শেষ করবেন!
সাইমন_উইভার

কী ProwlUtil.StepReached?
কিকিনেট

দুঃখিত, প্রোল এপিআই কল করার জন্য এটি কেবল আমার নিজস্ব পদ্ধতি যা আমার ফোনে বিজ্ঞপ্তি প্রেরণ করতে পারে। তবে আপনি লগ করতে চান এটি ভাল। আমি এই জাতীয় জিনিসের জন্য আমার ফোনে বাগ লাগাতে চাই!
সাইমন_উইভার

0

কাজ উপরে বেশ কয়েকটি উত্তর। আমি এমন একটি দৃষ্টিভঙ্গি চেয়েছিলাম যে আমাকে কোড পরিবর্তন করতে হবে না এবং আমার কোডটি সুরক্ষিত করে না। তাই আমি একটি শ্বেত তালিকা তৈরি করেছি। হোয়াইটলিস্ট যে কোনও ডেটাস্টোরে রক্ষণাবেক্ষণ করা যায়। আমি কনফিগারেশন ফাইলটি ব্যবহার করেছি কারণ এটি খুব ছোট একটি তালিকা।

আমার কোডটি নীচে।

ServicePointManager.ServerCertificateValidationCallback += (sender, cert, chain, error) => {
    return error == System.Net.Security.SslPolicyErrors.None || certificateWhitelist.Contains(cert.GetCertHashString());
};

0

এই সমাধানটির একতা সি # সংস্করণ:

void Awake()
{
    System.Net.ServicePointManager.ServerCertificateValidationCallback += ValidateCertification;
}

void OnDestroy()
{
    ServerCertificateValidationCallback = null;
}

public static bool ValidateCertification(object sender, X509Certificate certificate, X509Chain chain, System.Net.Security.SslPolicyErrors sslPolicyErrors)
{
    return true;
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.