2013-02-13 3 views
6

でX509証明書を作成し、検証する私は、.NET System.Security.Cryptography.X509Certificates私のエンタープライズプロジェクト(のみイントラネット)に関連してネット

ステップ1使用して証明書の検証で問題に出くわした:

ルート証明書を作成します

使用makecertルート証明書を作成し、信頼されたルート証明機関にそれをインストールするには

makecert -r -pe -n "CN=Test Labs (CA)" -ss CA -sr CurrentUser -a sha256 -cy authority -sky signature -sv TestLabCA.pvk TestLabCA.cer 
pvk2pfx -pvk TestLabCA.pvk -spc TestLabCA.cer -pfx TestLabCA.pfx 

ステップ2:は、証明書を作成して、証明書を作成するために、ルート証明書

使用makecertでそれに署名ルート証明書とそれに署名し、信頼された発行元にそれをインストール

makecert -pe -n "CN=Test Labs (SPC)" -a sha256 -cy end -sky signature -ic TestLabCA.cer -iv TestLabCA.pvk -sv TestLabSPC.pvk TestLabSPC.cer 
pvk2pfx -pvk TestLabSPC.pvk -spc TestLabSPC.cer -pfx TestLabSPC.pfx 

手順3:コードで確認

これは証明書を確認するためのC#コードのサンプルです。

X509Certificate2 rootCertificate = new X509Certificate2("TestLabCA.cer"); 
X509Certificate2 certificate = new X509Certificate2("TestLabSPC.cer"); 

// will return true 
Console.WriteLine("{0}, verified = {1}", rootCertificate.GetName(), rootCertificate.Verify()); 

// will return false 
Console.WriteLine("{0}, verified = {1}", certificate.GetName(), certificate.Verify()); 

// validate the chain 
var chain = new X509Chain(); 
chain.Build(certificate); 
Console.WriteLine("{0}, verified root of chain = {1}", certificate.GetName(), chain.ChainElements[chain.ChainElements.Count-1].Certificate.Verify()); 

質問:

私はこれはルート証明書であると仮定すると、私はチェーンをチェックして、チェーン内の最後の1を確認しなければならないのは、証明書を確認したい場合は?

良い方法がありますか?

答えて

2

信頼のチェーンを作成する必要があります。つまり、信頼できる証明書に戻す必要があります。これはルート証明書である必要はありませんが、中間証明書ではなくルート証明書を信頼するのが一般的です。単一の証明書で1つのエンティティのみを許可したい場合もあります。正しい証明書であると確信できる限り、その単一のリーフ証明書を信頼するだけで、 "チェーン"は単一の証明書で構成されます。その一例として、Webサービスで時には使用される自己署名付きルート証明書があります。

証明書チェーンの検証は、証明書の完全な検証の一部にすぎないことに注意してください。証明書が失効していないこと、証明書が有効であること(有効期限と有効期限の間)を確認する必要があります。場合によっては、証明書を検証するための独自のルールもあります。 DB - ホワイトリスト/ブラックリストに証明書IDが存在すること。マールテンBodewes'と答えたことに加え

+0

これは、PKIインフラストラクチャ内のX509証明書を記述しています。これは、たとえば「証明書」によって使用される「信頼のWeb」とは少し異なります。 PGP。 –

2

チェーンでは、次のコードを使用することができ有効であるかどうかを簡単に確認するには:

X509Certificate2 Certificate = new X509Certificate2("Certificate.pfx"); 
X509Chain CertificateChain = new X509Chain(); 
//If you do not provide revokation information, use the following line. 
CertificateChain.ChainPolicy.RevocationMode = X509RevocationMode.NoCheck; 
bool IsCertificateChainValid = CertificateChain.Build(Certificate); 

IsCertificateChainValidその後、証明書チェーンが正しい場合にtrueを返します。 のケースでは、ステータスが有効ではありませんなぜあなたはについては、

CertificateChain.ChainStatus 

を使用することができますfalseを返します。 可能な値には、NotTimeValid、UntrustedRootなどがあります。

関連する問題