想象一下,我们使用的是WCF (私钥/公钥对)的经典非对称加密。很明显,在私钥不被偷之前,它是安全的。我们不需要钥匙之间的信任链,对吧?客户机只需要知道其服务器的公钥,反之亦然。
只有当客户端事先不知道服务器的公钥并在第一次访问时才会出现问题。在这里,我们有一个风险,即实际的服务器是“中间人”而不是真正的服务器。这里我们需要证明。客户端访问服务器,获取其证书(其中包含公钥),验证证书。
为了进行验证,客户端需要确保服务器的证书是为该特定服务器颁发的。在这里我们需要信任链。对吗?
如果使用MessageSecurity.Mode=Certificate访问服务器的客户端预先知道服务器的证书(其公钥),那么即使证书是自签名的,通信也是安全的吗?
人们通常认为,使用自签名认证是不安全的,在生产中应始终避免。
但是为什么呢?如果客户端知道预期的公钥然后获得证书,则将其视为受信任的证书(通过将它的公钥与预期的公钥匹配),那么它不会取消服务器必须用其私钥输入有效负载这一事实。当私钥和公钥同时创建时,才能成功地用脉冲密钥解密密码。
你能看出我的推理有什么缺陷吗?
如果它是正确的,那么我能确保使用自定义的ClientCredentials.ServiceCertificate.DefaultCertificate并将客户端代理的X509Certificate设置为某种固定的(在客户机上)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");
}
}发布于 2010-12-01 17:59:37
是的,你的理解是正确的,但是它错过了一件事--事情会随着时间的推移而改变。如果服务器的私钥被泄露,或者服务器的证书以其他方式失效(不管怎样),PKI提供了证书撤销和撤销检查机制。使用自签名证书,这是不可能的(至少没有建立自定义的PKI基础设施)。
解决此问题的一种方法是创建自定义自签名证书,该证书将用作CA证书。使用此证书对服务器证书进行签名,并将吊销信息放入CA证书中。然后在客户端将CA证书添加为可信证书,并对此CA证书执行服务器证书的验证,并检查吊销。这意味着您必须在某个(可能是私有的) web服务器上发布CRL,或者运行OCSP响应程序。
https://stackoverflow.com/questions/4327309
复制相似问题