Запрос был прерван: не удалось создать безопасный канал SSL / TLS из HttpWebRequest - PullRequest
0 голосов
/ 31 марта 2020

Я пытаюсь выполнить вызов веб-службы с помощью веб-запроса HTTP в c#, Мой вызов curl выполнен успешно и выглядит следующим образом:

curl --cert cert.der --cert-type der --key keystore.pem --pass password https://xxx.xx.xx.xx:443/abcd/power/api --header "Authorization:Basic vsXNlckE6MTExMTEx" -H "Content-Type:application/json" -d partner.json -o output.dat -v -k

Когда я вызываю это, я получаю ожидаемый результат .

Ниже приведен мой код C#, который не работает и выдает ошибку.

            //import file and create byte array
            FileStream fs = File.OpenRead(folder + "cert.der");
            byte[] buf = new byte[1024];
            int c;
            while ((c = fs.Read(buf, 0, buf.Length)) > 0)
            {
                Console.WriteLine(Encoding.UTF8.GetString(buf, 0, c));
            }

            ServicePointManager.ServerCertificateValidationCallback += new RemoteCertificateValidationCallback((sender, certificate, chain, policyErrors) => { return true; });
            ServicePointManager.Expect100Continue = true;
            ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;

            // create X509Certificate
            X509Certificate2 x509 = new X509Certificate2();
            X509KeyStorageFlags x509KeyStorageFlags = new X509KeyStorageFlags();
            x509.Import(buf, getSecureString(), x509KeyStorageFlags);

            // create http web request and make a call
            var httpWebRequest = (HttpWebRequest)WebRequest.Create(url);
            httpWebRequest.ContentType = "application/json";
            httpWebRequest.Method = "POST";
            httpWebRequest.Headers["Authorization"] = "Basic " + 
            Convert.ToBase64String(Encoding.Default.GetBytes("abcd:123456"));
            httpWebRequest.KeepAlive = true;
            httpWebRequest.ProtocolVersion = HttpVersion.Version10;
            httpWebRequest.ClientCertificates.Add(x509);
            httpWebRequest.PreAuthenticate = true;
            using (var streamWriter = new StreamWriter(httpWebRequest.GetRequestStream()))
            {
                streamWriter.Write(json);
            }
            var httpResponse = (HttpWebResponse)httpWebRequest.GetResponse();
            using (var streamReader = new StreamReader(httpResponse.GetResponseStream()))
            {
                var result = streamReader.ReadToEnd();
                Console.WriteLine(result);

            }


...