2010-12-01 9 views
4

私たちがWCF(非公開/公開鍵のペア)で古典的な非対称暗号を使用しているとしばらく考えてみましょう。明らかに秘密鍵が盗まれない限り安全です。鍵の間に信頼関係のチェーンは必要ありません。クライアントはサーバの公開鍵を知る必要があり、その逆もありません。WCFで自己署名証明書を使用することは安全ですか?

クライアントが公開鍵を事前に知っておらず、初めてアクセスするときに問題が発生します。ここでは、実際のサーバーが実際のサーバーではなく「中間者」であるというリスクがあります。証明書が必要です。クライアントはサーバーにアクセスし、証明書(公開鍵を含む)を取得し、を検証します。

検証のために、クライアントは、この特定のサーバーに対してサーバーの証明書が発行されていることを確認する必要があります。そして、ここには信頼関係の鎖が必要です。右?

MessageSecurity.Mode = CertificateでWCF経由でサーバーにアクセスしているクライアントが、サーバーの証明書(公開キー)を事前に知っている場合、証明書が自己署名であっても通信が安全であると言うことはできますか?

通常、自己署名証明書を使用することは安全ではなく、運用中は常に避けるべきだと考えられています。
しかし、なぜですか?クライアントが予想される公開鍵を知ってから証明書を取得し、それを公開鍵と予想されるものと照合して信頼するものとして扱う場合、サーバが秘密鍵でペイロードを暗号化しなければならないという事実は取り消されません。また、秘密鍵と公開鍵が一緒に作成された場合にのみ、サイファー鍵でシフターを正常に復号化することができます。

私の推論にはどんな欠陥が見えますか?

正しい場合は、カスタムX509CertifacateValidatorを使用し、クライアントプロキシのClientCredentials.ServiceCertificate.DefaultCertificateをクライアント(クライアント)のX509Certificateに固定していることを確認できますか?しかし、それは一つのことを見逃し、

public class CustomCertificateValidator : X509CertificateValidator 
{ 
    private readonly X509Certificate2 m_expectedCertificate; 

    public CustomCertificateValidatorBase(X509Certificate2 expectedCertificate) 
    { 
     m_expectedCertificate = expectedCertificate; 
    } 

    public override void Validate(X509Certificate2 certificate) 
    { 
     ArgumentValidator.EnsureArgumentNotNull(certificate, "certificate"); 

     if (certificate.Thumbprint != m_expectedCertificate.Thumbprint) 
      throw new SecurityTokenValidationException("Certificated was not issued by trusted issuer"); 
    } 
} 
+0

私はそれがセキュリティよりも信頼と関係していると思います。証明機関(CA)の証明書は信頼されます。たとえば、FFまたはIEの場合、証明書に署名したCAを信頼する場合はブラウザに緑色のバーが表示されます。 (GeotrustまたはVerisign) 自分の証明書を生成して秘密鍵を安全に保つことはできますが、256bitのVeriSign証明書は自己生成の256bit証明書よりも安全ですか? CAが行うことができる便利なことは、証明書を取り消すことです。その場合、クライアントはCAと確認して、証明書がまだ有効であることを確認できます。 –

答えて

6

はい、ご理解が正しいか - 物事が時間の経過とともに変化:

カスタムX509CertifacateValidatorはこのようなものです。サーバの秘密鍵が公開されている場合や、サーバの証明書が他の方法で無効になった場合(任意)、PKIは証明書失効と失効確認の仕組みを提供します。また、自己署名証明書では、少なくともカスタムPKIインフラストラクチャを構築することなくこれを行うことはできません。

この問題を解決する1つの方法は、CA証明書として使用されるカスタムの自己署名証明書を作成することです。この証明書を使用してサーバー証明書に署名し、失効情報をCA証明書に入れます。次に、CA証明書をクライアント側で信頼できるものとして追加し、このCA証明書に対するサーバーの証明書の検証を実行し、失効もチェックします。つまり、CRLを一部の(おそらくはプライベートな)Webサーバーに公開するか、OCSPレスポンダを実行する必要があります。

+0

+1 - 私は同じことを考えていましたが、100%確実ではありません。また、私は証明書を生成するためのいくつかのアルゴリズムが他より優れていると思いますか?また、鍵のサイズを大きくすると、一部の証明書が安全になる可能性があります。それは私が意味するところでは、キーを推測するのにかなり時間がかかります。 –

関連する問題