好的,我做了这样的事情
private void InvokeNotification(string methodName, params object[] args)
{
try
{
string serverIp = ConfigurationManager.AppSettings["ServerIp"];
var connection = new HubConnection(serverIp, useDefaultUrl: true);
var myHub = connection.CreateHubProxy("myhub");
//This will ignore all certeficates
//System.Net.ServicePointManager.ServerCertificateValidationCallback =
// ((sender, certificate, chain, sslPolicyErrors) => true);
System.Net.ServicePointManager.ServerCertificateValidationCallback +=
new RemoteCertificateValidationCallback(ValidateRemoteCertificate);
connection.Start().Wait();
myHub.Invoke(methodName, args);
}
catch (Exception ex)
{
//Some error handling
}
}
private static bool ValidateRemoteCertificate(object sender, X509Certificate cert,
X509Chain chain, SslPolicyErrors policyErrors)
{
bool result = false;
if (cert.Subject.ToUpper().Contains("MY_CERT_ISSUER_NAME"))
{
result = true;
}
return result;
}
通过这个,我找到了我的证书并在 SSL 对话中手动验证(实际上是通过)它。我不知道这个解决方案有多少合法性,但现在是合法的。
更新
我已更改ValidateRemoteCertificate() 方法:
private static bool ValidateRemoteCertificate(object sender, X509Certificate cert,
X509Chain chain, SslPolicyErrors policyErrors)
{
bool result = false;
X509Certificate2 cert2 = (X509Certificate2)cert;
X509Store store = new X509Store(StoreName.Root);
store.Open(OpenFlags.ReadOnly);
X509Certificate2Collection cc = store.Certificates.Find(X509FindType.FindByThumbprint,
chain.ChainElements[chain.ChainElements.Count - 1].Certificate.Thumbprint, true);
store.Close();
if (cc.Count > 0)
{
result = true;
}
return result;
}
通过这个我打开证书存储,从中找到我的项目,通过从证书链(最后一个元素)传递指纹参数。