Запрос был прерван: не удалось создать безопасный канал SSL / TLS

Мой клиент сообщил мне о проблемах с их SSL и Internet Explorer. Они сказали, что получают проблемы с доверием при доступе к URL.

Я получаю доступ к JSON через HTTPS. Веб-сайт расположен на одном сервере, и я использую консольное приложение на своем локальном компьютере. Я пытаюсь обойти сертификат SSL, однако мой код все еще не работает.

Могу ли я изменить HttpWebRequest для решения этой проблемы?

Я получаю эту ошибку, используя этот код:

    // You must change the URL to point to your Web server.
        HttpWebRequest req = (HttpWebRequest)WebRequest.Create(url);
        req.Method = "GET";
        req.AllowAutoRedirect = true;

        // allows for validation of SSL conversations
        ServicePointManager.ServerCertificateValidationCallback = delegate { return true; };


        WebResponse respon = req.GetResponse();
        Stream res = respon.GetResponseStream();

        string ret = "";
        byte[] buffer = new byte[1048];
        int read = 0;
        while ((read = res.Read(buffer, 0, buffer.Length)) > 0)
        {
            //Console.Write(Encoding.ASCII.GetString(buffer, 0, read));
            ret += Encoding.ASCII.GetString(buffer, 0, read);
        }
        return ret;
 Joseph Anderson31 мая 2012 г., 03:20
Нет, клиент говорит Comodo.
 Chris Moschini03 окт. 2017 г., 21:05
 Carsten Schütte30 мая 2012 г., 21:03
Вы используете самозаверяющие сертификаты?

Ответы на вопрос(6)

Решение Вопроса

http://blogs.msdn.com/b/dgorti/archive/2005/09/18/471003.aspx

Журнал находился в папке bin / debug (я находился в режиме отладки для моего консольного приложения). Вам необходимо добавить тип протокола безопасности как SSL 3

Я получил несоответствие алгоритма в журнале. Вот мой новый код:

        // You must change the URL to point to your Web server.
        HttpWebRequest req = (HttpWebRequest)WebRequest.Create(url);
        req.Method = "GET";
        ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3;


        // Skip validation of SSL/TLS certificate
        ServicePointManager.ServerCertificateValidationCallback = delegate { return true; };


        WebResponse respon = req.GetResponse();
        Stream res = respon.GetResponseStream();

        string ret = "";
        byte[] buffer = new byte[1048];
        int read = 0;
        while ((read = res.Read(buffer, 0, buffer.Length)) > 0)
        {
            Console.Write(Encoding.ASCII.GetString(buffer, 0, read));
            ret += Encoding.ASCII.GetString(buffer, 0, read);
        }
        return ret;
 21 окт. 2014 г., 17:47
Важно отметить, что ошибка (security.stackexchange.com/a/70724) был найден в SSLv3, и большинство реализаций больше не позволяют его. Вы должны использоватьSecurityProtocolType.Tls12 вместо.
 21 мая 2015 г., 11:27
Помните, что использование этого решения подразумевает, чтоany сертификат сервера будет принят как действительный (так какServerCertificateValidationCallback всегда возвращает истину)
 19 апр. 2018 г., 00:00
устранение неполадок с помощьюMethod = "HEAD" ?

чтобы решить эту проблему:

    ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls
        | SecurityProtocolType.Tls11
        | SecurityProtocolType.Tls12
        | SecurityProtocolType.Ssl3;
 08 окт. 2015 г., 19:23
приятно знать, что множественные значения могут быть установлены таким образом (как, конечно, можно сделать с помощью enum).
 07 февр. 2017 г., 17:10
@NicholasPetersen FYI это можно сделать только с помощью перечислений с атрибутом Flags. Увидетьmsdn.microsoft.com/en-us/library/…
 26 янв. 2015 г., 14:30
Потерял 2 дня, чтобы понять это, декомпилировал класс HttpWebRequest, но помогло только переключение на TLS.
 24 окт. 2017 г., 03:54
Для тех, кто использует пример кода PaymentExpress и его новую среду UAT (uat.paymentexpress.com/pxaccess/pxpay.aspx) он должен использовать TLS 1.2 и новее. Вы должны иметь строку кода в ответе, представленном выше, непосредственно перед & quot; var requestStream = webReq.GetRequestStream (); & apos;
 29 мар. 2017 г., 11:34
Я использую ASP.NET MVC 4, и ваш фрагмент не работает для меня. Но я следую сообщению об ошибке и заставляю его работать, удаляя .Tls11 и .Tls12. Благодарю.

У меня был сертификат, который был:

(ниже выводится в mmc, свойства сертификата)

Digital Signature, Key Encipherment (a0)

(вывод ниже был из моего кода C # ниже)

X509Extension.X509KeyUsageExtension.KeyUsages='KeyEncipherment, DigitalSignature' X509KeyUsageExtension.KeyUsages.X509KeyUsageFlags.CrlSign = & APOS; Ложные & APOS; X509KeyUsageExtension.KeyUsages.X509KeyUsageFlags.DataEncipherment = & APOS; Ложные & APOS; X509KeyUsageExtension.KeyUsages.X509KeyUsageFlags.DecipherOnly = & APOS; Ложные & APOS; X509KeyUsageExtension.KeyUsages.X509KeyUsageFlags.DigitalSignature = & APOS;True& APOS; X509KeyUsageExtension.KeyUsages.X509KeyUsageFlags.EncipherOnly = & APOS; Ложные & APOS; X509KeyUsageExtension.KeyUsages.X509KeyUsageFlags.KeyAgreement = & APOS; Ложные & APOS; X509KeyUsageExtension.KeyUsages.X509KeyUsageFlags.KeyCertSign = & APOS; Ложные & APOS; X509KeyUsageExtension.KeyUsages.X509KeyUsageFlags.KeyEncipherment = & APOS;True& APOS; X509KeyUsageExtension.KeyUsages.X509KeyUsageFlags.None = & APOS; Ложные & APOS; X509KeyUsageExtension.KeyUsages.X509KeyUsageFlags.NonRepudiation = & APOS; Ложные & APOS;

выше сделалnot Работа.

===============================

Затем еще один сертификат с:

(ниже выводится в mmc, свойства сертификата)

Certificate Signing, Off-line CRL Signing, CRL Signing (06)

(вывод ниже был из моего кода C # ниже)

X509Extension.X509KeyUsageExtension.KeyUsages='CrlSign, KeyCertSign' X509KeyUsageExtension.KeyUsages.X509KeyUsageFlags.CrlSign = & APOS;True& APOS; X509KeyUsageExtension.KeyUsages.X509KeyUsageFlags.DataEncipherment = & APOS; Ложные & APOS; X509KeyUsageExtension.KeyUsages.X509KeyUsageFlags.DecipherOnly = & APOS; Ложные & APOS; X509KeyUsageExtension.KeyUsages.X509KeyUsageFlags.DigitalSignature = & APOS; Ложные & APOS; X509KeyUsageExtension.KeyUsages.X509KeyUsageFlags.EncipherOnly = & APOS; Ложные & APOS; X509KeyUsageExtension.KeyUsages.X509KeyUsageFlags.KeyAgreement = & APOS; Ложные & APOS; X509KeyUsageExtension.KeyUsages.X509KeyUsageFlags.KeyCertSign = & APOS;True& APOS; X509KeyUsageExtension.KeyUsages.X509KeyUsageFlags.KeyEncipherment = & APOS; Ложные & APOS; X509KeyUsageExtension.KeyUsages.X509KeyUsageFlags.None = & APOS; Ложные & APOS; X509KeyUsageExtension.KeyUsages.X509KeyUsageFlags.NonRepudiation = & APOS; Ложные & APOS;

и этоdid work

Приведенный ниже код позволит вам проверить ваш сертификат клиента

using System;
using System.Collections.Generic;
using System.Linq;
using System.Security.Cryptography;
using System.Security.Cryptography.X509Certificates;
using System.Text;

namespace MyNamespace
{
    public static class SecurityShower
    {
        public static void ShowHttpWebRequest(System.Net.HttpWebRequest hwr)
        {
            StringBuilder sb = new StringBuilder();
            if (null != hwr)
            {
                sb.Append("-----------------------------------------------HttpWebRequest" + System.Environment.NewLine);
                sb.Append(string.Format("HttpWebRequest.Address.AbsolutePath='{0}'", hwr.Address.AbsolutePath) + System.Environment.NewLine);
                sb.Append(string.Format("HttpWebRequest.Address.AbsoluteUri='{0}'", hwr.Address.AbsoluteUri) + System.Environment.NewLine);
                sb.Append(string.Format("HttpWebRequest.Address='{0}'", hwr.Address) + System.Environment.NewLine);

                sb.Append(string.Format("HttpWebRequest.RequestUri.AbsolutePath='{0}'", hwr.RequestUri.AbsolutePath) + System.Environment.NewLine);
                sb.Append(string.Format("HttpWebRequest.RequestUri.AbsoluteUri='{0}'", hwr.RequestUri.AbsoluteUri) + System.Environment.NewLine);
                sb.Append(string.Format("HttpWebRequest.RequestUri='{0}'", hwr.RequestUri) + System.Environment.NewLine);

                foreach (X509Certificate cert in hwr.ClientCertificates)
                {
                    sb.Append("START*************************************************");
                    ShowX509Certificate(sb, cert);
                    sb.Append("END*************************************************");
                }
            }

            string result = sb.ToString();
            Console.WriteLine(result);
        }

        public static void ShowCertAndChain(X509Certificate2 cert)
        {
            X509Chain chain = new X509Chain();
            chain.ChainPolicy.RevocationFlag = X509RevocationFlag.EntireChain;
            chain.ChainPolicy.RevocationMode = X509RevocationMode.Offline;
            chain.ChainPolicy.VerificationFlags = X509VerificationFlags.AllFlags;

            ////chain.ChainPolicy.VerificationFlags = X509VerificationFlags.IgnoreCtlSignerRevocationUnknown &&
            ////X509VerificationFlags.IgnoreRootRevocationUnknown &&
            ////X509VerificationFlags.IgnoreEndRevocationUnknown &&
            ////X509VerificationFlags.IgnoreCertificateAuthorityRevocationUnknown &&
            ////X509VerificationFlags.IgnoreCtlNotTimeValid;

            chain.Build(cert);

            ShowCertAndChain(cert, chain);
        }

        public static void ShowCertAndChain(X509Certificate cert, X509Chain chain)
        {
            StringBuilder sb = new StringBuilder();
            if (null != cert)
            {
                ShowX509Certificate(sb, cert);
            }

            if (null != chain)
            {
                sb.Append("-X509Chain(Start)-" + System.Environment.NewLine);
                ////sb.Append(string.Format("Cert.ChainStatus='{0}'", string.Join(",", chain.ChainStatus.ToList())) + System.Environment.NewLine);

                foreach (X509ChainStatus cstat in chain.ChainStatus)
                {
                    sb.Append(string.Format("X509ChainStatus::'{0}'-'{1}'", cstat.Status.ToString(), cstat.StatusInformation) + System.Environment.NewLine);
                }

                X509ChainElementCollection ces = chain.ChainElements;
                ShowX509ChainElementCollection(sb, ces);
                sb.Append("-X509Chain(End)-" + System.Environment.NewLine);
            }

            string result = sb.ToString();
            Console.WriteLine(result);
        }

        private static void ShowX509Extension(StringBuilder sb, int x509ExtensionCount, X509Extension ext)
        {
            sb.Append(string.Empty + System.Environment.NewLine);
            sb.Append(string.Format("--------X509ExtensionNumber(Start):{0}", x509ExtensionCount) + System.Environment.NewLine);
            sb.Append(string.Format("X509Extension.Critical='{0}'", ext.Critical) + System.Environment.NewLine);

            AsnEncodedData asndata = new AsnEncodedData(ext.Oid, ext.RawData);
            sb.Append(string.Format("Extension type: {0}", ext.Oid.FriendlyName) + System.Environment.NewLine);
            sb.Append(string.Format("Oid value: {0}", asndata.Oid.Value) + System.Environment.NewLine);
            sb.Append(string.Format("Raw data length: {0} {1}", asndata.RawData.Length, Environment.NewLine) + System.Environment.NewLine);
            sb.Append(asndata.Format(true) + System.Environment.NewLine);

            X509BasicConstraintsExtension basicEx = ext as X509BasicConstraintsExtension;
            if (null != basicEx)
            {
                sb.Append("-X509BasicConstraintsExtension-" + System.Environment.NewLine);
                sb.Append(string.Format("X509Extension.X509BasicConstraintsExtension.CertificateAuthority='{0}'", basicEx.CertificateAuthority) + System.Environment.NewLine);
            }

            X509EnhancedKeyUsageExtension keyEx = ext as X509EnhancedKeyUsageExtension;
            if (null != keyEx)
            {
                sb.Append("-X509EnhancedKeyUsageExtension-" + System.Environment.NewLine);
                sb.Append(string.Format("X509Extension.X509EnhancedKeyUsageExtension.EnhancedKeyUsages='{0}'", keyEx.EnhancedKeyUsages) + System.Environment.NewLine);
                foreach (Oid oi in keyEx.EnhancedKeyUsages)
                {
                    sb.Append(string.Format("------------EnhancedKeyUsages.Oid.FriendlyName='{0}'", oi.FriendlyName) + System.Environment.NewLine);
                    sb.Append(string.Format("------------EnhancedKeyUsages.Oid.Value='{0}'", oi.Value) + System.Environment.NewLine);
                }
            }

            X509KeyUsageExtension usageEx = ext as X509KeyUsageExtension;
            if (null != usageEx)
            {
                sb.Append("-X509KeyUsageExtension-" + System.Environment.NewLine);
                sb.Append(string.Format("X509Extension.X509KeyUsageExtension.KeyUsages='{0}'", usageEx.KeyUsages) + System.Environment.NewLine);
                sb.Append(string.Format("X509KeyUsageExtension.KeyUsages.X509KeyUsageFlags.CrlSign='{0}'", (usageEx.KeyUsages & X509KeyUsageFlags.CrlSign) != 0) + System.Environment.NewLine);
                sb.Append(string.Format("X509KeyUsageExtension.KeyUsages.X509KeyUsageFlags.DataEncipherment='{0}'", (usageEx.KeyUsages & X509KeyUsageFlags.DataEncipherment) != 0) + System.Environment.NewLine);
                sb.Append(string.Format("X509KeyUsageExtension.KeyUsages.X509KeyUsageFlags.DecipherOnly='{0}'", (usageEx.KeyUsages & X509KeyUsageFlags.DecipherOnly) != 0) + System.Environment.NewLine);
                sb.Append(string.Format("X509KeyUsageExtension.KeyUsages.X509KeyUsageFlags.DigitalSignature='{0}'", (usageEx.KeyUsages & X509KeyUsageFlags.DigitalSignature) != 0) + System.Environment.NewLine);
                sb.Append(string.Format("X509KeyUsageExtension.KeyUsages.X509KeyUsageFlags.EncipherOnly='{0}'", (usageEx.KeyUsages & X509KeyUsageFlags.EncipherOnly) != 0) + System.Environment.NewLine);
                sb.Append(string.Format("X509KeyUsageExtension.KeyUsages.X509KeyUsageFlags.KeyAgreement='{0}'", (usageEx.KeyUsages & X509KeyUsageFlags.KeyAgreement) != 0) + System.Environment.NewLine);
                sb.Append(string.Format("X509KeyUsageExtension.KeyUsages.X509KeyUsageFlags.KeyCertSign='{0}'", (usageEx.KeyUsages & X509KeyUsageFlags.KeyCertSign) != 0) + System.Environment.NewLine);
                sb.Append(string.Format("X509KeyUsageExtension.KeyUsages.X509KeyUsageFlags.KeyEncipherment='{0}'", (usageEx.KeyUsages & X509KeyUsageFlags.KeyEncipherment) != 0) + System.Environment.NewLine);
                sb.Append(string.Format("X509KeyUsageExtension.KeyUsages.X509KeyUsageFlags.None='{0}'", (usageEx.KeyUsages & X509KeyUsageFlags.None) != 0) + System.Environment.NewLine);
                sb.Append(string.Format("X509KeyUsageExtension.KeyUsages.X509KeyUsageFlags.NonRepudiation='{0}'", (usageEx.KeyUsages & X509KeyUsageFlags.NonRepudiation) != 0) + System.Environment.NewLine);
            }

            X509SubjectKeyIdentifierExtension skIdEx = ext as X509SubjectKeyIdentifierExtension;
            if (null != skIdEx)
            {
                sb.Append("-X509SubjectKeyIdentifierExtension-" + System.Environment.NewLine);
                sb.Append(string.Format("X509Extension.X509SubjectKeyIdentifierExtension.Oid='{0}'", skIdEx.Oid) + System.Environment.NewLine);
                sb.Append(string.Format("X509Extension.X509SubjectKeyIdentifierExtension.SubjectKeyIdentifier='{0}'", skIdEx.SubjectKeyIdentifier) + System.Environment.NewLine);
            }

            sb.Append(string.Format("--------X509ExtensionNumber(End):{0}", x509ExtensionCount) + System.Environment.NewLine);
        }

        private static void ShowX509Extensions(StringBuilder sb, string cert2SubjectName, X509ExtensionCollection extColl)
        {
            int x509ExtensionCount = 0;
            sb.Append(string.Format("--------ShowX509Extensions(Start):for:{0}", cert2SubjectName) + System.Environment.NewLine);
            foreach (X509Extension ext in extColl)
            {
                ShowX509Extension(sb, ++x509ExtensionCount, ext);
            }

            sb.Append(string.Format("--------ShowX509Extensions(End):for:{0}", cert2SubjectName) + System.Environment.NewLine);
        }

        private static void ShowX509Certificate2(StringBuilder sb, X509Certificate2 cert2)
        {
            if (null != cert2)
            {
                sb.Append(string.Format("X509Certificate2.SubjectName.Name='{0}'", cert2.SubjectName.Name) + System.Environment.NewLine);
                sb.Append(string.Format("X509Certificate2.Subject='{0}'", cert2.Subject) + System.Environment.NewLine);
                sb.Append(string.Format("X509Certificate2.Thumbprint='{0}'", cert2.Thumbprint) + System.Environment.NewLine);
                sb.Append(string.Format("X509Certificate2.HasPrivateKey='{0}'", cert2.HasPrivateKey) + System.Environment.NewLine);
                sb.Append(string.Format("X509Certificate2.Version='{0}'", cert2.Version) + System.Environment.NewLine);
                sb.Append(string.Format("X509Certificate2.NotBefore='{0}'", cert2.NotBefore) + System.Environment.NewLine);
                sb.Append(string.Format("X509Certificate2.NotAfter='{0}'", cert2.NotAfter) + System.Environment.NewLine);
                sb.Append(string.Format("X509Certificate2.PublicKey.Key.KeySize='{0}'", cert2.PublicKey.Key.KeySize) + System.Environment.NewLine);

                ////List<X509KeyUsageExtension> keyUsageExtensions = cert2.Extensions.OfType<X509KeyUsageExtension>().ToList();
                ////List<X509Extension> extensions = cert2.Extensions.OfType<X509Extension>().ToList();

                ShowX509Extensions(sb, cert2.Subject, cert2.Extensions);
            }
        }

        private static void ShowX509ChainElementCollection(StringBuilder sb, X509ChainElementCollection ces)
        {
            int x509ChainElementCount = 0;
            foreach (X509ChainElement ce in ces)
            {
                sb.Append(string.Empty + System.Environment.NewLine);
                sb.Append(string.Format("----X509ChainElementNumber:{0}", ++x509ChainElementCount) + System.Environment.NewLine);
                sb.Append(string.Format("X509ChainElement.Cert.SubjectName.Name='{0}'", ce.Certificate.SubjectName.Name) + System.Environment.NewLine);
                sb.Append(string.Format("X509ChainElement.Cert.Issuer='{0}'", ce.Certificate.Issuer) + System.Environment.NewLine);
                sb.Append(string.Format("X509ChainElement.Cert.Thumbprint='{0}'", ce.Certificate.Thumbprint) + System.Environment.NewLine);
                sb.Append(string.Format("X509ChainElement.Cert.HasPrivateKey='{0}'", ce.Certificate.HasPrivateKey) + System.Environment.NewLine);

                X509Certificate2 cert2 = ce.Certificate as X509Certificate2;
                ShowX509Certificate2(sb, cert2);

                ShowX509Extensions(sb, cert2.Subject, ce.Certificate.Extensions);
            }
        }

        private static void ShowX509Certificate(StringBuilder sb, X509Certificate cert)
        {
            sb.Append("-----------------------------------------------" + System.Environment.NewLine);
            sb.Append(string.Format("Cert.Subject='{0}'", cert.Subject) + System.Environment.NewLine);
            sb.Append(string.Format("Cert.Issuer='{0}'", cert.Issuer) + System.Environment.NewLine);

            sb.Append(string.Format("Cert.GetPublicKey().Length='{0}'", cert.GetPublicKey().Length) + System.Environment.NewLine);

            X509Certificate2 cert2 = cert as X509Certificate2;
            ShowX509Certificate2(sb, cert2);
        }
    }
}

наименее вероятно):

The server's SSL certificate is untrusted by the client. Easiest check is to point a browser at the URL and see if you get an SSL lock icon. If you get a broken lock, icon, click on it to see what the issue is:

Expired dates - get a new SSL certificate Name does not match - make sure that your URL uses the same server name as the certificate. Not signed by a trusted authority - buy a certificate from an authority such as Verisign, or add the certificate to the client's trusted certificate store. In test environments you could update your certificate validator to skip access checks. Don't do this in production.

Server is requiring Client SSL certificate - in this case you would have to update your code to sign the request with a client certificate.

 13 сент. 2017 г., 19:22
Ваш комментарий "Требуется клиентский SSL-сертификат" помог мне взглянуть на фактически сертификат, который я отправлял .... и, таким образом, мой новый ответ на этот вопрос. А "Дух" момент сейчас, но сейчас несколько часов назад! Спасибо
 Joseph Anderson31 мая 2012 г., 16:28
Как мне подписать сертификат клиента? Я добавил ServicePointManager.ServerCertificateValidationCallback = делегат {возвращать истину; }, но все равно выдает ошибку.
 31 мая 2012 г., 00:08
Все хорошо, кроме последнего пункта. Сертификат клиента не используется для подписи запроса, он предоставляется в рукопожатии, поэтому его необходимо сделать доступным для транспорта до открытия соединения. Как это сделать в Javascript, оставлено в качестве упражнения для читателя ;-)

смотрите ниже ссылку один раз. SecurityProtocolType.SsL3 теперь старый.

http://codemust.com/poodle-vulnerability-fix-openssl/

 06 нояб. 2017 г., 12:57
Вопросу более 2 лет, я уверен, что они знают, что теперь SSL3 небезопасен.

существующий ответ но в PowerShell:

[System.Net.ServicePointManager]::SecurityProtocol = `
[System.Net.SecurityProtocolType]::Tls11 -bor 
[System.Net.SecurityProtocolType]::Tls12 -bor `   
[System.Net.SecurityProtocolType]::Tls -bor `
[System.Net.SecurityProtocolType]::Ssl3

Тогда вызов Invoke-WebRequest должен работать.

Получил это от анонимного отзыва, хорошее предложение: Более простой способ написать это будет:

[System.Net.ServicePointManager]::SecurityProtocol = @("Tls12","Tls11","Tls","Ssl3")

Нашел этот фантастический и связанный пост от Jaykul:Проверка самоподписанных сертификатов из .Net и PowerShell

 06 дек. 2017 г., 22:18
woot спасибо за этот пост ... Я был озадачен тем, как установить тип протокола.
 17 февр. 2016 г., 22:42
Ответы перемещаются в зависимости от того, как вы их сортируете, и по умолчанию, сколько голосов у них есть. Попробуйте сослаться на другой ответ его автора.

Ваш ответ на вопрос