"প্রত্যয়ন শংসাপত্র বৈধকরণ পদ্ধতি অনুসারে অবৈধ” " Gmail এসএমটিপি সার্ভার ব্যবহার করে


221

আমি এই ত্রুটি পাচ্ছি:

রিমোট শংসাপত্র বৈধকরণ পদ্ধতি অনুসারে অবৈধ।

যখনই আমি আমার সি # কোডে জিমেইলের এসএমটিপি সার্ভারটি ব্যবহার করে ইমেল প্রেরণের চেষ্টা করি। এই সমস্যার সমাধানের জন্য কেউ আমাকে সঠিক দিকে নির্দেশ করতে পারে?

নিম্নলিখিত স্ট্যাক ট্রেস ...

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
আপনি কি আমাদের জিএমএল এসএমটিপি সার্ভারগুলি ব্যবহারের কনফিগারেশন সম্পর্কে আরও বলতে পারেন? আমার ভাগ্যবান অনুমান: আপনি কি এসএসএলের জন্য আপনার সুরক্ষা নীতি সম্পর্কে আমাদের আরও কিছু বলতে পারেন (যেমন একটি বৈধ / অবৈধ এসএসএল শংসাপত্র ব্যবহার করার মতো?)
ব্রায়ান ক্লোজেল

আপনি কি আমাদের একটি কোড নমুনা দিতে পারেন যেখানে আপনি ত্রুটিটি পুনরুত্পাদন করতে পারেন?
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;
            };
    }

174
এটি হ্যাক, ঠিক না?
এলবি

88
সমস্ত সুরক্ষা পুরোপুরি বন্ধ করে দেওয়ার পরিবর্তে কোনও স্থিরতা দেখতে পছন্দ করবেন।
রোমান স্টারকভ

71
সুরক্ষা সমস্যার সমাধান হিসাবে আপনি কি সুরক্ষা বন্ধ করতে পারেন? ডব্লিউটিএফ?
জন নিকোলাস

68
এটিকে হ্রাস করতে হয়েছিল, কারণ লোকেরা এখনও মনে করে এটি একটি সমাধান। এটি কেবল নিরাপত্তাটি চালু করছে। মানুষ, উত্পাদন ব্যবহার করবেন না । এমনকি তিনি তাই বলে। Sheesh।
এমজিওউইন

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

58

এখানে লিঙ্কটি আমার সমস্যার সমাধান করেছে।

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

আমি ওয়েব পরিষেবাদির ইউআরএল গিয়েছিলাম (সার্ভারে যে সমস্যাটি ছিল), আইই-তে সামান্য সুরক্ষা আইকনে ক্লিক করে, যা শংসাপত্রটি নিয়ে আসে। তারপরে আমি বিশদ ট্যাবে ক্লিক করেছি, অনুলিপি ফাইল বোতামে ক্লিক করেছি, যা আমাকে .cer ফাইল হিসাবে সার্টিফিকেট রফতানি করার অনুমতি দেয় allowed একবার স্থানীয়ভাবে শংসাপত্রটি পেয়ে গেলে আমি নীচের নির্দেশাবলী ব্যবহার করে এটি সার্ভারের শংসাপত্রের দোকানে আমদানি করতে সক্ষম হয়েছি।

একটি নতুন এমএমসি শুরু করুন। ফাইল -> স্ন্যাপ-ইন যোগ / সরান ... যোগ ক্লিক করুন ... শংসাপত্র চয়ন করুন এবং অ্যাড ক্লিক করুন। "কম্পিউটার অ্যাকাউন্ট" রেডিও বোতামটি পরীক্ষা করুন। পরবর্তী ক্লিক করুন।

পরবর্তী স্ক্রিনে ক্লায়েন্ট কম্পিউটার চয়ন করুন। সমাপ্তি ক্লিক করুন। বন্ধ ক্লিক করুন। ঠিক আছে ক্লিক করুন। এখন বিশ্বস্ত রুট শংসাপত্র কর্তৃপক্ষের শংসাপত্রের দোকানে শংসাপত্রটি ইনস্টল করুন। এটি সমস্ত ব্যবহারকারীকে শংসাপত্রের উপর আস্থা রাখতে সহায়তা করবে।


সার্টে আমদানি সরঞ্জামের মাধ্যমে শংসাপত্র আমদানি করার সময় +1 এবং স্ন্যাপ ইন এর মাধ্যমে নয়, এটি কেবল আপনার ব্যবহারকারীর অ্যাকাউন্টের জন্য। স্ন্যাপ ইন ব্যবহার করে আপনাকে আমদানি কার, ব্যবহারকারী অ্যাকাউন্ট, পরিষেবা অ্যাকাউন্ট বা প্রত্যেকের জন্য বেছে নিতে দেয়। আপনার পয়েন্টার জন্য ধন্যবাদ। আমি সেখানে দু'এক মিনিটের জন্য মাথা ছোঁড়াচ্ছিলাম!
ডেভিডব

আপনি যদি সমস্ত ডিভ / টেস্ট ওয়ার্কস্টেশনগুলিতে স্বয়ংক্রিয় করতে কমান্ড লাইনটি ব্যবহার করতে চান - certutil -f -p test -importPFX Root devcert.pfxএবং certutil -f -p test -importPFX MY devcert.pfx। অ্যাডমিন কমান্ড প্রম্পটে চালানোর দরকার (পিএফএক্স পাসওয়ার্ডটি ধরে নেওয়া test)
ডিপস্পেস 101

এটি পরীক্ষার জন্য যদি আপনি স্ব-স্বাক্ষরিত শংসাপত্র ব্যবহার করেন তবে এটি ঠিক করার সেরা উপায়, ধন্যবাদ টি-রেক্স!
টোস্টিমাগলস

37

আপনি যখন চালিয়ে যেতে চান কিনা তা শংসাপত্রটি বৈধ নয় যখন আপনি ব্যবহারকারীকে জিজ্ঞাসা করে কোডটি উন্নত করতে পারেন। আপনি কি অবিরত করতে চান? নীচের হিসাবে:

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
কে এই ক্লাউড অ্যাপ্লিকেশনটি থাকলে "চালিয়ে যান" বোতামটি ক্লিক করবেন?
কনস্ট্যান্টিন Isaসায়েভ

34

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

আমরা যে কোডটি ব্যবহার করি (মাইক্রোসফ্ট এর সৌজন্যে - 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
আমার ক্ষেত্রে sslPolicyErferences ছিল রিমোটকার্টিফিকেট নেমমিশম্যাচ এবং আমি শংসাপত্রের চেকটি পরিবর্তন করেছি কারণ আমাদের একই সাবজেক্ট এবং ইস্যুয়ার মান নেই।
উফুক হ্যাকোওলুলার

2
এক্স 509 সার্টিফিকেট এক্সচেঞ্জ সার্ভার ব্যবহৃত স্ব-স্বাক্ষরিত এবং বিশ্বস্তের মধ্যে স্যুইচিং রাখে kept এই কোডটি ব্যবহার করা আমার নেটওয়ার্ক অ্যাডমিনকে সাহায্য করেছে এবং আমাকে কেবল এটিই ছিল না তা বুঝতে পেরেছিল, কেবল স্ব-স্বাক্ষরিত শংসাপত্রগুলি বাইপাস করে সমস্যার সম্পূর্ণরূপে সমাধান করেছে। এই নিখুঁত ছিল!
ব্রেট

20

আমার ঠিক একই সমস্যা ছিল এবং বুঝতে পেরেছিলাম যে ডিফল্টরূপে অ্যাভাস্ট অ্যান্টিভাইরাস থেকে মেল শিল্ডটি "স্ক্যান এসএসএল সংযোগ" সক্রিয় হয়েছিল। এটি বন্ধ করতে ভুলবেন না ।

আমার জ্ঞান থেকে, আভাস্ট মেলটি "খুলবে" , কোনও ভাইরাসের জন্য এটি স্ক্যান করবে এবং তারপরে এটি নিজস্ব শংসাপত্র ব্যবহার করে স্বাক্ষর করবে যাতে মেলটি আর Gmail এর শংসাপত্র দ্বারা স্বাক্ষরিত হয় না যা এই ত্রুটি সৃষ্টি করে।

সমাধান 1:

  • আপনার অ্যান্টিভাইরাস (বা পুরো মেল শিল্ড) থেকে এসএসএল স্ক্যানগুলি বন্ধ করুন।

সমাধান 2 (সর্বোত্তম সুরক্ষা বলার উচিত):

  • কোনওভাবে অ্যান্টিভাইরাস দ্বারা ব্যবহৃত শংসাপত্র পান (অ্যাভাস্টের এটি রফতানির জন্য বিকল্প রয়েছে)
  • জিমেইল সার্ভারের সাথে সংযুক্ত হওয়ার আগে এটি আপনার ইমাম / পপ / এসএমটিপি ক্লায়েন্টে আমদানি করুন।

1
তুমি আমাকে অনেক সময় বাঁচিয়েছ আমার অ্যান্টিভাইরাসটি আমার কোড নয়, দোষারোপ করবে তা নির্ধারণের জন্য চিরকালের জন্য নিয়ে এসেছি।
aराव6

13

এসএসএল এর কারণে দৃষ্টিভঙ্গি থেকে প্রেরণের সময় একই ত্রুটি পান। চেষ্টা করা সেটিংস সক্ষম এসএসএসএল = মিথ্যা সমস্যার সমাধান করেছে।

উদাহরণ:

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
আপনি এসএসএলকে মিথ্যা হিসাবে সেট করার সময় gmail আপনাকে সংযোগ করতে দেয় না, আমি আপনার সমাধানটি চেষ্টা করেছিলাম এটি আমার পক্ষে কার্যকর হয়নি।
জিশান আজমল

হ্যাঁ, এটাকেই আমি "বেসিক" বলছি (বনাম "কিছুই নয়" বা "এসএসএল") ....... এই ইমেল সেটিংসটি কখনও কখনও জটিল হয়।
গ্রানাডা কোডার

9

আপনি কি নিশ্চিত যে আপনি সঠিক এসএমটিপি সার্ভারের ঠিকানাটি ব্যবহার করছেন?

উভয়ই smtp.google.com এবং smtp.gmail.com কাজ করে তবে দ্বিতীয়টিতে এসএসএল শংসাপত্র জারি করা হয়।


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

আমি জানি আমি এই গেমটি থেকে বেশ দেরিতে এসেছি, তবে আমি এখানে টিএসএস স্ট্রিমের জন্য সিস্টেম.ডায়াগনস্টিক লগগুলিতে ইঙ্গিত করে কোনও উত্তর দেখিনি।

আপনার কোডে কোনও পরিবর্তন করার আগে সমস্যাটি কী তা আপনি বুঝতে পেরেছেন তা নিশ্চিত করুন। AuthenticationExceptionযে খুব জেনেরিক ব্যতিক্রম যা অনেক বলুন না এক। হুডের অধীনে কী চলছে তা জানতে আপনার অ্যাপ্লিকেশনটির জন্য app.config ফাইলটি সম্পাদনা করুন (বা একটি নতুন তৈরি করুন) এবং বিভাগটিতে আপনার সিস্টেম. নেট ট্রেস উত্স সক্ষম হয়েছে তা নিশ্চিত করুন 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>

আপনার অ্যাপ্লিকেশনটি পুনরায় চালু করুন এবং সি:। নেটওয়ার্ক.লগ ফাইলটি পরীক্ষা করুন। আপনার টিএলএস (এসএসএল) সংযোগ সম্পর্কে আপনার এখানে বিশদ তথ্য দেখতে হবে, উদাহরণস্বরূপ:

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..

সমস্যার কারণ কী তা জেনেও আপনার সমাধান করা উচিত বা কমপক্ষে আপনার গুগল অনুসন্ধান সংকুচিত করা উচিত।


6

আমার ইস্যুটি উইন্ডোজ 2003 সার্ভারে ছিল, যখন প্রমাণীকরণের জন্য কল করা হয়েছিল। উপরের সমাধানগুলি (উদাঃ পরিবেষ্টন)ServicePointManager.ServerCertificateValidationCallback ) কার্যকর হয়নি।

উইন্ডোজ 2003 এ এটি একটি বাগ রয়েছে এবং এটির একটি হটফিক্স রয়েছে:

"অ্যাপ্লিকেশনগুলি যা ক্রিপ্টোগ্রাফি এপিআই ব্যবহার করে উইন্ডোজ সার্ভার 2003 এ একটি X.509 শংসাপত্রটি বৈধতা দিতে পারে না"

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

এই হটফিক্সটি ইনস্টল করা আমার সমস্যার সমাধান করেছে।


4

আপনার ওয়েবসাইট ফোল্ডারে নেটওয়ার্ক পরিষেবা সুরক্ষা দরকার। বিশেষত ওয়েবকনফিগ। শংসাপত্রগুলির জন্য আপনার রেজিস্ট্রি অ্যাক্সেস করতে এটি এই অ্যাকাউন্টটি ব্যবহার করে। এটি আপনার কোডটিতে একটি হ্যাক যুক্ত করার প্রয়োজন বন্ধ করবে।


4

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


এই উত্তরটি উচ্চতর হওয়ার যোগ্য, কারণ এটি একটি সাধারণ ভুলকে নির্দেশ করে; লোকেরা (আমার সহ) মনে করে যে হোস্টের উদ্দেশ্য কেবল সার্ভারটি অনুসন্ধানের জন্য।
মোজতাবা

4

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

কারণ শংসাপত্রগুলি একটি নির্দিষ্ট সময়ের সাথে আবদ্ধ থাকে, যদি আপনার ঘড়িটি ভুল হয়, আপনি সম্ভবত এর মতো ত্রুটি পেতে পারেন। সেই পরিস্থিতিতে সময় নির্ধারণের মাধ্যমে সমস্যাটি ঠিক হয়ে যাবে be


1
যদি আপনার সিস্টেমের তারিখ বর্তমান সময় থেকে "খুব বেশি দূরে" থাকে তবে গুগল থেকে প্রাপ্ত শংসাপত্রের বৈধতা সমস্যার কারণ হয়ে দাঁড়ায়। এটি জারি করা এবং তথ্যের বৈধতা দেখায় যা বর্তমান সময়কে বেশি দেয় না। এটি কেবল এই বিষয়টির কারণ হতে পারে না। তবে এটি অবশ্যই পারে।
ফিল soady

1
আমার ক্ষেত্রে এটি ডাবল চেক করতে একটি বিশাল দরকারী অনুস্মারক! ওকামের রেজার এবং সমস্ত ... :) এখন সেই সিএমওএস ব্যাটারি সম্পর্কে ...
মাইক জি

2

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

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


2

আইআইএস সার্ভার শংসাপত্রের কারণে আমাদের ক্ষেত্রে সমস্যা হয়েছিল। শংসাপত্রের বিষয়টি ডিএনএস নামে সেট করা হয়েছিল এবং ব্যবহারকারীরা আইপি অ্যাড্রেস দ্বারা ওয়েব সাইটে অ্যাক্সেস করার চেষ্টা করছেন, তাই। নেট শংসাপত্রের যাচাইকরণ ব্যর্থ হয়েছিল। ব্যবহারকারীরা ডিএনএস নাম ব্যবহার করা শুরু করলে সমস্যা অদৃশ্য হয়ে গেল।

সুতরাং আপনাকে আপনার সরবরাহকারী ইউআরএলটি https: // সার্টিফিকেট সাবজেক্ট / XXXx/xxx.application এ পরিবর্তন করতে হবে


আপনি এই বিস্তারিত বলতে পারেন? আমার ক্ষেত্রে অ্যাপ্লিকেশনটি একটি সার্ভারে কাজ করে এবং অন্যটিতে কাজ করে না। আমি নিখুঁত ... আমি কোনও বিশেষজ্ঞ নই, তবে ডোমেনটি এখনও কর্মক্ষমের সাথে সংযুক্ত এবং সার্ভার শংসাপত্র দুটি মেশিনে ইতিমধ্যে ইনস্টল করা আছে। "রিমোট শংসাপত্র" বলার পরে কেন এটি কোনওভাবেই প্রাসঙ্গিক হতে পারে তা পান না Still
মাইকেল ব্রেন্ট

2

এই ধরণের সমস্যাগুলি অনুসন্ধানের জন্য একটি এমএসডিএন ব্লগ নিবন্ধ রয়েছে:

সমস্যা সমাধানের এএসপি.নেট - রিমোট শংসাপত্রটি বৈধতা পদ্ধতি অনুসারে অবৈধ:
http://blogs.msdn.com/b/jpsanders/archive/2009/09/16/troubleshooting-asp-net-the-remote-certificate- is-অবৈধ-অনুযায়ী টু দ্যা বৈধতা-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আর্গুমেন্টের এসএন ক্ষেত্রটি আমার এসএমটিপি সার্ভার হিসাবে ভেবেছিল as Hostশংসাপত্রের এসএন মানে শ্রীমতিপ্লিয়েন্ট উদাহরণটির সম্পত্তি সেট করে আমি সমস্যাটি সমাধান করতে সক্ষম হয়েছি।

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