"सत्यापन प्रक्रिया के अनुसार दूरस्थ प्रमाणपत्र अमान्य है।" जीमेल एसएमटीपी सर्वर का उपयोग करना


222

मुझे यह त्रुटि मिल रही है:

सत्यापन प्रक्रिया के अनुसार दूरस्थ प्रमाणपत्र अमान्य है।

जब भी मैं अपने C # कोड में Gmail के SMTP सर्वर का उपयोग करके ई-मेल भेजने की कोशिश करता हूं। क्या कोई मुझे इस समस्या के समाधान के लिए सही दिशा की ओर इशारा कर सकता है?

निम्नलिखित स्टैक ट्रेस है ...

at System.Net.Security.SslState.StartSendAuthResetSignal(ProtocolToken message, AsyncProtocolRequest asyncRequest, Exception exception)
at System.Net.Security.SslState.CheckCompletionBeforeNextReceive(ProtocolToken message, AsyncProtocolRequest asyncRequest)
at System.Net.Security.SslState.StartSendBlob(Byte[] incoming, Int32 count, AsyncProtocolRequest asyncRequest)
at System.Net.Security.SslState.ProcessReceivedBlob(Byte[] buffer, Int32 count, AsyncProtocolRequest asyncRequest)
at System.Net.Security.SslState.StartReadFrame(Byte[] buffer, Int32 readBytes, AsyncProtocolRequest asyncRequest)
at System.Net.Security.SslState.StartReceiveBlob(Byte[] buffer, AsyncProtocolRequest asyncRequest)
at System.Net.Security.SslState.CheckCompletionBeforeNextReceive(ProtocolToken message, AsyncProtocolRequest asyncRequest)
at System.Net.Security.SslState.StartSendBlob(Byte[] incoming, Int32 count, AsyncProtocolRequest asyncRequest)
at System.Net.Security.SslState.ProcessReceivedBlob(Byte[] buffer, Int32 count, AsyncProtocolRequest asyncRequest)
at System.Net.Security.SslState.StartReadFrame(Byte[] buffer, Int32 readBytes, AsyncProtocolRequest asyncRequest)
at System.Net.Security.SslState.StartReceiveBlob(Byte[] buffer, AsyncProtocolRequest asyncRequest)
at System.Net.Security.SslState.CheckCompletionBeforeNextReceive(ProtocolToken message, AsyncProtocolRequest asyncRequest)
at System.Net.Security.SslState.StartSendBlob(Byte[] incoming, Int32 count, AsyncProtocolRequest asyncRequest)
at System.Net.Security.SslState.ProcessReceivedBlob(Byte[] buffer, Int32 count, AsyncProtocolRequest asyncRequest)
at System.Net.Security.SslState.StartReadFrame(Byte[] buffer, Int32 readBytes, AsyncProtocolRequest asyncRequest)
at System.Net.Security.SslState.StartReceiveBlob(Byte[] buffer, AsyncProtocolRequest asyncRequest)
at System.Net.Security.SslState.CheckCompletionBeforeNextReceive(ProtocolToken message, AsyncProtocolRequest asyncRequest)
at System.Net.Security.SslState.StartSendBlob(Byte[] incoming, Int32 count, AsyncProtocolRequest asyncRequest)
at System.Net.Security.SslState.ProcessReceivedBlob(Byte[] buffer, Int32 count, AsyncProtocolRequest asyncRequest)
at System.Net.Security.SslState.StartReadFrame(Byte[] buffer, Int32 readBytes, AsyncProtocolRequest asyncRequest)
at System.Net.Security.SslState.StartReceiveBlob(Byte[] buffer, AsyncProtocolRequest asyncRequest)
at System.Net.Security.SslState.CheckCompletionBeforeNextReceive(ProtocolToken message, AsyncProtocolRequest asyncRequest)
at System.Net.Security.SslState.StartSendBlob(Byte[] incoming, Int32 count, AsyncProtocolRequest asyncRequest)
at System.Net.Security.SslState.ProcessReceivedBlob(Byte[] buffer, Int32 count, AsyncProtocolRequest asyncRequest)
at System.Net.Security.SslState.StartReadFrame(Byte[] buffer, Int32 readBytes, AsyncProtocolRequest asyncRequest)
at System.Net.Security.SslState.StartReceiveBlob(Byte[] buffer, AsyncProtocolRequest asyncRequest)
at System.Net.Security.SslState.CheckCompletionBeforeNextReceive(ProtocolToken message, AsyncProtocolRequest asyncRequest)
at System.Net.Security.SslState.StartSendBlob(Byte[] incoming, Int32 count, AsyncProtocolRequest asyncRequest)
at System.Net.Security.SslState.ForceAuthentication(Boolean receiveFirst, Byte[] buffer, AsyncProtocolRequest asyncRequest)
at System.Net.Security.SslState.ProcessAuthentication(LazyAsyncResult lazyResult)
at System.Net.TlsStream.CallProcessAuthentication(Object state)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
at System.Net.TlsStream.ProcessAuthentication(LazyAsyncResult result)
at System.Net.TlsStream.Write(Byte[] buffer, Int32 offset, Int32 size)
at System.Net.PooledStream.Write(Byte[] buffer, Int32 offset, Int32 size)
at System.Net.Mail.SmtpConnection.Flush()
at System.Net.Mail.SmtpConnection.GetConnection(String host, Int32 port)
at System.Net.Mail.SmtpTransport.GetConnection(String host, Int32 port)
at System.Net.Mail.SmtpClient.GetConnection()
at System.Net.Mail.SmtpClient.Send(MailMessage message)
at BulkEmail.frmemail.mailsending(String toaddress, String fromaddress, String fromname, String subject, String pwd, String attachements, String mailmessage, String htmlmessage, Int32 i, Int32 j, String replytoaddress)

1
क्या आप हमें Gmail SMTP सर्वर का उपयोग करने के लिए अपने कॉन्फ़िगर के बारे में अधिक बता सकते हैं? मेरा भाग्यशाली अनुमान: क्या आप हमें एसएसएल के लिए अपनी सुरक्षा नीतियों के बारे में अधिक बता सकते हैं (जैसे वैध / अमान्य एसएसएल प्रमाणपत्र का उपयोग करना?)।
ब्रायन क्लोजेल

क्या आप हमें एक कोड नमूना दे सकते हैं जहां आप त्रुटि को पुन: उत्पन्न कर सकते हैं?
zaTricky

जवाबों:


302

चेतावनी: उत्पादन कोड में इसका उपयोग न करें!

वर्कअराउंड के रूप में, आप प्रमाणपत्र सत्यापन बंद कर सकते हैं। केवल यह पुष्टि करने के लिए कभी भी ऐसा करें कि खराब प्रमाणपत्र के कारण त्रुटि हो रही है।

कॉल करने से पहले इस विधि को कॉल करें smtpclient.Send():

    [Obsolete("Do not use this in Production code!!!",true)]
    static void NEVER_EAT_POISON_Disable_CertificateValidation()
    {
        // Disabling certificate validation can expose you to a man-in-the-middle attack
        // which may allow your encrypted message to be read by an attacker
        // https://stackoverflow.com/a/14907718/740639
        ServicePointManager.ServerCertificateValidationCallback =
            delegate (
                object s,
                X509Certificate certificate,
                X509Chain chain,
                SslPolicyErrors sslPolicyErrors
            ) {
                return true;
            };
    }

175
यह हैक है, फिक्स नहीं?
एलबी।

88
सभी सुरक्षा को पूरी तरह से बंद करने के बजाय एक फिक्स देखना पसंद करेंगे।
रोमन स्टार्कोव

71
सुरक्षा समस्या के समाधान के रूप में आप सुरक्षा को बंद कर सकते हैं? WTF?
जॉन निकोलस

68
इसे कम करना था, क्योंकि लोगों को अभी भी लगता है कि यह एक समाधान है। यह सिर्फ सुरक्षा बंद टर्निंग है। उत्पादन में लोगों का उपयोग न करें । वह तो यहां तक ​​कहता है। शीश।
MGOwen

51
Upvoted। मैं इस बात से पूरी तरह सहमत हूं कि इसका उपयोग BUT में नहीं किया जाना चाहिए .. मैं किसी चीज़ का प्रोटोटाइप बना रहा हूं। परीक्षण सर्वर वे मुझे एसएसएल का उपयोग करने के लिए मुझे प्रदान करने के लिए हुआ। सर्टिफिकेट के साथ काम करना मेरे लिए बहुत नया है, इसलिए मैं सिर्फ क्विक वे आउट चाहता हूं , जो कि
इमो

58

यहाँ की लिंक ने मेरी समस्या हल कर दी।

http://brainof-dave.blogspot.com.au/2008/08/remote-certificate-is-invalid-according.html

मैं वेब सेवा (जिस सर्वर पर समस्या थी) के url पर गया, IE में थोड़ा सुरक्षा आइकन पर क्लिक किया, जो प्रमाण पत्र लाया। मैंने उसके बाद विवरण टैब पर क्लिक किया, कॉपी टू फाइल बटन पर क्लिक किया, जिसने मुझे एक .cer फ़ाइल के रूप में सर्टिफिकेट को निर्यात करने की अनुमति दी। एक बार जब मेरे पास स्थानीय स्तर पर प्रमाण पत्र था, तो मैं नीचे दिए गए निर्देशों का उपयोग करके इसे सर्वर पर सर्टिफिकेट स्टोर में आयात करने में सक्षम था।

एक नया MMC शुरू करें। फ़ाइल -> स्नैप-इन जोड़ें / निकालें ... जोड़ें पर क्लिक करें ... प्रमाण पत्र चुनें और जोड़ें पर क्लिक करें। "कंप्यूटर खाता" रेडियो बटन की जाँच करें। अगला पर क्लिक करें।

अगली स्क्रीन में क्लाइंट कंप्यूटर चुनें। समाप्त पर क्लिक करें। बंद करें पर क्लिक करें। ओके पर क्लिक करें। अब प्रमाणपत्र को विश्वसनीय रूट प्रमाणीकरण प्राधिकारी प्रमाणपत्र स्टोर में स्थापित करें। यह सभी उपयोगकर्ताओं को प्रमाण पत्र पर भरोसा करने की अनुमति देगा।


+1 प्रमाणपत्र पर आयात उपकरण के माध्यम से प्रमाणपत्र आयात करते समय और स्नैप इन के माध्यम से नहीं, यह केवल आपके उपयोगकर्ता खाते के लिए है। स्नैप का उपयोग करना आपको यह चुनने की अनुमति देता है कि आयात किसके लिए है, उपयोगकर्ता खाता, सेवा खाता या हर कोई। आपके पॉइंटर के लिए धन्यवाद। मैं वहाँ एक-दो मिनट से अपना सिर खुजला रहा था!
davidb

यदि आप सभी देव / परीक्षण कार्यस्थानों को स्वचालित करने के लिए कमांड लाइन का उपयोग करना चाहते हैं - certutil -f -p test -importPFX Root devcert.pfxऔर certutil -f -p test -importPFX MY devcert.pfx। एक कमांड कमांड प्रॉम्प्ट ( test
पीएफएक्स

यदि आप परीक्षण के लिए स्व-हस्ताक्षरित प्रमाणपत्र का उपयोग कर रहे हैं, तो इसे ठीक करने का यह सबसे अच्छा तरीका है, धन्यवाद T-Rex!
टोस्टमॉलोज़

36

आप प्रमाणपत्र को मान्य नहीं होने पर उपयोगकर्ता से पूछकर कोड में सुधार कर सकते हैं कि वह जारी रखना चाहता है या नहीं। क्या आप जारी रखना चाहते हैं? नीचे के अनुसार:

ServicePointManager.ServerCertificateValidationCallback = 
    new RemoteCertificateValidationCallback(ValidateServerCertificate);

और इस तरह एक विधि जोड़ें:

public static bool ValidateServerCertificate(object sender,X509Certificate certificate,X509Chain chain,SslPolicyErrors sslPolicyErrors)
{
    if (sslPolicyErrors == SslPolicyErrors.None)
        return true;
    else
    {
        if (System.Windows.Forms.MessageBox.Show("The server certificate is not valid.\nAccept?", "Certificate Validation", System.Windows.Forms.MessageBoxButtons.YesNo, System.Windows.Forms.MessageBoxIcon.Question) == System.Windows.Forms.DialogResult.Yes)
            return true;
        else
            return false;
    }
}

50
यदि यह क्लाउड एप्लिकेशन है, तो "जारी रखें" बटन पर कौन क्लिक करेगा?
कोन्स्टेंटिन इसेव

34

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

हमारे द्वारा उपयोग किया जाने वाला कोड (Microsoft का शिष्टाचार - http://msdn.microsoft.com/en-us/library/office/dd633677(v=exchg.80).aspx ) इस प्रकार है:

  private static bool CertificateValidationCallBack(
         object sender,
         System.Security.Cryptography.X509Certificates.X509Certificate certificate,
         System.Security.Cryptography.X509Certificates.X509Chain chain,
         System.Net.Security.SslPolicyErrors sslPolicyErrors)
    {
  // If the certificate is a valid, signed certificate, return true.
  if (sslPolicyErrors == System.Net.Security.SslPolicyErrors.None)
  {
    return true;
  }

  // If there are errors in the certificate chain, look at each error to determine the cause.
  if ((sslPolicyErrors & System.Net.Security.SslPolicyErrors.RemoteCertificateChainErrors) != 0)
  {
    if (chain != null && chain.ChainStatus != null)
    {
      foreach (System.Security.Cryptography.X509Certificates.X509ChainStatus status in chain.ChainStatus)
      {
        if ((certificate.Subject == certificate.Issuer) &&
           (status.Status == System.Security.Cryptography.X509Certificates.X509ChainStatusFlags.UntrustedRoot))
        {
          // Self-signed certificates with an untrusted root are valid. 
          continue;
        }
        else
        {
          if (status.Status != System.Security.Cryptography.X509Certificates.X509ChainStatusFlags.NoError)
          {
            // If there are any other errors in the certificate chain, the certificate is invalid,
         // so the method returns false.
            return false;
          }
        }
      }
    }

    // When processing reaches this line, the only errors in the certificate chain are 
// untrusted root errors for self-signed certificates. These certificates are valid
// for default Exchange server installations, so return true.
    return true;
  }
  else
  {
 // In all other cases, return false.
    return false;
  }
}

1
मेरे मामले के लिए sslPolicyErrors RemoteCertificateNameMismatch था और मैंने प्रमाणपत्र जांच को संशोधित किया क्योंकि हमारे पास समान विषय और जारीकर्ता मान नहीं थे।
उफुक हैसियोउलारि सिप

2
एक्स 509 सर्टिफिकेट का इस्तेमाल किया गया एक्सचेंज सर्वर एक स्व-हस्ताक्षरित और एक विश्वसनीय के बीच स्विच करता रहा। इस कोड का उपयोग करने से मेरे नेटवर्क व्यवस्थापक को मदद मिली और मुझे न केवल यह पता चला कि यह मामला था, बल्कि केवल स्व-हस्ताक्षरित प्रमाणपत्रों को दरकिनार करके समस्या को पूरी तरह से हल किया। यह सही था!
ब्रेट

20

मुझे ठीक वैसी ही समस्या थी और यह पता चला कि डिफ़ॉल्ट रूप से अवास्ट एंटीवायरस से मेल शील्ड में "स्कैन एसएसएल कनेक्शन" सक्रिय था। सुनिश्चित करें कि इसे बंद करें

मेरे ज्ञान से, अवास्ट मेल को "ओपन" करेगा , इसे किसी भी वायरस के लिए स्कैन करेगा और फिर इसे स्वयं के प्रमाण पत्र का उपयोग करके हस्ताक्षरित करेगा ताकि मेल जीमेल के प्रमाणपत्र द्वारा हस्ताक्षरित न हो जो अब उस त्रुटि को उत्पन्न करता है।

समाधान 1:

  • अपने एंटीवायरस (या संपूर्ण मेल शील्ड) से एसएसएल स्कैन को बंद करें।

समाधान 2 (सबसे अच्छा सुरक्षा बोल होना चाहिए):

  • किसी तरह एंटीवायरस द्वारा उपयोग किया जाने वाला प्रमाणपत्र प्राप्त करें (अवास्ट के पास इसे निर्यात करने का विकल्प है)
  • Gmail सर्वर से कनेक्ट करने से पहले इसे अपने imap / pop / smtp क्लाइंट में आयात करें।

1
आपने मुझे इतना समय बचा लिया। हमेशा के लिए पता लगाना होगा कि मेरे एंटीवायरस को दोष देना होगा और मेरे कोड को नहीं।
arao6

13

Ssl की वजह से आउटलुक से भेजते समय वही त्रुटि प्राप्त करें। सक्षम सेटिंग सक्षम करें = समस्या का समाधान किया।

उदाहरण:

var smtp = new SmtpClient
                {
                    Host = "smtp.gmail.com",                   
                    Port = 587,
                    EnableSsl = false,
                    DeliveryMethod = SmtpDeliveryMethod.Network,
                    UseDefaultCredentials = false,                   
                    Credentials = new NetworkCredential("xxx@gmail.com", "xxxxx")
                };

3
जब आप SSL को गलत पर सेट करते हैं तो जीमेल आपको कनेक्ट करने की अनुमति नहीं देगा, मैंने आपके समाधान की कोशिश की यह मेरे लिए काम नहीं किया।
जीशान अजमल

हाँ, यह वही है जिसे मैं "बुनियादी" (बनाम "कोई नहीं" या "एसएसएल") कहता हूं। ....... वे ईमेल सेटिंग्स कभी-कभी मुश्किल होती हैं।
GranadaCoder

9

क्या आप वाकई SMTP सर्वर पते का सही उपयोग कर रहे हैं?

Smtp.google.com और smtp.gmail.com दोनों काम करते हैं, लेकिन SSL प्रमाणपत्र दूसरे को जारी किया जाता है।


9

मुझे वही त्रुटि हुई जब मैंने SmtpClientप्रॉक्सी सर्वर (यूजरगेट) के जरिए ईमेल भेजने की कोशिश की ।

प्रमाण पत्र सत्यापित करता है कि सर्वर का पता निहित है, जो प्रॉक्सी सर्वर के पते के बराबर नहीं है, इसलिए त्रुटि। मेरा समाधान: जब प्रमाण पत्र की जाँच करते समय कोई त्रुटि होती है, तो प्रमाण पत्र प्राप्त करें, इसे निर्यात करें और जांचें।

public static bool RemoteServerCertificateValidationCallback(Object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors)
    {
        if (sslPolicyErrors == SslPolicyErrors.None)
            return true;

        // if got an cert auth error
        if (sslPolicyErrors != SslPolicyErrors.RemoteCertificateNameMismatch) return false;
        const string sertFileName = "smpthost.cer";

        // check if cert file exists
        if (File.Exists(sertFileName))
        {
            var actualCertificate = X509Certificate.CreateFromCertFile(sertFileName);
            return certificate.Equals(actualCertificate);
        }

        // export and check if cert not exists
        using (var file = File.Create(sertFileName))
        {
            var cert = certificate.Export(X509ContentType.Cert);
            file.Write(cert, 0, cert.Length);
        }
        var createdCertificate = X509Certificate.CreateFromCertFile(sertFileName);
        return certificate.Equals(createdCertificate);
    }

मेरे ईमेल प्रेषक वर्ग का पूरा कोड:

public class EmailSender
{
    private readonly SmtpClient _smtpServer;
    private readonly MailAddress _fromAddress;

    public EmailSender()
    {
        ServicePointManager.ServerCertificateValidationCallback = RemoteServerCertificateValidationCallback;
        _smtpServer = new SmtpClient();
    }

    public EmailSender(string smtpHost, int smtpPort, bool enableSsl, string userName, string password, string fromEmail, string fromName) : this()
    {
        _smtpServer.Host = smtpHost;
        _smtpServer.Port = smtpPort;
        _smtpServer.UseDefaultCredentials = false;
        _smtpServer.EnableSsl = enableSsl;
        _smtpServer.Credentials = new NetworkCredential(userName, password);

        _fromAddress = new MailAddress(fromEmail, fromName);
    }

    public bool Send(string address, string mailSubject, string htmlMessageBody,
        string fileName = null)
    {
        return Send(new List<MailAddress> { new MailAddress(address) }, mailSubject, htmlMessageBody, fileName);
    }

    public bool Send(List<MailAddress> addressList, string mailSubject, string htmlMessageBody,
        string fileName = null)
    {
        var mailMessage = new MailMessage();
        try
        {
            if (_fromAddress != null)
                mailMessage.From = _fromAddress;

            foreach (var addr in addressList)
                mailMessage.To.Add(addr);

            mailMessage.SubjectEncoding = Encoding.UTF8;
            mailMessage.Subject = mailSubject;

            mailMessage.Body = htmlMessageBody;
            mailMessage.BodyEncoding = Encoding.UTF8;
            mailMessage.IsBodyHtml = true;

            if ((fileName != null) && (System.IO.File.Exists(fileName)))
            {
                var attach = new Attachment(fileName, MediaTypeNames.Application.Octet);
                attach.ContentDisposition.CreationDate = System.IO.File.GetCreationTime(fileName);
                attach.ContentDisposition.ModificationDate = System.IO.File.GetLastWriteTime(fileName);
                attach.ContentDisposition.ReadDate = System.IO.File.GetLastAccessTime(fileName);
                mailMessage.Attachments.Add(attach);
            }
            _smtpServer.Send(mailMessage);
        }
        catch (Exception e)
        {
            // TODO lor error
            return false;
        }
        return true;
    }

    public static bool RemoteServerCertificateValidationCallback(Object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors)
{
    if (sslPolicyErrors == SslPolicyErrors.None)
        return true;

    // if got an cert auth error
    if (sslPolicyErrors != SslPolicyErrors.RemoteCertificateNameMismatch) return false;
    const string sertFileName = "smpthost.cer";

    // check if cert file exists
    if (File.Exists(sertFileName))
    {
        var actualCertificate = X509Certificate.CreateFromCertFile(sertFileName);
        return certificate.Equals(actualCertificate);
    }

    // export and check if cert not exists
    using (var file = File.Create(sertFileName))
    {
        var cert = certificate.Export(X509ContentType.Cert);
        file.Write(cert, 0, cert.Length);
    }
    var createdCertificate = X509Certificate.CreateFromCertFile(sertFileName);
    return certificate.Equals(createdCertificate);
}

}


7

मुझे पता है कि मैं इस खेल में बहुत देर से पहुंच रहा हूं, लेकिन मैंने यहां एक उत्तर नहीं दिया है जो TL. स्ट्रीम के लिए system.diagnostics लॉग की ओर इशारा करता है।

इससे पहले कि आप अपने कोड में कोई भी बदलाव करें, सुनिश्चित करें कि आप समझते हैं कि समस्या क्या है। AuthenticationExceptionकि बहुत सामान्य अपवाद जो ज्यादा नहीं बताता है में से एक है। यह जानने के लिए कि हुड के नीचे क्या हो रहा है, अपने आवेदन के लिए app.config फ़ाइल को संपादित करें (या एक नया बनाएं) और सुनिश्चित करें कि आपके पास अनुभाग में सक्षम System.Net ट्रेस स्रोत है system.diagnostics, उदाहरण के लिए:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <system.diagnostics>
    <trace autoflush="true" />
    <sharedListeners>
      <add name="file" initializeData="c:\network.log" type="System.Diagnostics.TextWriterTraceListener" />
    </sharedListeners>
    <sources>
      <source name="System.Net" switchValue="Verbose">
        <listeners>
          <add name="file" />
        </listeners>
      </source>
    </sources>
  </system.diagnostics>
</configuration>

अपने एप्लिकेशन को फिर से चलाएँ और c: \ network.log फ़ाइल की जाँच करें। आपको अपने TLS (SSL) कनेक्शन के बारे में विस्तृत जानकारी देखनी चाहिए, उदाहरण के लिए:

System.Net Information: 0 : [12764] InitializeSecurityContext(credential = System.Net.SafeFreeCredential_SECURITY, context = f44368:535f958, targetName = localhost, inFlags = ReplayDetect, SequenceDetect, Confidentiality, AllocateMemory, InitManualCredValidation)
System.Net Information: 0 : [12764] InitializeSecurityContext(In-Buffers count=2, Out-Buffer length=0, returned code=OK).
System.Net Information: 0 : [12764] Remote certificate: [Version]
  V3

[Subject]
  CN=test
  Simple Name: test
  DNS Name: example.com

[Issuer]
  CN=Root CA
  Simple Name: Root CA
  DNS Name: Root CA

...

[Signature Algorithm]
  sha256RSA(1.2.840.113549.1.1.11)

[Public Key]
  Algorithm: RSA
  Length: 2048
  Key Blob: ....
System.Net Information: 0 : [12764] SecureChannel#38496415 - Remote certificate has errors:
System.Net Information: 0 : [12764] SecureChannel#38496415 -    Certificate name mismatch.
System.Net Information: 0 : [12764] SecureChannel#38496415 - Remote certificate was verified as invalid by the user.
System.Net Error: 0 : [12764] Exception in AppDomain#10923418::UnhandledExceptionHandler - The remote certificate is invalid according to the validation procedure..

यह जानने के बाद कि समस्या क्या है, आपको इसे हल करने में सक्षम होना चाहिए या कम से कम अपनी Google खोजों को कम करना चाहिए।


6

मेरा मुद्दा Windows 2003 सर्वर पर था, जब AuthenticateAsClient को कॉल कर रहा था। ऊपर दिए गए समाधान (उदाहरण के लिए खतना)ServicePointManager.ServerCertificateValidationCallback ) काम नहीं किए।

यह पता चला है कि यह Windows 2003 में एक बग है, और एक हॉटफ़िक्स है:

"Cryptography API का उपयोग करने वाले अनुप्रयोग Windows Server 2003 में X.509 प्रमाणपत्र को मान्य नहीं कर सकते हैं"

https://support.microsoft.com/en-us/kb/938397

इस हॉटफिक्स को स्थापित करने से मेरी समस्या हल हो गई।


5

मेरा मुद्दा यह नहीं था कि मैं सर्वर को URL के बजाय आईपी पते से संदर्भित कर रहा था। मैंने एक निजी नेटवर्क के अंदर उपयोग के लिए CA से एक हस्ताक्षरित प्रमाण पत्र खरीदा था। सर्टिफिकेट पर निर्दिष्ट URL सर्वर को संदर्भित करते समय मायने रखता है। एक बार जब मैंने प्रमाणपत्र में URL द्वारा सर्वर को संदर्भित किया तो सब कुछ काम करने लगा।


यह उत्तर ऊपरी होने के योग्य है, क्योंकि यह एक सामान्य गलती को इंगित करता है; लोग (स्वयं सहित) सोचते हैं कि होस्ट का उद्देश्य केवल सर्वर खोजने के लिए है।
मोजतबा

4

आपकी वेबसाइट फ़ोल्डर को नेटवर्क सेवा सुरक्षा की आवश्यकता है। विशेष रूप से web.config। यह प्रमाणपत्र के लिए आपकी रजिस्ट्री तक पहुंचने के लिए इस खाते का उपयोग करता है। यह आपके कोड में हैक जोड़ने की आवश्यकता को रोक देगा।


4

अपने कंप्यूटर की दिनांक और समय की जाँच करें। यदि यह गलत है, तो इसे वर्तमान समय में अपडेट करें या इंटरनेट से समय प्राप्त करने के लिए इसे स्वचालित रूप से सेट करें।

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


1
यदि आप वर्तमान समय से सिस्टम दिनांक "बहुत दूर" हैं, तो Google से प्राप्त प्रमाण पत्र की वैधता एक समस्या का कारण बनती है। यह जारी किया गया है और सूचना के लिए मान्य है कि बहुत वर्तमान समय में नहीं देखता है। यह केवल ऐसी चीज नहीं है जो इस समस्या का कारण बन सकती है। लेकिन यह निश्चित रूप से एक है कि कर सकते हैं।
दार्इ सोदि

1
मेरे मामले में इसे दोबारा जाँचने के लिए एक बेहद उपयोगी अनुस्मारक! ओकेम का रेजर और वह सब ... :) अब उस सीएमओएस बैटरी के बारे में ...
माइक जी

2

स्व-हस्ताक्षरित प्रमाण पत्र के साथ एक स्थानीय साइट से कनेक्ट करते समय इसी त्रुटि का सामना करने वालों के लिए, निम्नलिखित ब्लॉग पोस्ट ने मेरी मदद की।

http://brainof-dave.blogspot.com.au/2008/08/remote-certificate-is-invalid-according.html


2

हमारे मामले में समस्या आईआईएस सर्वर प्रमाण पत्र के कारण हुई थी। प्रमाणपत्र का विषय DNS नाम पर सेट किया गया था और उपयोगकर्ता आईपी एड्रेस द्वारा वेब साइट तक पहुंचने का प्रयास कर रहे थे, इसलिए .NET प्रमाणीकरण सत्यापन विफल हो गया। जब उपयोगकर्ता DNS नाम का उपयोग करने लगे तो समस्या गायब हो गई।

तो आपको अपना प्रोवाइडर यूआरएल बदल कर https: //CertificateSubject/xxx/xxx.application करना होगा


क्या आप इसे विस्तृत कर सकते हैं? मेरे मामले में ऐप एक सर्वर पर काम करता है और दूसरे पर काम नहीं करता है। मैं क्लूलेस हूं ... मैं विशेषज्ञ नहीं हूं, लेकिन डोमेन अभी भी काम करने वाले से जुड़ा हुआ है, और सर्वर प्रमाणपत्र पहले से ही दोनों मशीनों पर स्थापित है। अभी भी नहीं मिलता है कि यह किसी भी तरह से प्रासंगिक हो सकता है क्योंकि यह "दूरस्थ प्रमाण पत्र" कहता है।
माइकल ब्रेनट

2

इस प्रकार के मुद्दों की जाँच करने पर एक MSDN ब्लॉग लेख है:

ASP.NET की समस्या निवारण - सत्यापन प्रक्रिया के अनुसार दूरस्थ प्रमाणपत्र अमान्य है:
http://blogs.msdn.com/b/jpsanders/archive/2009/09/16/troublesourcing-asp-net-the-remote-certificate है-अमान्य-अनुसार करने के लिए-मान्यता-procedure.aspx


1

इस लाइन को जोड़ने से मेरे लिए काम किया। यह वास्तव में यहाँ वर्णित सभी प्रमाण पत्रों पर भरोसा करता है । हालांकि, इसका उपयोग मुख्य रूप से समस्या निवारण के लिए किया जा सकता है। यदि यह आपके लिए काम करता है, तो इसका मतलब है कि रिमोट सर्वर का प्रमाण पत्र आपकी मशीन में एक विश्वसनीय प्रमाण पत्र के रूप में नहीं जोड़ा गया है।

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

पूर्ण कोड है

private void sendAMail(String toAddress, String messageBody)
        {
            String msg = "Sending mail to : " + toAddress;

            MailMessage mail = new MailMessage();
            mail.To.Add(toAddress);
            mail.From = new MailAddress("from@mydomain.com");
            mail.Subject = "Subject: Test Mail";
            mail.Body = messageBody;
            mail.IsBodyHtml = true;            

            //Added this line here
            System.Net.ServicePointManager.ServerCertificateValidationCallback = new System.Net.Security.RemoteCertificateValidationCallback(RemoteServerCertificateValidationCallback);
            SmtpClient smtp = new SmtpClient();

            smtp.Host = "myhostname.com";            
            smtp.Credentials = new System.Net.NetworkCredential("sender@sample.com", "");
            smtp.EnableSsl = true;
            smtp.Port = 587;            
            smtp.Send(mail);            
        }


private bool RemoteServerCertificateValidationCallback(object sender, System.Security.Cryptography.X509Certificates.X509Certificate certificate, System.Security.Cryptography.X509Certificates.X509Chain chain, System.Net.Security.SslPolicyErrors sslPolicyErrors)
{
    //Console.WriteLine(certificate);
    return true;
}

0

इसने मेरी समस्या हल कर दी

smtpClient.Credentials = new NetworkCredential(sendMail.UserName, sendMail.Password);
smtpClient.EnableSsl = false;//sendMail.EnableSSL;

// संदर्भ के साथ // समस्या आती है केवल एसएमटीपी सेटिंग्स में उपयोगकर्ता नाम और पासवर्ड दर्ज करने पर त्रुटि को हल करने के लिए झूठी एसएसएल सेट करने के लिए ऊपर की रेखा का उपयोग करें।


13
इससे सुरक्षा भी बंद हो रही है।
ज़ोइ

0

यहाँ समाधान है कि मैं का उपयोग करने का फैसला किया है।

        ServicePointManager.ServerCertificateValidationCallback = delegate (object s, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors)
        {
            string name = certificate.Subject;

            DateTime expirationDate = DateTime.Parse(certificate.GetExpirationDateString());

            if (sslPolicyErrors == SslPolicyErrors.None || (sslPolicyErrors == SslPolicyErrors.RemoteCertificateNameMismatch && name.EndsWith(".acceptabledomain.com") && expirationDate > DateTime.Now))
            {
                return true;
            }
            return false;
        };

0

स्वीकृत उत्तर से कोड ने मुझे इस समस्या को डीबग करने में मदद की। मुझे तब एहसास हुआ कि certificateतर्क का एसएन क्षेत्र वैसा नहीं था जैसा मैंने सोचा था कि मेरा एसएमटीपी सर्वर था। Hostप्रमाण पत्र के एसएन मूल्य को SmtpClient उदाहरण की संपत्ति सेट करके मैं समस्या को ठीक करने में सक्षम था।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.