【发布时间】:2010-12-01 17:46:50
【问题描述】:
想象一下,我们正在使用带有 WCF(私钥/公钥对)的经典非对称加密。显然,在私钥不被盗之前它是安全的。我们不需要密钥之间的任何信任链,对吧?客户端只需要知道其服务器的公钥,反之亦然。
只有当客户端事先不知道服务器的公钥并在第一次访问时获取它时才会出现问题。在这里,我们存在实际服务器是“中间人”而不是真实服务器的风险。这里我们需要证书。客户端访问服务器,获取其证书(包含公钥)并验证它。
对于验证,客户端需要确保为该特定服务器颁发了服务器证书。这里我们需要信任链。正确的?
如果客户端通过 WCF 使用 MessageSecurity.Mode=Certificate 访问服务器,则事先知道服务器的证书(其公钥),我们是否可以说即使证书是自签名的,通信也是安全的?
通常认为使用自签名证书不安全,在生产中应始终避免使用。
但为什么?如果客户端知道预期的公钥然后获得证书,将其视为受信任的(通过将其公钥与预期的匹配),那么它不会取消服务器必须使用其私钥加密有效负载的事实。当且仅当私钥和公钥一起创建时,密码才能使用公钥成功解密。
你能看出我的推理有什么缺陷吗?
如果正确,那么我可以确定使用自定义 X509CertifacateValidator 并将客户端代理的 ClientCredentials.ServiceCertificate.DefaultCertificate 设置为某个固定的(在客户端上)X509Certificate 安全吗?
自定义 X509CertifacateValidator 是这样的:
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)生成您自己的证书,并确保您的私钥安全,应该没问题,但是 256 位 VeriSign 证书可以比自己生成的 256 位证书更安全吗? CA 可以做的一件有用的事情是撤销证书。在这种情况下,客户端可以与 CA 核对,以确保证书仍然有效。
标签: wcf security certificate wcf-security x509certificate