7

OpenSSL .Netラッパーを使用して、リモートサーバーからC#コードへの証明書を取得したいと思います。基本的に、複製したい

openssl s_client -connect 192.168.254.13:636 -showcerts

..そして究極的には結果をX509Certificateにもたらします。これは可能ですか?もしそうなら、誰かが私を正しい方向に向けることができますか?

4

4 に答える 4

7

質問には2つの部分があると思います。

  1. サーバーの証明書をどのように取得しますか
  2. 証明書のチェーンをどのように取得しますか

サーバーの証明書を取得するには、.NET独自のSslStreamに類似したメソッドを持つ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

s_clientと同じ機能を作成するには、おそらくs_clientのコードを確認する必要があります。

s_clientは、openssl-XYZtar.gz / apps/s_client.c内にあります。

おそらく、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 に答える
2

ServicePointManager.ServerCertificateValidationCallbackを使用してみてください。これは、サーバーのX509証明書などで呼び出されます。

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

于 2012-05-31T10:19:43.363 に答える
1

CRLを取得するには、最初に証明書とその発行証明書で、URIGeneralNameを含むcRLDistributionPoints拡張機能を確認します。この拡張機能はRFC3280で定義されており、CAが別の証明書の発行に使用される証明書に対応するCRLの場所を通信する方法を指定します。残念ながら、この拡張機能はオプションとして定義されており、ほとんどのルートCAはこれを使用しません。

于 2012-06-05T03:27:26.057 に答える