Stripe Payment: System.Net.WebException: запрос был прерван: не удалось создать безопасный канал SSL/TLS

Я использую API отдыха С# с WebAPI 2.0; Очень мало запросов, генерирующих это исключение. Найдите следующие детали:

Версия .net: 4.0 Версия Stripe.net: 34.20.0.0 Журнал исключений:

2020-02-18 06:47:45.4533|DEBUG|Services.impl.StripePaymentChargeService|System.Net.WebException: The 

request was aborted: Could not create SSL/TLS secure channel.
   at System.Net.HttpWebRequest.EndGetRequestStream(IAsyncResult asyncResult, TransportContext& context)
   at System.Net.Http.HttpClientHandler.GetRequestStreamCallback(IAsyncResult ar)
2020-02-18 06:47:45.4533|DEBUG|Services.impl.StripePaymentChargeService|   at Stripe.SystemNetHttpClient.<MakeRequestAsync>d__21.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at Stripe.StripeClient.<RequestAsync>d__25`1.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at Stripe.Service`1.<RequestAsync>d__24`1.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at System.Runtime.CompilerServices.ConfiguredTaskAwaitable`1.ConfiguredTaskAwaiter.GetResult()
   at Stripe.Service`1.Request[T](HttpMethod method, String path, BaseOptions options, RequestOptions requestOptions)
   at Stripe.ChargeService.Create(ChargeCreateOptions options, RequestOptions requestOptions)

Что я пробовал:

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



2.  ServicePointManager.SecurityProtocol = (SecurityProtocolType)3072;

                System.Net.ServicePointManager.ServerCertificateValidationCallback +=
                        delegate (object sender, System.Security.Cryptography.X509Certificates.X509Certificate certificate,
                                               System.Security.Cryptography.X509Certificates.X509Chain chain,
                                               System.Net.Security.SslPolicyErrors sslPolicyErrors)
                        {
                            return true; 

                        };

3. ServicePointManager.Expect100Continue = true;
            ServicePointManager.SecurityProtocol = (SecurityProtocolType)3072;

            System.Net.ServicePointManager.ServerCertificateValidationCallback +=
                    delegate (object sender, System.Security.Cryptography.X509Certificates.X509Certificate certificate,
                                           System.Security.Cryptography.X509Certificates.X509Chain chain,
                                           System.Net.Security.SslPolicyErrors sslPolicyErrors)
                    {
                        return true; 
                    };

Полоса Создать код оплаты:

 stripeCharge = chargeService.Create(myCharge);

Я не могу обновить версию .net из-за зависимости от производства. Любая помощь будет оценена по достоинству.


person sandipchandanshive    schedule 28.02.2020    source источник
comment
Может быть, поможет stackoverflow.com/a/44153734/9769731?   -  person karllekko    schedule 28.02.2020
comment
@karllekko Спасибо за комментарий, у меня нет разрешения на редактирование реестра, и мне нужно найти решение без обновления.   -  person sandipchandanshive    schedule 04.03.2020


Ответы (2)


Я думаю, что у вас есть решение здесь, а не ответ, за который проголосовали, а тот, который находится прямо под ним:

TLS 1.2 в .NET Framework 4.0

По сути, вы должны добавить эту строку при запуске приложения и убедиться, что .net4.5 установлен на целевой машине:

ServicePointManager.SecurityProtocol = (SecurityProtocolType)768 | (тип протокола безопасности) 3072;

*Платежный шлюз STRIPE поддерживает только TLS 1.1, TLS 1.2.

person Hintee    schedule 03.03.2020
comment
Спасибо за ответ. Я уже пробовал это, как упоминалось в вопросе. Я не могу обновить версию .net, как указано в вопросе. - person sandipchandanshive; 04.03.2020
comment
О, насколько я понял, вы не можете обновить целевую версию решения VS... - person Hintee; 04.03.2020
comment
Но я не думаю, что у вас есть обходной путь, поскольку .NET 4.0 не поддерживает TLS 1.1 или 1.2. Таким образом, ваш единственный вариант - перейти на .NET 4.5 на целевой машине... - person Hintee; 04.03.2020

Если ваша ОС устарела и не поддерживает TLS, вам также необходимо обновить ОС. Затем код следует обновить до .net 4.5 или выше. Если вы не можете обновить .net framework до версии 4.5, у меня есть для вас более сложное решение. Преобразование кода в ядро ​​​​ASp.net с использованием автономного развертывания. https://gunnarpeipman.com/visual-studio-publish-self-contained-aspnet-core-azure-appservice/

Создайте решение .net core, которое оно сможет запускать в автономном контейнере Publish. https://docs.microsoft.com/en-us/dotnet/core/deploying/

так что у вас есть решение .net 4.5 с операционной системой без .net 4.5. Публикация автономного приложения Публикация вашего приложения как автономного создает исполняемый файл для конкретной платформы. Выходная папка публикации содержит все компоненты приложения, включая библиотеки .NET Core и целевую среду выполнения. Приложение изолировано от других приложений .NET Core и не использует локально установленную общую среду выполнения. Пользователю вашего приложения не требуется загружать и устанавливать .NET Core.

Исполняемый двоичный файл создается для указанной целевой платформы. Например, если у вас есть приложение с именем word_reader и вы публикуете автономный исполняемый файл для Windows, создается файл word_reader.exe. При публикации для Linux или macOS создается файл word_reader. Целевая платформа и архитектура указываются с помощью параметра -r для команды публикации dotnet. Дополнительные сведения о RID см. в разделе Каталог RID .NET Core.

Если приложение имеет зависимости для конкретной платформы, например пакет NuGet, содержащий зависимости для конкретной платформы, они копируются в папку публикации вместе с приложением.

person Jin Thakur    schedule 07.03.2020