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