2012-05-10 27 views
7

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

openssl s_client -connect 192.168.254.13:636 -showcerts 

..最終的に結果をX509証明書に持ってきてください。これは可能ですか?それでは誰も私を正しい方向に向けることができますか?

答えて

6

  1. はどのようにあなたはあなたが使用するサーバーの証明書をrertrieveするには、証明書のチェーン

を取得するにはどうすればよいのサーバーの証明書

  • を取得しますが、 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); 
        } 
    } 
    

    おそらく、あなたはあなたがすべてでOpenSSL.Net使用せず、生の証明書データを使用してやりたい。NETのSslStreamとX509Certificate2オブジェクトを使用することができます。

  • +0

    これは非常に有望ですね - ありがとう! – KenD

    +0

    [SSL接続に特定のCAを使用する](http://stackoverflow.com/questions/22516450/use-a-particular-ca-for-a-ssl-connection/23180787#23180787)証明書を発行したCAが分かっている場合は、数百人ではなくそのCAを1人だけ使用するのが最善です – jww

    +0

    @jwwあなたの命題は、何度も既に悪用されているセキュリティリスクです - 最近では、Heartbleedエクスプロイトの結果としてCA証明書*が妥協されて取り消されています。あなたには道がない証明書を検証するか、またはそれが取り消されたことを知る。 「CA Zoo」はありません。証明書が動作する方法です。 –

    2

    出来上がりサーバーのX509証明書等で呼び出されます、あなたはおそらくs_clientのコードを見てみなければなりません。

    あなたはopensslの-XYZtar.gz /アプリケーション/ 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

    +0

    私は、OpenSSLを使ってそれをやるのが簡単な方法があると思っていました。ネットではないようです:( – KenD

    1

    最初cRLDistribuのための証明書とその発行の証明書を確認し、CRLを取得するにはURI GeneralNameを含んでいるchangePoints拡張子。この拡張はRFC 3280で定義されており、CAが別の証明書の発行に使用した証明書に対応するCRLの場所を伝達する方法を指定します。残念ながら、この拡張はオプションであると定義されており、ほとんどのルートCAはそれを使用しません。

    私は質問には2つの部分があると思い
    +0

    これは私のオリジナルの質問とどう関係しているのですか?私はCRLに興味がありません。私がつかまえたいのは、生の証明書です。 – KenD

    関連する問題