요청이 중단되었습니다. 공유 호스팅 서버에서 ssl / tls 보안 채널을 만들 수 없습니다. C #

asp.net asp.net-mvc c# html-agility-pack httpwebrequest

문제

webrequest 또는 htmlagilitypack 사용하여 https 서버에 연결할 수 없습니다. 아래 오류가 표시됩니다.

The underlying connection was closed: An unexpected error occurred on a receive.System.Net.WebException: 또는 could not create SSL/TLS secure channel on server The underlying connection was closed: An unexpected error occurred on a receive.System.Net.WebException:

우리 코드는 localhost에서 잘 작동하며 코드 파일에서 다음 부분을 추가했지만 서버에서만 왜 그런 일이 발생하는지 확인할 수는 없습니다.

ServicePointManager.Expect100Continue = true;

ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3 | SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12;

누구든지 이것에 대한 아이디어가 있다면 우리와 공유하십시오.

인기 답변

때로는 webrequest 자체 서명 된 인증서를 받아들이지 않을 것입니다 때문입니다. 나는이 싱글 톤 클래스를 보통 사용한다. 자체 서명 된 모든 인증서를 허용합니다. 액세스하려는 URL을 공유하는 경우 더 간단한 해결책이 있는지 쉽게 판단 할 수 있습니다.

public sealed class Certificates
{
    private static Certificates instance = null;
    private static readonly object padlock = new object();

    Certificates()
    {
    }

    public static Certificates Instance
    {
        get
        {
            lock (padlock)
            {
                if (instance == null)
                {
                    instance = new Certificates();
                }
                return instance;
            }
        }
    }
    public void GetCertificatesAutomatically()
    {
        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;
    }

}

웹 요청을하기 전에 메서드를 호출하면됩니다.

Certificates.Instance.GetCertificatesAutomatically();

또한 웹 요청을하는 방법 (코드)을 볼 수 있다면 문제를 진단하는 데 도움이됩니다.



아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.
아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.