想象一下,我们使用WCF(私钥/公钥对)使用经典的不对称签名。显然这是安全的,直到私钥不被盗。我们不需要钥匙之间的任何信任链,对吧?客户端只需要知道其服务器的公钥,反之亦然。可以使用WCF的自签名证书安全吗?
只有当客户端事先不知道服务器的公钥并在第一次访问时获得它时,才会出现问题。这里我们有一个风险,即实际的服务器是一个“中间人”而不是真正的服务器。我们需要证书。客户端访问服务器,获取其证书(其中包含公钥),并且验证它。
验证客户端需要确保服务器的证书是针对此特定服务器颁发的。在这里,我们需要信任链。对?
如果客户端通过WCF使用MessageSecurity.Mode = Certificate预先知道服务器的证书(它的公钥),那么即使证书是自签名的,我们可以说通信是安全的吗?
Usualy认为使用自签名certifacate不安全,应始终避免在生产中使用。
但是为什么?如果客户端知道预期的公钥,然后获得证书,将其视为可信(通过将其公钥与预期的公钥相匹配),那么它不会取消服务器必须使用其私钥加密有效载荷这一事实。当且仅当私钥和公钥一起创建时,密钥才能用pulbic密钥成功解密。
你能在我的推理中看到任何缺陷吗?
如果它是正确的,那么我可以确定使用自定义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,以确保证书仍然有效。 – 2010-12-01 17:58:36