Аутентификация клиента HttpWebRequest

Мне нужно отправить некоторые xmls на https-сайт с аутентификацией сертификата клиента, но не смог сделать это успешно.

У меня есть 2 файла .pem, предоставленный поставщиком, как показано ниже: (я не могу отправить все данные так отрезаны)

cert.pem:

----- НАЧАТЬ СЕРТИФИКАТ ----- MIIC0DCCAjmgAwIBAgIKAd8CIHEBAwIEpjANBgkqhkiG9w0BAQUFADCBmTELMAkG

----- КОНЕЦ СЕРТИФИКАТА -----

key.pem:

----- НАЧАТЬ ЧАСТНЫЙ КЛЮЧ RSA ----- MIICWwIBAAKBgQC + HN6jHJD1zoGLHYj1ycvg1yajll5zb3gExoWv7k + RbXLGuDEX

----- END RSA ЧАСТНЫЙ КЛЮЧ -----

То, что я пытался сделать, это

private static string HttpRequest(string url, string data)
        {
            HttpWebRequest rq = (HttpWebRequest)WebRequest.Create(url);


            //string privateKey = File.ReadAllText("c:\\key.pem");

            //privateKey = privateKey.Replace("-----BEGIN RSA PRIVATE KEY-----", "");
            //privateKey = privateKey.Replace("----- END RSA ЧАСТНЫЙ КЛЮЧ -----", "");
            //privateKey = privateKey.Replace("\n", "");

            //Byte[] byteArr = Convert.FromBase64String(privateKey);

            //How do I use below .pem files here to authentica
            rq.ClientCertificates.Add(clientcert);
            rq.Method = "POST";
            rq.Proxy = null;
            rq.ContentType = "application/www-form-urlencoded";

            string dataToSend = data;

            byte[] byteArray = Encoding.UTF8.GetBytes(dataToSend);
            rq.ContentLength = byteArray.Length;

            string responseFromServer = null;

            try
            {
                Stream dataStream = rq.GetRequestStream();
                dataStream.Write(byteArray, 0, byteArray.Length);
                dataStream.Close();

                WebResponse _WebResponse = rq.GetResponse();
                dataStream = _WebResponse.GetResponseStream();

                StreamReader reader = new StreamReader(dataStream);

                responseFromServer = reader.ReadToEnd();
            }
            catch (Exception ex)
            {


            }

            return responseFromServer;
        }
1
nl ja de

2 ответы

Вам необходимо отправить сертификат (открытый ключ) на сервер, добавив его в запрос. Насколько я знаю, сервер использует закрытый ключ для проверки запроса.

Попробуйте просто загрузить файл открытого ключа, если он не работает, вам нужно преобразовать его в формат ASR.1 DER.

rq.ClientCertificates.Add(X509Certificate.CreateFromCertFile("c:\\cert.pem"));
1
добавлено
Привет, спасибо за ваш ответ, но это не сработает. Когда я смотрел журналы журнала System.New, он пытается найти закрытый ключ cert.pem, а затем не смог его найти, поэтому исключает исключение
добавлено автор Yucel, источник

Вам необходимо преобразовать свой секретный ключ и сертификат pem в форму # pkcs12:

openssl pkcs12 -inkey private.key -in client_certificate.pem -export -out client_certificate.p12

После этого вы можете указать этот файл p12 в коде C #:

<Код> rq.ClientCertificates.Add (X509Certificate.CreateFromCertFile ( "C: \\ client_certificate.p12"));

1
добавлено
Microsoft Stack Jobs
Microsoft Stack Jobs
1 788 участник(ов)

Work & freelance only Microsoft Stack. Feed https://t.me/Microsoftstackjobsfeed Чат про F#: @Fsharp_chat Чат про C#: @CSharpChat Чат про Xamarin: @xamarin_russia Чат общения:@dotnettalks

Microsoft Developer Community Chat
Microsoft Developer Community Chat
584 участник(ов)

Чат для разработчиков и системных администраторов Microsoft Developer Community. __________ Новостной канал: @msdevru __________ Баним за: оскорбления, мат, рекламу, флуд, флейм, спам, NSFW контент, а также большое количество оффтоп тем. @banofbot