7

ユーザーにサーバーの実際の証明書を作成させることはできませんが、セキュリティチェックを行いたいと思います。ですから、私が読んでいるように、証明書をチェックしていないので、以下は軽すぎます。

ServicePointManager.ServerCertificateValidationCallback = delegate { return true; };

クライアントにx509証明書をチェックさせることをお勧めしますか?.NET言語(c#/ f#)を使用していると仮定します。

4

3 に答える 3

6

自己署名証明書を使用している場合、予想される唯一のエラーは、ルート (証明書発行者) のチェーン エラーです。そのチェーンエラーを具体的にトラップし、他のすべてのエラーを通過させるこのようなものをお勧めします。

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;
}
于 2009-07-27T19:50:55.123 に答える
4

クライアントに実際の証明書を作成させることができない場合は、少なくともサーバーを使用してクライアントに証明書を作成させるようにしてください。次に、証明書が有効であること、または少なくとも CA からのものであることを確認できます。これは、CA が侵害されているかどうかがわかるためです。すべての CA を信頼している場合、チェックする価値のあるものは何もありません。

于 2009-07-27T18:57:34.933 に答える
0

証明書を確認できる場合は、関数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; 

}
于 2012-06-28T19:38:57.730 に答える