normalsoft Ответов: 0

Не удалось опубликовать подписанные данные 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

Спасибо за ответ. Я свяжусь с ними по этому поводу.

0 Ответов