使用RSACryptoServiceProvider加密/解密具有过期证书的数据没有错误

时间:2015-01-22 20:52:58

标签: c# encryption encryption-asymmetric x509certificate2

我目前正在做一个使用证书加密数据的概念证明。它工作得很好但是现在,我想在证书过期时尝试一个场景。我创建了一个过期的证书,我很惊讶地发现,即使过期的证书,everthing也能正常运行。我期待一个错误。

您知道是否因为它是自签名证书吗?

这是我用来测试案例的代码

[TestMethod]
public void Encrypt_decrypt_with_expired_certificate()
{
    //Arrange
    var baseString = "This is an encryption test";
    X509Certificate2 newX509Certificate2 = new X509Certificate2("d:\\testx509certExpired.pfx", "apassword");
    Console.WriteLine(newX509Certificate2.NotAfter); //Show the expiration date which is in the past
    var encryptor = new CertificateEncryptor(newX509Certificate2); //This class is a simple wrapper around RSACryptoServiceProvider

    //Act
    string encryptedResult = encryptor.Encrypt(baseString); //Exception expected because of the expired certificate but not thrown

    //Assert
    Console.WriteLine("Base string : {0}", baseString);
    Console.WriteLine("Encrypted string : {0}", encryptedResult);
    Assert.IsNotNull(encryptedResult);

    //revert back
    string decryptedString = encryptor.Decrypt(encryptedResult);
    Console.WriteLine("Decrypted string : {0}", decryptedString);
    Assert.AreEqual(baseString, decryptedString);
}

由于

2 个答案:

答案 0 :(得分:4)

正如GregS所说,RSACryptoServiceProvider类(不是X509Certificate2)提供了执行加密操作的能力。 RSACryptoServiceProvider对证书一无所知,只知道密钥及其参数。这就是您没有看到任何错误的原因。

这意味着证书验证 - 是您的应用责任。您应该在加密数据时检查证书并跳过所有证书检查以解密数据。

答案 1 :(得分:0)

当尝试访问证书的X509Certificate2.PublicKey.Key属性时,如果证书不在其有效期内,则应引发CryptographicException。

这是我从证书加载公钥和私钥以执行加密操作的方式:

/PaymentSuccess.html?response=<xml>....<xml>