c# - मोनो https webrequest "प्रमाणीकरण या डिक्रिप्शन विफल रहा है" के साथ विफल रहता है




mono (6)

अनुरोध http अनुरोध करने से पहले इस पंक्ति को लिखें। यह काम होना चाहिए।

ServicePointManager.ServerCertificateValidationCallback += new RemoteCertificateValidationCallback((sender, certificate, chain, policyErrors) => { return true; });


private static bool RemoteCertificateValidationCallback(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors)
    {
        //Return true if the server certificate is ok
        if (sslPolicyErrors == SslPolicyErrors.None)
            return true;

        bool acceptCertificate = true;
        string msg = "The server could not be validated for the following reason(s):\r\n";

        //The server did not present a certificate
        if ((sslPolicyErrors &
             SslPolicyErrors.RemoteCertificateNotAvailable) == SslPolicyErrors.RemoteCertificateNotAvailable)
        {
            msg = msg + "\r\n    -The server did not present a certificate.\r\n";
            acceptCertificate = false;
        }
        else
        {
            //The certificate does not match the server name
            if ((sslPolicyErrors &
                 SslPolicyErrors.RemoteCertificateNameMismatch) == SslPolicyErrors.RemoteCertificateNameMismatch)
            {
                msg = msg + "\r\n    -The certificate name does not match the authenticated name.\r\n";
                acceptCertificate = false;
            }

            //There is some other problem with the certificate
            if ((sslPolicyErrors &
                 SslPolicyErrors.RemoteCertificateChainErrors) == SslPolicyErrors.RemoteCertificateChainErrors)
            {
                foreach (X509ChainStatus item in chain.ChainStatus)
                {
                    if (item.Status != X509ChainStatusFlags.RevocationStatusUnknown &&
                        item.Status != X509ChainStatusFlags.OfflineRevocation)
                        break;

                    if (item.Status != X509ChainStatusFlags.NoError)
                    {
                        msg = msg + "\r\n    -" + item.StatusInformation;
                        acceptCertificate = false;
                    }
                }
            }
        }

        //If Validation failed, present message box
        if (acceptCertificate == false)
        {
            msg = msg + "\r\nDo you wish to override the security check?";
//          if (MessageBox.Show(msg, "Security Alert: Server could not be validated",
//                       MessageBoxButtons.YesNo, MessageBoxIcon.Exclamation, MessageBoxDefaultButton.Button1) == DialogResult.Yes)
                acceptCertificate = true;
        }

        return acceptCertificate;
    }

मैं अपने सी # अनुप्रयोगों में उपयोग करने के लिए एक सरल आरईएसटी क्लाइंट बना रहा हूं। विंडोज़ में .NET में यह http: // और https: // कनेक्शन के साथ बहुत अच्छा काम करता है। मोनो 2.6.7 में (उसी परिणाम के साथ 2.8 के साथ भी परीक्षण किया गया) उबंटू 10.10 पर केवल http: // काम करता है। https: // कनेक्शन अनुरोध पर इस अपवाद को फेंक देते हैं। GETResponse () विधि:

Unhandled Exception: System.Net.WebException: Error getting response stream (Write: The authentication or decryption has failed.): SendFailure ---> System.IO.IOException: The authentication or decryption has failed. ---> Mono.Security.Protocol.Tls.TlsException: Invalid certificate received from server. Error code: 0xffffffff800b010a
  at Mono.Security.Protocol.Tls.Handshake.Client.TlsServerCertificate.validateCertificates (Mono.Security.X509.X509CertificateCollection certificates) [0x00000] in <filename unknown>:0 
  at Mono.Security.Protocol.Tls.Handshake.Client.TlsServerCertificate.ProcessAsTls1 () [0x00000] in <filename unknown>:0 
  at Mono.Security.Protocol.Tls.Handshake.HandshakeMessage.Process () [0x00000] in <filename unknown>:0 
  at (wrapper remoting-invoke-with-check) Mono.Security.Protocol.Tls.Handshake.HandshakeMessage:Process ()
  at Mono.Security.Protocol.Tls.ClientRecordProtocol.ProcessHandshakeMessage (Mono.Security.Protocol.Tls.TlsStream handMsg) [0x00000] in <filename unknown>:0 
  at Mono.Security.Protocol.Tls.RecordProtocol.InternalReceiveRecordCallback (IAsyncResult asyncResult) [0x00000] in <filename unknown>:0 
  --- End of inner exception stack trace ---
  at Mono.Security.Protocol.Tls.SslStreamBase.AsyncHandshakeCallback (IAsyncResult asyncResult) [0x00000] in <filename unknown>:0 
  --- End of inner exception stack trace ---
  at System.Net.HttpWebRequest.EndGetResponse (IAsyncResult asyncResult) [0x00000] in <filename unknown>:0 
  at System.Net.HttpWebRequest.GetResponse () [0x00000] in <filename unknown>:0 

मैं इसे ठीक करने के लिए कोई रास्ता नहीं ढूंढ पाया है। किसी को भी कोई विचार है कि यह क्यों हो रहा है और इसे कैसे ठीक किया जाए?

दोबारा, यह केवल मोनो में विफल रहता है, नेट को कनेक्शन स्थापित करने में कोई समस्या नहीं प्रतीत होती है।

यहां कॉलिंग कोड है:

public JToken DoRequest(string path, params string[] parameters) {
    if(!path.StartsWith("/")) {
        path = "/" + path;
    }
    string fullUrl = url + path + ToQueryString(parameters);

    if(DebugUrls) Console.WriteLine("Requesting: {0}", fullUrl);

    WebRequest request = HttpWebRequest.CreateDefault(new Uri(fullUrl));
    using(WebResponse response = request.GetResponse())
    using(Stream responseStream = response.GetResponseStream()) {
        return ReadResponse(responseStream);
    }
}

आप आईओएस बिल्ड में मोनो टीएलएस कार्यान्वयन सेट कर सकते हैं और यहां वर्णित सब कुछ ठीक काम करेगा: http://massivepixel.co/blog/post/xamarin-studio-6-certificate-unknown प्रमाण पत्र- http://massivepixel.co/blog/post/xamarin-studio-6-certificate-unknown (हालांकि मोनो टीएलएस नए संस्करणों का समर्थन नहीं करता है टीएलएस लेकिन मैंने अभी तक इस मुद्दे पर टक्कर नहीं ली है कि यह एक समस्या है)।


पहला जवाब यह पहले से ही कहता है: विंडोज़ के अलावा किसी अन्य चीज़ पर मोनो कुछ भी नहीं आ रहा है, इसलिए शुरुआत में यह किसी प्रमाण पत्र पर भरोसा नहीं करता है। इसलिए क्या करना है?

डेवलपर के परिप्रेक्ष्य से समस्या से निपटने के विभिन्न तरीकों के बारे में यहां एक अच्छा लेख है: http://www.mono-project.com/archived/usingtrustedrootsrespectfully/

संक्षिप्त सारांश: आप या तो कर सकते हैं:

  • सुरक्षा चिंता को नजरअंदाज करें
  • समस्या को अनदेखा करें
  • उपयोगकर्ता को पता और निरस्त करने दें
  • उपयोगकर्ता को अपने जोखिम पर जारी रखने के लिए उसे जाने और उसे पसंद करने दें

उपरोक्त लिंक प्रत्येक मामले के लिए कोड उदाहरणों के साथ आता है।


मुझे एकता के साथ एक ही समस्या थी (जो मोनो का भी उपयोग करती है) और इस पोस्ट ने मुझे इसे हल करने में मदद की।

अपना अनुरोध करने से पहले बस निम्नलिखित पंक्ति जोड़ें:

ServicePointManager.ServerCertificateValidationCallback = MyRemoteCertificateValidationCallback;

और यह विधि:

public bool MyRemoteCertificateValidationCallback(System.Object sender,
    X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors)
{
    bool isOk = true;
    // If there are errors in the certificate chain,
    // look at each error to determine the cause.
    if (sslPolicyErrors != SslPolicyErrors.None) {
        for (int i=0; i<chain.ChainStatus.Length; i++) {
            if (chain.ChainStatus[i].Status == X509ChainStatusFlags.RevocationStatusUnknown) {
                continue;
            }
            chain.ChainPolicy.RevocationFlag = X509RevocationFlag.EntireChain;
            chain.ChainPolicy.RevocationMode = X509RevocationMode.Online;
            chain.ChainPolicy.UrlRetrievalTimeout = new TimeSpan (0, 1, 0);
            chain.ChainPolicy.VerificationFlags = X509VerificationFlags.AllFlags;
            bool chainIsValid = chain.Build ((X509Certificate2)certificate);
            if (!chainIsValid) {
                isOk = false;
                break;
            }
        }
    }
    return isOk;
}

मुझे भी यही समस्या थी। जब http प्रतिक्रिया इस अपवाद को फेंकता है तो मैं करता हूं:

System.Diagnostics.Process.Start("mozroots","--import --quiet");

यह गायब प्रमाणपत्र आयात करता है और अपवाद कभी भी खुश नहीं होता है।


मोनो डिफ़ॉल्ट रूप से किसी प्रमाण पत्र पर भरोसा नहीं करता है, मोज़िला विश्वसनीय रूट अधिकारियों को आयात करने के लिए आप mozroots --import --quiet को मोनो इंस्टॉलेशन फ़ोल्डर में चला सकते हैं जहां mozroots.exe स्थित है





webrequest