7

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

openssl s_client -connect 192.168.254.13:636 -showcerts

.. 最终将结果带入 X509Certificate。这可能吗,如果可以的话,有人能指出我正确的方向吗?

4

4 回答 4

7

我认为这个问题有两个部分:

  1. 你如何检索服务器的证书
  2. 你如何检索证书的链

要重新检索服务器的证书,请使用 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。

于 2012-06-06T08:58:28.603 回答
2

尝试使用 ServicePointManager.ServerCertificateValidationCallback。这将使用服务器的 X509 证书调用等等

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

于 2012-05-31T10:19:43.363 回答
2

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

您可以在 openssl-XYZtar.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

于 2012-06-04T20:23:01.257 回答
1

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

于 2012-06-05T03:27:26.057 回答