Я пытаюсь добавить сертификат из хранилища сертификатов в объект HttpWebRequest. Сертификат успешно загружен из магазина и добавлен HttpWebRequestobject. Но когда запрос отправляется, в возвратном конце сертификат отсутствует. Не уверен, что происходит между ними. Вот мой код, который извлекает сертификат, а затем отправляет его на принимающий сервер. Этот процесс предназначен для проверки подлинности на основе сертификатов. (Я пытаюсь выполнить аутентификацию себя с сервером)Добавить сертификат в HttpWebRequestin C#
X509Store store = new X509Store("My", StoreLocation.LocalMachine);
store.Open(OpenFlags.ReadOnly);
// Look for the first certificate that is named Cartus-to-Microsoft.
// Look in the local machine store.
X509CertificateCollection col = (X509CertificateCollection)store.Certificates.Find(X509FindType.FindBySubjectName, certName, true);
X509Certificate cert = null;
try
{
if(col.Count>0)
cert = col[0];
}
catch (Exception ex)
{
throw new Exception("Certificate not Found!");
}
//HttpWebRequest req = null;
HttpWebResponse rsp = null;
string uri = "http://relofileservice.azurewebsites.net/api/datasync/reloPostService"; //"http://localhost:64952/api/datasync/reloPostService";
HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create(uri);
//Add payload to request
var data = Encoding.ASCII.GetBytes(json);
req.Method = WebRequestMethods.Http.Post;
req.ContentType = "application/x-www-forum-urlencoded";
req.ContentLength = data.Length;
using (var stream = req.GetRequestStream())
{
stream.Write(data, 0, data.Length);
}
//Build The request Header
req.KeepAlive = false;
req.UserAgent = "Cartus API Client";
req.ClientCertificates.Add(cert);
System.Net.ServicePointManager.ServerCertificateValidationCallback = (sender, certificate, chain, sslPolicyErrors) => { return true; };
Trace.TraceInformation("Certificate added to rquest");
try
{
//Send the request and receive response.
rsp = (HttpWebResponse)req.GetResponse();
}
catch (Exception Ex)
{
Trace.TraceError("GetResponse Error Message: " + Ex.Message + ". GetResponse Error StackTrace: " + Ex.StackTrace);
}
Как проверить сертификат на другом конце? Имеет ли сертификат закрытый ключ? Почему вы используете 'X509Certificate', а не' X509Certificate2'? Кроме того, вы должен использовать 'X509Certificate2Collection' вместо' X509CertificateCollection'. Когда вы используете 'X509Certificate2', что такое свойство' HasPrivateKey'? –
Кроме того, ваш код приводит к утечке памяти, потому что не существует кода, который закрывает хранилище сертификатов. https://msdn.microsoft.com/en-us/library/system.security.cryptography.x509certificates.x509store.close(v=vs.110).aspx добавьте блок finally для первого предложения try/catch. – Crypt32
HasPrivateKey - это правда. Должен ли он или не должен содержать PrivateKey? – Maverik