OpenSSL .Netラッパーを使用して、リモートサーバーからC#コードに証明書を取得したいと考えています。本質的には、私は複製したいOpenSSL .Netを使用した証明書の取得
openssl s_client -connect 192.168.254.13:636 -showcerts
..最終的に結果をX509証明書に持ってきてください。これは可能ですか?それでは誰も私を正しい方向に向けることができますか?
OpenSSL .Netラッパーを使用して、リモートサーバーからC#コードに証明書を取得したいと考えています。本質的には、私は複製したいOpenSSL .Netを使用した証明書の取得
openssl s_client -connect 192.168.254.13:636 -showcerts
..最終的に結果をX509証明書に持ってきてください。これは可能ですか?それでは誰も私を正しい方向に向けることができますか?
:
を取得するにはどうすればよいのサーバーの証明書
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オブジェクトを使用することができます。
ServicePointManager.ServerCertificateValidationCallbackを使用してください。それはs_clientと同じ機能を作成するために
いいえいいえ私は恐怖です - 私は非HTTPSサービスから証明書を取得するOpenSSLを使用して探しています。 – KenD
出来上がりサーバーの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));
}
をしかし接続部もあります...
私は、OpenSSLを使ってそれをやるのが簡単な方法があると思っていました。ネットではないようです:( – KenD
最初cRLDistribuのための証明書とその発行の証明書を確認し、CRLを取得するにはURI GeneralNameを含んでいるchangePoints拡張子。この拡張はRFC 3280で定義されており、CAが別の証明書の発行に使用した証明書に対応するCRLの場所を伝達する方法を指定します。残念ながら、この拡張はオプションであると定義されており、ほとんどのルートCAはそれを使用しません。
私は質問には2つの部分があると思いこれは私のオリジナルの質問とどう関係しているのですか?私はCRLに興味がありません。私がつかまえたいのは、生の証明書です。 – KenD
これは非常に有望ですね - ありがとう! – KenD
[SSL接続に特定のCAを使用する](http://stackoverflow.com/questions/22516450/use-a-particular-ca-for-a-ssl-connection/23180787#23180787)証明書を発行したCAが分かっている場合は、数百人ではなくそのCAを1人だけ使用するのが最善です – jww
@jwwあなたの命題は、何度も既に悪用されているセキュリティリスクです - 最近では、Heartbleedエクスプロイトの結果としてCA証明書*が妥協されて取り消されています。あなたには道がない証明書を検証するか、またはそれが取り消されたことを知る。 「CA Zoo」はありません。証明書が動作する方法です。 –