使用OpenSSL .Net检索证书

时间:2012-05-10 14:10:32

标签: c# .net openssl

我想使用OpenSSL .Net包装器将证书从远程服务器检索到我的C#代码。基本上,我想复制

openssl s_client -connect 192.168.254.13:636 -showcerts

..并最终将结果带入X509证书。这是否可能,如果是这样,任何人都能指出我正确的方向吗?

4 个答案:

答案 0 :(得分:6)

我认为问题分为两部分:

  1. 如何检索服务器的证书
  2. 如何检索证书链?
  3. 要重新获得服务器的证书,请使用SslStream,其方法类似于.NET自己的SslStream

    var serverName = "...;
    var client = new TcpClient(serverName, 443);            
    
    // Create an SSL stream that will close the client's stream.
    using (var sslStream = new SslStream(client.GetStream(),true))
    {
        sslStream.AuthenticateAsClient(serverName);                
        var serverCertificate = sslStream.RemoteCertificate;
     }
    

    似乎OpenSSL.Net无法检索证书的链。 -showcerts参数使用未在OpenSSL.NET中实现的SSL_get_peer_cert_chain函数。

    如果您不介意混合使用OpenSSL.Net和内置的.NET类,可以将OpenSSL.Net证书转换为.NET证书,并使用.NET X509Chain.Build检索链。您可以使用.NET证书的RawData属性将.NET证书转换回OpenSSL.NET证书。

    var managedCert = new System.Security.Cryptography.X509Certificates.X509Certificate2(serverCertificate.DER);
    var chain = new System.Security.Cryptography.X509Certificates.X509Chain();
    chain.Build(managedCert);
    
    
    foreach (var element in chain.ChainElements)
    {
        var raw = element.Certificate.RawData;
        using (var bio = new BIO(raw))
        {
            var oc = OpenSSL.X509.X509Certificate.FromDER(bio);
        }
    }
    

    也许您可以使用.NET的SslStream和X509Certificate2对象来使用原始证书数据执行您想要的操作,而根本不使用OpenSSL.Net。

答案 1 :(得分:2)

尝试使用ServicePointManager.ServerCertificateValidationCallback。这将通过服务器的X509证书et voila

进行调用

http://msdn.microsoft.com/en-us/library/system.net.servicepointmanager.servercertificatevalidationcallback.aspx

答案 2 :(得分:2)

为了创建与s_client相同的功能,您必须查看s_client的代码。

你可以在openssl-X.Y.Z.tar.gz / apps / s_client.c中找到s_client

可能PEM_write_bio_X509执行X509Certificate的“打印”:

if (c_showcerts)
    PEM_write_bio_X509(bio,sk_X509_value(sk,i));
}

但也有连接部分......

ftp://ftp.openssl.org/source/openssl-1.0.1.tar.gz

答案 3 :(得分:1)

要获取CRL,请首先检查证书及其颁发证书,以获取包含URI GeneralName的cRLDistributionPoints扩展。此扩展在RFC 3280中定义,它为CA指定了一种通信CRL位置的方式,该位置对应于用于颁发另一个证书的证书。不幸的是,此扩展被定义为可选,并且大多数根CA不使用它。