Не удалось опубликовать подписанные данные json
Я должен сделать запрос API, имеющий алгоритм AES с SHA256 с закрытым ключом для подписи данных полезной нагрузки. При этом я получаю исключение
"Запрос был прерван: не удалось создать безопасный канал SSL/TLS."
В журнале windows он показывает, что
An SSL 3.0 connection request was received from a remote client application, but none of the cipher suites supported by the client application are supported by the server. The TLS connection request has failed.
Что я уже пробовал:
ServicePointManager.Expect100Continue = true; ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls | SecurityProtocolType.Ssl3; var httpWebRequest = (HttpWebRequest)WebRequest.Create("https://ipaddress/method/"); httpWebRequest.ContentType = "application/json"; httpWebRequest.Method = WebRequestMethods.Http.Post; //POST string resourePath = "test/123/balance/"; string requestBody = ""; string secretWord = "xxxx123"; string header = "api-request-channelMid"; string payLoadString = httpWebRequest.Method.ToString() + resourePath + requestBody + secretWord + header; byte[] payLoadBytes = Encoding.UTF8.GetBytes(payLoadString); RSAParameters publicKey; RSAParameters privateKey; RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(2048); rsa.PersistKeyInCsp = false; publicKey = rsa.ExportParameters(false); privateKey = rsa.ExportParameters(true); byte[] signature = rsa.SignData(payLoadBytes, "SHA256"); string signedData = Convert.ToBase64String(signature); using (var streamWriter = new StreamWriter(httpWebRequest.GetRequestStream())) { var serializer = new JavaScriptSerializer(); string json = ""; httpWebRequest.Headers.Add("Signature", signedData); streamWriter.Write(json); streamWriter.Flush(); streamWriter.Close(); } ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3 | SecurityProtocolType.Tls; var httpResponse = (HttpWebResponse)httpWebRequest.GetResponse(); using (var streamReader = new StreamReader(httpResponse.GetResponseStream())) { var result = streamReader.ReadToEnd(); }
Richard Deeming
Большинство серверов отключили SSL3 и TLS1 из-за уязвимостей безопасности. Попробуйте вместо этого использовать TLS1.1 или 1.2:
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12 | SecurityProtocolType.Tls11;
Если это не сработает, вам нужно будет проверить людей, которые размещают API, чтобы узнать, какие протоколы и шифры они поддерживают.
normalsoft
Спасибо за ответ. Я свяжусь с ними по этому поводу.