SSL через TCP аутентифицировать службу Windows с помощью сертификата - PullRequest
1 голос
/ 17 января 2012

У меня есть один сервер и три клиента, на которых запущена служба Windows с привилегиями локальной системы. Клиенты и сервер взаимно аутентифицируются с использованием SSL через TCP и сертификатов (я использую класс SSLStream C ++ \ CLI http://msdn.microsoft.com/en-us/library/system.net.security.sslstream(v=vs.90).aspx#Y1124)

Проблема в том, что мне нужно три сертификата (по одному для каждого клиента), потому что я аутентифицирую хосты. Теперь я хочу аутентифицировать службы Windows и , а не хост, чтобы я мог распространять один и тот же сертификат для каждого хоста.

Кто-нибудь знает, как это сделать?

--- РЕДАКТИРОВАТЬ 1 ---- Чтобы дать вам пример того, что я хочу сделать. В каждой копии Microsoft Office развернут сертификат, который используется для связи с серверами Microsoft через зашифрованный / аутентифицированный канал.

- решено -

Как сказал Джон, моя проблема заключалась в том, что класс SslStream выполняет стандартную проверку, которая включает имя хоста. Я предоставил пользовательский RemoteCertificateValidationCallback, и теперь он работает.

bool ValidateServerCertificate( Object^ sender, X509Certificate^ certificate, X509Chain^ chain, SslPolicyErrors sslPolicyErrors ) {            

  Console::Write("[+] Validating server certificate: ");                                 

  // check certificate hash                                                               
  if( certificate->GetCertHashString()->Equals("cert hash") ) {                                                                                                          
      Console::Write( "oK\n" );                                                      
      return true;                                                                   
  }                                                                                      

   Console::Write(" ERROR\n");                  
   Console::WriteLine("[-] Hash doesn't match");                                 

   // Do not allow this client to communicate with unauthenticated servers.                           
   return false;                                                                                                                                                                                                  
} 

1 Ответ

0 голосов
/ 17 января 2012

Вам просто нужно загрузить сертификат, например, из файла и использовать этот конкретный сертификат для аутентификации.Если вы хотите сделать это на стороне сервера соединения:

var certificate = new X509Certificate2("cert.pfx");
sslStream.AuthenticateAsServer(certificate);

И на стороне клиента:

X509Certificate certificate = new X509Certificate2("cert.pfx");
var certCollection = new X509CertificateCollection(new[] { certificate });
sslStream.AuthenticateAsClient(targetHost, certCollection, protocols, checkRevocation);

Если сертификаты находятся в файлах, защищенных паролем, есть второй параметрконструктору X509Certificate2, который принимает пароль.И, конечно, вы, вероятно, хотите использовать разные сертификаты для клиентов и сервера.

Обновление:

Так что, похоже, ваша проблема в том, что ваши сертификаты не принимаютсяпотому что вы позволяете .NET выполнять стандартную проверку (которая включает проверку хоста).Вам просто нужно предоставить RemoteCertificateValidationCallback вашему SslStream конструктору .Затем вы можете сделать все проверки, которые вы хотите (или нет) внутри этого.Например, вот валидатор, который будет слепо принимать любой сертификат:

private bool DefaultCertificateValidationHandler(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslpolicyerrors)
{
    return true;
}
...