। নেট কোর অবৈধ এসএসএল শংসাপত্র বাইপাস


104

আমি এমন একটি প্রকল্পে কাজ করছি যা একটি https সাইটের সাথে সংযুক্ত হওয়া প্রয়োজন। যতবার আমি সংযোগ করি, আমার কোডটি ব্যতিক্রম ছুঁড়ে দেয় কারণ সেই সাইটের শংসাপত্রটি অবিশ্বস্ত সাইট থেকে আসে। । নেট কোর HTTP শংসাপত্র চেক ইন বাইপাস করার কোন উপায় আছে?

আমি এই কোডটি। নেট এর পূর্ববর্তী সংস্করণ থেকে দেখেছি। আমার ধারণা আমার এই জাতীয় কিছু দরকার।

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

উত্তর:


28

সার্ভিসপয়েন্ট ম্যানেজার.সভার সার্টিটিভালিডেশন ক্যালব্যাক। নেট কোরটিতে সমর্থিত নয়।

বর্তমান পরিস্থিতি হ'ল আসন্ন ৪.১ এর জন্য এটি নতুন সার্ভারের্টিফিকেট কাস্টমভালিডেশন ক্যালব্যাক পদ্ধতি হবে * * সিস্টেম. নেট.এইচটিপি চুক্তি (এইচটিপিপিলেট)। .NET কোর টিম এখন 4.1 চুক্তিটি চূড়ান্ত করছে। আপনি গিথুবএখানে পড়তে পারেন

আপনি এখানে কোরিএফএক্সে বা এমওয়াইটি ফিডে সরাসরি উত্সগুলি ব্যবহার করে System.Net.Http 4.1 এর প্রাক-প্রকাশ সংস্করণটি ব্যবহার করে দেখতে পারেন: https://dotnet.myget.org/gallery/dotnet-core

গিথুব-এ বর্তমান উইনএইচটিপিহ্যান্ডলারের সার্ভার সার্টিফিকেট কাস্টমভালিডেশনক্যালব্যাক সংজ্ঞা


8
এটি কেবল উইন্ডোজে কাজ করে। আপনার কি লিনাক্সের সমাধান আছে? ধন্যবাদ
ভ্লাদিমির

146

হালনাগাদ:

নীচে উল্লিখিত হিসাবে, সমস্ত বাস্তবায়ন এই কলব্যাক সমর্থন করে না (যেমন আইওএসের মতো প্ল্যাটফর্ম)। এই ক্ষেত্রে, ডকস যেমন বলেছেন, আপনি স্পষ্টভাবে বৈধকারক সেট করতে পারেন:

handler.ServerCertificateCustomValidationCallback = HttpClientHandler.DangerousAcceptAnyServerCertificateValidator;

এটি নেট কোর 2.2, 3.0 এবং 3.1 এর জন্যও কাজ করে

পুরানো উত্তর , আরও নিয়ন্ত্রণ সহ তবে ফেলে দিতে পারে PlatformNotSupportedException:

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

using (var httpClientHandler = new HttpClientHandler())
{
   httpClientHandler.ServerCertificateCustomValidationCallback = (message, cert, chain, errors) => { return true; };
   using (var client = new HttpClient(httpClientHandler))
   {
       // Make your request...
   }
}

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


4
আমি। নেট কোর 1.0 ব্যবহার করছি এবং এটি আমার পক্ষে কাজ করেছে। শীর্ষস্থানীয় হিসাবে এটি দেখতে মনে হচ্ছে। নেট কোর 2.0 একটি HttpClientসম্পত্তি যুক্ত করেছে DangerousAcceptAnyServerCertificateValidatorযা MacOSX এ এই কাজটি করার একটি উপায় সরবরাহ করে। এখানে আরও তথ্য - github.com/dotnet/corefx/pull/19908
ট্রয় উইথথফুট

4
এডাব্লুএস ল্যাম্বদা দিয়ে এটি ব্যবহার করে। নেট নেট ১.০ কাস্টম রুট সিএ সার্টের সাহায্যে অভ্যন্তরীণ এইচটিটিপিএসের সাথে সংযোগ স্থাপন থেকে আমাকে বাধা দিচ্ছিল তা সংশোধন করেছে।
কুইকনুল

কারও factory patternজন্য HttpClient?
কিকিনেট

@ কুইকিনেট কেবল একটি কারখানা তৈরি করুন, যেখানে GetHttpClientপদ্ধতিটি কনফিগার করা ফিরিয়ে দেয় HttpClientএবং এটি একটি- usingব্লকের মধ্যে ব্যবহার করে ।
ভাগ্যবানলাই

এটি গ্রহণযোগ্য উত্তর হওয়া উচিত, বিশেষত যেহেতু এটি একক ক্লায়েন্টের ব্যবহারের ক্ষেত্রে যায়।
বাইনারিপ্যাট্রিক

37

আমি এটি দিয়ে সমাধান:

স্টার্টআপ.সি

public void ConfigureServices(IServiceCollection services)
    {
        services.AddHttpClient("HttpClientWithSSLUntrusted").ConfigurePrimaryHttpMessageHandler(() => new HttpClientHandler
        {
            ClientCertificateOptions = ClientCertificateOption.Manual,
            ServerCertificateCustomValidationCallback =
            (httpRequestMessage, cert, cetChain, policyErrors) =>
            {
                return true;
            }
        });

আপনার পরিষেবা পরিষেবা

public UserService(IHttpClientFactory clientFactory, IOptions<AppSettings> appSettings)
    {
        _appSettings = appSettings.Value;
        _clientFactory = clientFactory;
    }

var request = new HttpRequestMessage(...

var client = _clientFactory.CreateClient("HttpClientWithSSLUntrusted");

HttpResponseMessage response = await client.SendAsync(request);

32

একই সমস্যার উত্তর খুঁজতে এখানে এসেছি, তবে আমি নেট কোরের জন্য ডাব্লুসিএফ ব্যবহার করছি। আপনি যদি একই নৌকায় থাকেন তবে ব্যবহার করুন:

client.ClientCredentials.ServiceCertificate.SslCertificateAuthentication = 
    new X509ServiceCertificateAuthentication()
    {
        CertificateValidationMode = X509CertificateValidationMode.None,
        RevocationMode = X509RevocationMode.NoCheck
    };

সমস্ত শংসাপত্র এবং অ্যাপডোমাইন জন্য গ্লোবাল?
কিকিনেট

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

এইচটিপিপ্লিয়েন্টে কোনও ক্লায়েন্টস্রেডেন্টিয়াল সম্পত্তি নেই (। নেট কোর 3.1)।
Павле

@ Павле: আমি এই প্রকল্পটি এখনও 3.1-এ আপডেট করেছি না, তবে এমন একটি সম্পত্তি থাকতে হবে: ডকস.মাইক্রোসফটকম / en-us / dotnet / api/…
ট্রয়েস লারসেন

@ Павле: এই উত্তরটি HTTPClient সম্পর্কে নয় তবে একটি WCF পরিষেবা উত্পন্ন ক্লায়েন্ট। আমার এএসএমএক্স সোপক্লিয়েন্টের জন্যও কাজ করেছেন, অনেক ধন্যবাদ!
জান জহ্রাডনেক

14

.NETCore এ, আপনি পরিষেবাগুলি কনফিগার পদ্ধতিতে নিম্নলিখিত কোড স্নিপেট যুক্ত করতে পারেন, আমি কেবলমাত্র নিশ্চিত করে তুলি যে আমরা কেবলমাত্র পরিবেশের পরিবেশে এসএসএল শংসাপত্রটি পাস করেছি make

services.AddHttpClient("HttpClientName", client => {
// code to configure headers etc..
}).ConfigurePrimaryHttpMessageHandler(() => {
                  var handler = new HttpClientHandler();
                  if (hostingEnvironment.IsDevelopment())
                  {
                      handler.ServerCertificateCustomValidationCallback = (message, cert, chain, errors) => { return true; };
                  }
                  return handler;
              });

4
কেন, অন্যরা mvc.net কোডে যা পরামর্শ দিয়েছে ঠিক তা বাস্তবায়ন করছে এবং তারা এতে পয়েন্ট করেছে, আমি ঠিক। নেটকোর কোডে একই বাস্তবায়ন চিত্রিত করছি
সামেহ

সম্ভবত কারণ এর কোনও ব্যাখ্যা নেই। কেন এই পদ্ধতির কোনও অন্যটিকে গ্রহণ করা উচিত, কলিং বিভাগে কী কোড লেখা উচিত (মাইকন্ট্রোলার.সিগুলি বলুন), যা ব্যাখ্যার অংশ হতে পারে। কোনও অফিসিয়াল ডকুমেন্টেশন / প্রশংসাপত্র
ভানু ছাবরা

যেমনটি আমি বলেছি আপনি যদি থ্রেডের শীর্ষে অন্যান্য মন্তব্যগুলি পর্যালোচনা করেন তবে খুব বেশি পার্থক্য নেই এবং এখনও তারা 18 এবং 81 পয়েন্ট অর্জন করেছেন
সামেহ

4
কারণ তারা তাদের উত্তরগুলিকে সমর্থন করে পাঠ্য যোগ করেছে, দয়া করে আরও একবার গাইডলাইন পড়ুন। আপনাকে সাহায্য করতে পারে, @ মোডেরেটরগুলি আইএমএইচওর সঠিক সমস্যাগুলি নির্দেশ করতে পারে।
ভানু ছাবড়া

8

.NET কোর ২.২ এবং ডকার লিনাক্স পাত্রে স্ব-স্বাক্ষরিত শংসাপত্র এবং ক্লায়েন্ট শংসাপত্রের লেখক নিয়ে কাজ করার সময় আমি একই সমস্যার মুখোমুখি হয়েছি। আমার ডেভ উইন্ডোজ মেশিনে সবকিছু ঠিকঠাক কাজ করেছে, তবে ডকারে আমি এ জাতীয় ত্রুটি পেয়েছি:

সিস্টেম.সিকিউরিটি.অথ্যান্টিকেশন.অথেন্টিফিকেশন এক্সসেপশন: রিমোট শংসাপত্র বৈধকরণ পদ্ধতি অনুসারে অবৈধ

ভাগ্যক্রমে, শৃঙ্খলাটি একটি চেইন ব্যবহার করে তৈরি করা হয়েছিল। অবশ্যই, আপনি সর্বদা এই সমাধানটিকে উপেক্ষা করতে এবং উপরের সমাধানগুলি ব্যবহার করতে পারেন।

সুতরাং এখানে আমার সমাধান:

  1. আমি P7B ফর্ম্যাটে আমার কম্পিউটারে Chrome ব্যবহার করে শংসাপত্রটি সংরক্ষণ করেছি ।

  2. এই কমান্ডটি ব্যবহার করে শংসাপত্রটিকে PEM ফর্ম্যাটে রূপান্তর করুন:
    openssl pkcs7 -inform DER -outform PEM -in <cert>.p7b -print_certs > ca_bundle.crt

  3. Ca_bundle.crt ফাইলটি খুলুন এবং একটি পরিষ্কার ফাইল রেখে সমস্ত সাবজেক্ট রেকর্ডিং মুছুন। নীচে উদাহরণ:

    -----BEGIN CERTIFICATE-----
    _BASE64 DATA_
    -----END CERTIFICATE-----
    -----BEGIN CERTIFICATE-----
    _BASE64 DATA_
    -----END CERTIFICATE-----
    -----BEGIN CERTIFICATE-----
    _BASE64 DATA_
    -----END CERTIFICATE-----
  1. এই লাইনগুলি ডকফাইফাইলের (চূড়ান্ত পদক্ষেপে) রাখুন:
    # Update system and install curl and ca-certificates
    RUN apt-get update && apt-get install -y curl && apt-get install -y ca-certificates
    # Copy your bundle file to the system trusted storage
    COPY ./ca_bundle.crt /usr/local/share/ca-certificates/ca_bundle.crt
    # During docker build, after this line you will get such output: 1 added, 0 removed; done.
    RUN update-ca-certificates
  1. অ্যাপটিতে:
    var address = new EndpointAddress("https://serviceUrl");                
    var binding = new BasicHttpsBinding
    {
        CloseTimeout = new TimeSpan(0, 1, 0),
        OpenTimeout = new TimeSpan(0, 1, 0),
        ReceiveTimeout = new TimeSpan(0, 1, 0),
        SendTimeout = new TimeSpan(0, 1, 0),
        MaxBufferPoolSize = 524288,
        MaxBufferSize = 65536,
        MaxReceivedMessageSize = 65536,
        TextEncoding = Encoding.UTF8,
        TransferMode = TransferMode.Buffered,
        UseDefaultWebProxy = true,
        AllowCookies = false,
        BypassProxyOnLocal = false,
        ReaderQuotas = XmlDictionaryReaderQuotas.Max,
        Security =
        {
            Mode = BasicHttpsSecurityMode.Transport,
            Transport = new HttpTransportSecurity
            {
                ClientCredentialType = HttpClientCredentialType.Certificate,
                ProxyCredentialType = HttpProxyCredentialType.None
            }
        }
    };
    var client = new MyWSClient(binding, address);
    client.ClientCredentials.ClientCertificate.Certificate = GetClientCertificate("clientCert.pfx", "passwordForClientCert");
    // Client certs must be installed
    client.ClientCredentials.ServiceCertificate.SslCertificateAuthentication = new X509ServiceCertificateAuthentication
    {
        CertificateValidationMode = X509CertificateValidationMode.ChainTrust,
        TrustedStoreLocation = StoreLocation.LocalMachine,
        RevocationMode = X509RevocationMode.NoCheck
    };

গেটক্লিয়েন্ট সার্টিফিকেট পদ্ধতি:

private static X509Certificate2 GetClientCertificate(string clientCertName, string password)
{
    //Create X509Certificate2 object from .pfx file
    byte[] rawData = null;
    using (var f = new FileStream(Path.Combine(AppContext.BaseDirectory, clientCertName), FileMode.Open, FileAccess.Read))
    {
        var size = (int)f.Length;
        var rawData = new byte[size];
        f.Read(rawData, 0, size);
        f.Close();
    }
    return new X509Certificate2(rawData, password);
}

4

প্রথমত, উত্পাদনে এটি ব্যবহার করবেন না

আপনি যদি AddHttpClient মিডওয়্যার ব্যবহার করেন তবে এটি দরকারী। আমি মনে করি এটি উত্পাদন নয়, উন্নয়নের উদ্দেশ্যে প্রয়োজন। আপনি কোনও বৈধ শংসাপত্র তৈরি না করা পর্যন্ত আপনি এই ফানক ব্যবহার করতে পারবেন।

Func<HttpMessageHandler> configureHandler = () =>
        {
            var bypassCertValidation = Configuration.GetValue<bool>("BypassRemoteCertificateValidation");
            var handler = new HttpClientHandler();
            //!DO NOT DO IT IN PRODUCTION!! GO AND CREATE VALID CERTIFICATE!
            if (bypassCertValidation)
            {
                handler.ServerCertificateCustomValidationCallback = (httpRequestMessage, x509Certificate2, x509Chain, sslPolicyErrors) =>
                {
                    return true;
                };
            }
            return handler;
        };

এবং এটি প্রয়োগ করুন

services.AddHttpClient<IMyClient, MyClient>(x => { x.BaseAddress = new Uri("https://localhost:5005"); })
        .ConfigurePrimaryHttpMessageHandler(configureHandler);

3

সমস্ত শংসাপত্রের অনুমতি দেওয়া খুব শক্তিশালী তবে এটি বিপজ্জনকও হতে পারে। আপনি যদি কেবল বৈধ শংসাপত্রের সাথে কিছু নির্দিষ্ট শংসাপত্রের মঞ্জুরি দিতে চান তবে এটি এটি করা যেতে পারে।

using (var httpClientHandler = new HttpClientHandler())
{
    httpClientHandler.ServerCertificateCustomValidationCallback = (message, cert, chain, sslPolicyErrors) => {
        if (sslPolicyErrors == SslPolicyErrors.None)
        {
            return true;   //Is valid
        }

        if (cert.GetCertHashString() == "99E92D8447AEF30483B1D7527812C9B7B3A915A7")
        {
            return true;
        }
        return false;
    };
    using (var httpClient = new HttpClient(httpClientHandler))
    {
        var httpResponse = httpClient.GetAsync("https://example.com").Result;
    }
}

মূল উৎস:

https://stackoverflow.com/a/44140506/3850405

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.