小编pla*_*dia的帖子

根据自签名证书颁发机构验证服务器证书

我有自定义服务器/客户端应用程序,使用SSL加密的TCP连接(自定义协议)相互通信.为了设置服务器证书,我创建了一个自签名证书颁发机构,并使用它来签署证书供服务器使用.在客户端,我想验证我连接的服务器的证书是否由我的自签名CA签名.

通过使用load_verify_file()函数为ssl :: context提供自签名CA证书,我能够在C++中使用boost.我想在C#客户端中实现相同的功能,但.NET SSL的东西似乎要更加严格地信任不在Windows信任库中的证书.

到目前为止,我找到了几个部分解决方案.显然,X509Chain是用于验证SSL证书的类.我曾尝试代码是这样,但手工创建链仍然抱怨说,根证书不可信,就像这样被传递到验证功能的连锁店.有一个选项可以忽略未知的证书颁发机构,但这似乎意味着它将接受任何自签名证书,这绝对不是我想要的.

这是似乎最接近我想要的代码,但如上所述,我有一个问题,它仍然抱怨我添加到ExtraStore的证书是自签名的.有没有办法说服X509Chain相信我给它的证书?

bool remoteCertificateValidationCallback(
    object sender, X509Certificate certificate, X509Chain chain,
    SslPolicyErrors sslPolicyErrors)
{
    // make sure certificate was signed by our CA cert
    X509Chain verify = new X509Chain();
    verify.ChainPolicy.ExtraStore.Add(secureClient.CertificateAuthority); // add CA cert for verification
    //verify.ChainPolicy.VerificationFlags = X509VerificationFlags.AllowUnknownCertificateAuthority; // this accepts too many certificates
    verify.ChainPolicy.RevocationMode = X509RevocationMode.NoCheck; // no revocation checking
    verify.ChainPolicy.RevocationFlag = X509RevocationFlag.ExcludeRoot;
    if (verify.Build(new X509Certificate2(certificate)))
    {
        return true; // success?
    }
    return false;
}
Run Code Online (Sandbox Code Playgroud)

.net c# ssl x509certificate

5
推荐指数
1
解决办法
5519
查看次数

标签 统计

.net ×1

c# ×1

ssl ×1

x509certificate ×1