Получена полная цепочка сертификатов от службы поддержки Swish и корневой сертификат рабочих серверов. Это все еще не работает. Прекрасно работает локально и на виртуальной машине со всеми обновлениями.
Протестировано с помощью ServicePointManager.Expect100Continue = false;
Установка следующих значений в Web.config:
Код: Выделить всё
Код: Выделить всё
var certThumbprint = "1234"; //1234567890 Swish number cert
var root1Thumbprint = "1234"; //Handelsbanken Customer CA1 v2 for Swish
var root2Thumbprint = "1234"; //Handelsbanken Root CA v2 for Swish
var root3Thumbprint = "49f2334991c4a48dfc6862095e965229b7cee457"; //Swish Root CA v2
var root4Thumbprint = "A8985D3A65E5E5C4B2D7D66D40C6DD2FB19C5436"; //DigiCert Global Root CA
var thumbprints = new[] { certThumbprint, root1Thumbprint, root2Thumbprint, root3Thumbprint, root4Thumbprint };
Код: Выделить всё
{
"Message": "An error has occurred.",
"ExceptionMessage": "One or more errors occurred.",
"ExceptionType": "System.AggregateException",
"StackTrace": " at Project.Web.Services.SwishService.SendPaymentRequest(PaymentRequest paymentRequest) in C:\\Users\\oscar\\source\\repos\\Project\\src\\Project.Web\\Services\\SwishService.cs:line 131\r\n at Project.Web.Services.SwishService.PopulateAndSendPaymentRequest(String userMobileNumber, Contract contract) in C:\\Users\\oscar\\source\\repos\\Project\\src\\Project.Web\\Services\\SwishService.cs:line 159\r\n at Project.Web.Controllers.Employees.EmployeeController.d__16.MoveNext() in C:\\Users\\oscar\\source\\repos\\Project\\src\\Project.Web\\Controllers\\Employees\\EmployeeController.cs:line 256",
"InnerException": {
"Message": "An error has occurred.",
"ExceptionMessage": "An error occurred while sending the request.",
"ExceptionType": "System.Net.Http.HttpRequestException",
"StackTrace": null,
"InnerException": {
"Message": "An error has occurred.",
"ExceptionMessage": "The underlying connection was closed: An unexpected error occurred on a send.",
"ExceptionType": "System.Net.WebException",
"StackTrace": " at System.Net.HttpWebRequest.EndGetRequestStream(IAsyncResult asyncResult, TransportContext& context)\r\n at System.Net.Http.HttpClientHandler.GetRequestStreamCallback(IAsyncResult ar)",
"InnerException": {
"Message": "An error has occurred.",
"ExceptionMessage": "Unable to read data from the transport connection: An existing connection was forcibly closed by the remote host.",
"ExceptionType": "System.IO.IOException",
"StackTrace": " at System.Net.TlsStream.EndWrite(IAsyncResult asyncResult)\r\n at System.Net.PooledStream.EndWrite(IAsyncResult asyncResult)\r\n at System.Net.ConnectStream.WriteHeadersCallback(IAsyncResult ar)",
"InnerException": {
"Message": "An error has occurred.",
"ExceptionMessage": "An existing connection was forcibly closed by the remote host",
"ExceptionType": "System.Net.Sockets.SocketException",
"StackTrace": " at System.Net.Sockets.Socket.BeginReceive(Byte[] buffer, Int32 offset, Int32 size, SocketFlags socketFlags, AsyncCallback callback, Object state)\r\n at System.Net.Sockets.NetworkStream.BeginRead(Byte[] buffer, Int32 offset, Int32 size, AsyncCallback callback, Object state)"
}
}
}
}
}
Более шести лет спустя мне пришлось сделать это снова, и это все еще было не так просто. Однако теперь он, наконец, должен работать в веб-приложении Azure, и, похоже, он уже некоторое время работает, глядя на ответ @AndersEkdahl.
Среда разработки содержит много полезной информации и сертификатов:
https://developer.swish.nu/documentation/environments
Сертификаты продукции можно скачать здесь:
https://portal.swish.nu/company/login?r ... rtificates
Когда я завершил обучение по запросу сертификата Swish на https://portal. swish.nu и загрузил свой файл .pem. Я завершил его через IIS Manager и «Завершить запрос сертификата». Разумеется, на том же компьютере, на котором был создан запрос на сертификат.
Мой загруженный файл .pem назывался:
Код: Выделить всё
swish_certificate_202306201123.pem

После этого я смог экспортировать свой сертификат в .pfx.
Однако это не сработало ни локально, ни в моем веб-приложении Azure. Если бы я попытался использовать сертификат, я получил ту же ошибку, что и в этом вопросе:
Не удалось создать безопасный канал SSL/TLS
Посмотрев на путь сертификации, это стало совершенно ясно, поскольку не удалось найти эмитента.

Вернитесь к файлу swish_certificate_202306201123.pem и откройте его в Блокноте или аналогичном тексте. редактор. Вы должны увидеть три -----BEGIN CERTIFICATE----- и -----END CERTIFICATE-----. Создайте по одному файлу для каждого из этих сертификатов. Я назвал их 1.cer, 2.cer и 3.cer. 1.cer — это сертификат, который вы уже импортировали. Однако 2.cer и 3.cer необходимо импортировать в доверенные корневые центры сертификации.

После этого цепочка сертификатов теперь является доверенной.

Теперь я могу следовать руководству Microsoft по использованию сертификат TLS/SSL в вашем коде в Службе приложений Azure. Загрузите сертификат в приложениях Windows
https://learn.microsoft.com/en-us/azure/app -service/configure-ssl-certificate-in-code#load-certificate-in-windows-apps
Код для загрузки сертификата предоставлен Microsoft:
Пример:
Код: Выделить всё
string certThumbprint = "E661583E8FABEF4C0BEF694CBC41C28FB81CD870";
bool validOnly = false;
using (X509Store certStore = new X509Store(StoreName.My, StoreLocation.CurrentUser))
{
certStore.Open(OpenFlags.ReadOnly);
X509Certificate2Collection certCollection = certStore.Certificates.Find(
X509FindType.FindByThumbprint,
// Replace below with your certificate's thumbprint
certThumbprint,
validOnly);
// Get the first cert with the thumbprint
X509Certificate2 cert = certCollection.OfType().FirstOrDefault();
if (cert is null)
throw new Exception($"Certificate with thumbprint {certThumbprint} was not found");
// Use certificate
Console.WriteLine(cert.FriendlyName);
// Consider to call Dispose() on the certificate after it's being used, avaliable in .NET 4.6 and later
}
Однако после загрузки файла .pfx и двух файлов .cer из доверенных корневых центров сертификации и включая их все через WEBSITE_LOAD_CERTIFICATES, это все равно не сработало.


Я проверил, что приложение может загружать мои сертификаты через Инструменты разработки -> Дополнительные инструменты -> Консоль отладки:
Код: Выделить всё
dir cert:/CurrentUser/My

Код загрузки сертификатов выглядит так:
Код: Выделить всё
var thumbprints = new[] { certThumbprint, root1Thumbprint, root2Thumbprint };
var certStore = new X509Store(StoreName.My, StoreLocation.CurrentUser);
certStore.Open(OpenFlags.ReadOnly);
var certificates = new X509Certificate2Collection();
foreach (var thumbprint in thumbprints)
{
var certs = certStore.Certificates.Find(X509FindType.FindByThumbprint, thumbprint, false);
certificates.AddRange(certs);
}
var handler = new HttpClientHandler()
{
ServerCertificateCustomValidationCallback = (sender, certificate, chain, sslPolicyErrors) =>
{
return true;
}
};
handler.ClientCertificateOptions = ClientCertificateOption.Manual;
handler.SslProtocols = System.Security.Authentication.SslProtocols.Tls12;
foreach (var cert in certificates)
{
handler.ClientCertificates.Add(cert);
}
client = new HttpClient(handler);
При локальном запуске этого кода мне пришлось скопировать два новых сертификата из доверенных корневых центров сертификации в личный, поскольку цепочка сертификатов извлекается оттуда.
При локальном запуске этого кода мне пришлось скопировать два новых сертификата из доверенных корневых центров сертификации в личный. p>
Я думал, что handler.SslProtocols = System.Security.Authentication.SslProtocols.Tls12; будет ошибкой, но я подозреваю, что мне нужно загрузить Swish Root CA v2.
Источник для устранения неполадок:
https://johan.driessen.se/posts/Calling-the-Swish- Payment-API-from-Azure-AppService/
Я обратился в службу поддержки Swish по поводу отсутствующей цепочки сертификатов, поскольку они сообщили на своей веб-странице:
Полная цепочка сертификатов сертификата TLS сервера Swish
доступен через Управление сертификатами Swish.
Однако я не могу его там найти.
Если вы решите разместить хост через VM/IIS, не забудьте использовать StoreLocation.LocalMachine и предоставить доступ к сертификату пользователю, запускающему пул приложений.
/>https://serverfault.com/a/132791/293367
Я решил использовать StoreLocation.CurrentUser локально следующим образом:
Код: Выделить всё
var swishCertificateStoreLocation = ConfigurationManager.AppSettings["SwishCertificateStoreLocation"];
Enum.TryParse(swishCertificateStoreLocation, out StoreLocation storeLocation);
var certStore = new X509Store(StoreName.My, storeLocation);
Прежде чем написать этот вопрос, я задал много вопросов и ответов, но не могу кажется, нашел решение. Я пытаюсь разместить приложение в качестве службы приложений Azure, которому необходимо выполнить вызов Swish API.
Пожалуйста, ознакомьтесь с этой веткой, чтобы узнать, как моя реализация работает локально и работает. отлично:
C# HttpClient с X509Certificate2 — WebException: запрос был прерван: не удалось создать безопасный канал SSL/TLS
Журнал диагностики системы из Azure:
https://pastebin.com/EBFb3zrA
Я пробовал решения с форумов Microsoft и SO, но ни одно из них, похоже, не помогло:< /p>
https://social.msdn.microsoft.com/Forum ... ion-could- not-create-ssltls-secure-channel?forum=windowsazurewebsitespreview
Код: Выделить всё
//Tested both, none of them work
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12
//ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls11
Что Я сделал это на вкладке SSL-сертификаты в Azure, импортировав тестовый сертификат. Поскольку .p12 и .pfx являются файлами PKCS #12, я просто переименовал файл .p12. Приложение работает как план обслуживания приложений B1 Basic, поэтому большая часть функций должна присутствовать.
https://stackoverflow.com/a/6821061/3850405
Я также попробовал это руководство, чтобы добавить сертификат в хранилище сертификатов в Azure -> Настройки приложения -> Настройки приложения:
https://azure.microsoft.com /en-us/blog/using-certificates-in-azure-websites-applications/
Когда это не сработало, я попытался добавить WEBSITE_LOAD_CERTIFICATES в appSettings в моем приложении, но в результате получился HTTP 503.
Сертификат Swish и руководство на английском языке:
https://www.getswish.se/content /uploads/2015/06/Guide-Testverktyg_20151210.zip
Подробнее здесь: https://stackoverflow.com/questions/442 ... ertificate