我有一台服务器和三台客户端,其中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;
}
答案 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;
}