SSLの目的で他の証明書に署名するために使用する自己署名CA証明書を作成しました。これらの証明書は、アクセスできない他のサーバーにインストールされ、モバイルアプリケーションなどの他のクライアントと厳密に通信するために使用されます。
これらのクライアント(.NETで記述)がHTTPSを使用してサーバーに要求を行うと、CA証明書はそのクライアントで信頼できるCAではないため、「サーバーから無効な証明書を受信しました」というエラーが発生します。
を使用してこのセキュリティをバイパスしたいのですがServicePointManager.ServerCertificateValidationCallback
、使用している証明書がCA証明書によって署名されている場合に限ります。
を確認するcertificate.Issuer
ことはできますが、だれでも簡単になりすますことができます。無効な証明書の発行者証明書の指紋または公開鍵を取得するにはどうすればよいですか?アクセスできる場合は、有効であることがわかっているものと簡単に比較して、証明書エラーを無視し、要求を続行できます。
アップデート
近づいていると思います。私たちがやろうとしていることは実行できないように見えるので、少し異なる方向に進みました。
X509Chain
以下のコードを使用して、証明書がCAの子であるかどうかを確認できます。
var caCert = new X509Certificate2(@"[path]\MyCA.cer");
var newChain = new X509Chain();
newChain.ChainPolicy.RevocationMode = X509RevocationMode.NoCheck;
newChain.ChainPolicy.ExtraStore.Add(caCert);
var res = newChain.Build(certInQuestion);
Build()
それでもfalseを返します(CAがクライアントで信頼されていないため、予想どおり)が、現在newChain.ChainStatus[0].Status
はを返していUntrustedRoot
ます。私のテストに基づくと、これはチェーンが検証されたことを意味します。別のCA証明書を指定すると、で失敗するためInvalidChain
です。
結論として、ステータスがUntrustedRoot
である場合、証明書はCA証明書を使用して作成されているため、有効であり、それ以外は偽物であることがわかります。
私の仮定は正しいですか?