2009-07-27 23 views
5

サーバーに実際の証明書を作成させることはできませんが、セキュリティチェックをしたいと思います。ですから、私が読むと、のcertsをチェックしているので、以下はあまりにも軽いです。.Netプログラミング:SSL自己署名証明書で検証するもの

ServicePointManager.ServerCertificateValidationCallback = delegate { return true; }; 

クライアントにx509証明書の確認を依頼することをお勧めしますか?私が.NET言語(C#/ f#)を使用していることを考えると、

答えて

4

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

+0

1は完全に同意するものとします。発行元のCAを信頼できない限り、残りの証明書はほとんど無意味です。 * real * certsを使用できない場合は、あなたが信頼できるCAを設定する(または既に持っている)かどうかを見て、そこからユーザに証明書を発行してください。 –

+0

はい、これは悪い状況ですが、私はあまりそれほどそうしようとしていません。少なくとも私は、証明書の名前が指定されたURLと一致することを確認します。 – telesphore4

5

自己署名証明書を使用している場合は、ルート(Cert。Issuer)のチェーンエラーだけが予想されます。私はこのようなチェーンエラーのトラップを具体的に示唆し、他のすべてのエラーが発生することをお勧めします。あなたは本命を確認することができた場合

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; 
} 
1

あなたが機能で独自の検証ロジックを置くことができ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; 

} 
+0

しないでください。これはセキュリティの幻想を提供するが、何も持っていないので、これは何よりも悪い。誰でも簡単に "CN = www.domain.com"という文字列で証明書を作成することができます。 – Daryl

関連する問題