ユーザーにサーバーの実際の証明書を作成させることはできませんが、セキュリティチェックを行いたいと思います。ですから、私が読んでいるように、証明書をチェックしていないので、以下は軽すぎます。
ServicePointManager.ServerCertificateValidationCallback = delegate { return true; };
クライアントにx509証明書をチェックさせることをお勧めしますか?.NET言語(c#/ f#)を使用していると仮定します。
ユーザーにサーバーの実際の証明書を作成させることはできませんが、セキュリティチェックを行いたいと思います。ですから、私が読んでいるように、証明書をチェックしていないので、以下は軽すぎます。
ServicePointManager.ServerCertificateValidationCallback = delegate { return true; };
クライアントにx509証明書をチェックさせることをお勧めしますか?.NET言語(c#/ f#)を使用していると仮定します。
自己署名証明書を使用している場合、予想される唯一のエラーは、ルート (証明書発行者) のチェーン エラーです。そのチェーンエラーを具体的にトラップし、他のすべてのエラーを通過させるこのようなものをお勧めします。
ServicePointManager.ServerCertificateValidationCallback += new RemoteCertificateValidationCallback(
ValidateRemoteCertificate
);
private static bool ValidateRemoteCertificate(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors policyErrors )
{
string trustedIssuer = "CN=www.domain.com";
string trustedDomain = "CN=www.domain.com";
bool policyErr = false;
switch (policyErrors)
{
case SslPolicyErrors.None:
policyErr |= false;
break;
case SslPolicyErrors.RemoteCertificateChainErrors:
bool chainErr = false;
foreach (X509ChainStatus status in chain.ChainStatus)
{
switch (status.Status)
{
case X509ChainStatusFlags.NoError:
chainErr |= false;
break;
case X509ChainStatusFlags.UntrustedRoot:
if (certificate.Subject != trustedDomain || certificate.Issuer != trustedIssuer)
chainErr |= true;
else
chainErr |= false;
break;
default:
chainErr |= true;
break;
}
}
policyErr |= chainErr;
break;
default:
policyErr |= true;
break;
}
return !policyErr;
}
クライアントに実際の証明書を作成させることができない場合は、少なくともサーバーを使用してクライアントに証明書を作成させるようにしてください。次に、証明書が有効であること、または少なくとも CA からのものであることを確認できます。これは、CA が侵害されているかどうかがわかるためです。すべての CA を信頼している場合、チェックする価値のあるものは何もありません。
証明書を確認できる場合は、関数ValidateRemoteCertificateに独自の検証ロジックを配置できます。
System.Net.ServicePointManager.ServerCertificateValidationCallback += (a, b, c, d) =>
{
return ValidateRemoteCertificate(a, b, c, d);
};
private static bool ValidateRemoteCertificate(object sender, X509Certificate certificate,
X509Chain chain, SslPolicyErrors policyErrors)
{
if (certificate.Subject.Equals("CN=www.domain.com"))
return true;
else
return policyErrors == SslPolicyErrors.None;
}