2015-12-06 2 views
0

Я пытаюсь добавить сертификат из хранилища сертификатов в объект 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); 
} 
+0

Как проверить сертификат на другом конце? Имеет ли сертификат закрытый ключ? Почему вы используете 'X509Certificate', а не' X509Certificate2'? Кроме того, вы должен использовать 'X509Certificate2Collection' вместо' X509CertificateCollection'. Когда вы используете 'X509Certificate2', что такое свойство' HasPrivateKey'? –

+0

Кроме того, ваш код приводит к утечке памяти, потому что не существует кода, который закрывает хранилище сертификатов. https://msdn.microsoft.com/en-us/library/system.security.cryptography.x509certificates.x509store.close(v=vs.110).aspx добавьте блок finally для первого предложения try/catch. – Crypt32

+0

HasPrivateKey - это правда. Должен ли он или не должен содержать PrivateKey? – Maverik

ответ

0

Вычислено. Перед отправкой сертификата необходимо выполнить два шага. Ни один из блогов или документов не объяснил эти два шага. Смешно, как важные биты всегда остаются в стороне от предлагаемых решений. В любом случае, вот окончательные варианты решения:

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

Код мудр:

"

X509Store магазин = новый X509Store (" Мой», StoreLocation.CurrentUser); store.Open (OpenFlags.ReadOnly);

  X509Certificate2Collection col = (X509Certificate2Collection)store.Certificates.Find(X509FindType.FindBySubjectName, certName, true); 
      X509Certificate2 cert = null; 
      try 
      { 
       if(col.Count>0) 
        cert = col[0]; 
      } 
      catch (Exception ex) 
      { 
       throw new Exception("Certificate not Found!"); 
      } 

      store.Close();" 

И Voila !!!

 Смежные вопросы

  • Нет связанных вопросов^_^