SSL over TCP使用证书验证Windows服务

时间:2012-01-17 14:57:15

标签: .net service c++-cli certificate sslstream

我有一台服务器和三台客户端,其中Windows服务以本地系统权限运行。客户端和服务器使用SSL over 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服务器通信。

- 已解决 -

Jon说我的问题是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 :(得分:0)

您只需加载证书,例如从文件中使用该特定证书进行身份验证。如果要在连接的服务器端执行此操作:

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执行标准验证(包括验证主机)。您只需向SslStream RemoteCertificateValidationCallback提供constructor即可。然后,您可以在其中进行所需的所有检查。例如,这是一个盲目接受任何证书的验证器:

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