动态 X509ChainPolicy 验证时间
在早期版本的 .NET 中,构造 X509ChainPolicy 对象时,将 X509ChainPolicy.VerificationTime 值分配给了 DateTime.Now。 对 X509Chain.Build(X509Certificate2) 的多次调用使用相同的 X509ChainPolicy
对象会导致所有链生成都使用与验证时间相同的值,无论自对象创建以来已经过去了多少时间。
新的默认行为是在调用 X509Chain.Build()
时使用 DateTime.Now
的值作为验证时间。 此更改不会影响显式分配 X509ChainPolicy.VerificationTime
的链生成。
旧行为
构造 X509ChainPolicy
对象时,将 X509ChainPolicy.VerificationTime 值分配给 DateTime.Now。 此值用于所有后续 X509Chain.Build(X509Certificate2) 调用(除非或直到之后重新分配该值)。
新行为
构造 X509ChainPolicy
对象时将 X509ChainPolicy.VerificationTime 值分配给 DateTime.Now,但新的 X509ChainPolicy.VerificationTimeIgnored
属性默认为 true
。 当此属性的值为 true
时,X509Chain.Build(X509Certificate2) 方法在生成链时使用 DateTime.Now
而不是 X509ChainPolicy.VerificationTime
作为验证时间。
将值分配给 X509ChainPolicy.VerificationTime
属性会自动将 VerificationTimeIgnored
设置为 false
。
引入的版本
.NET 7
中断性变更的类型
此项更改可能会影响二进制兼容性。
更改原因
缓存已配置的 X509ChainPolicy
对象的调用方通常会惊讶于他们的验证正在慢慢地回移。 此更改使得生存期较长的 X509ChainPolicy
对象更易于使用,并且不会显着影响短生存期对象。
建议的操作
以下调用方不受更改的影响:
- 没有长生存期
X509ChainPolicy
对象的调用方。 - 显式分配
X509ChainPolicy.VerificationTime
属性的调用方。
具有长生存期 X509ChainPolicy
对象并希望使用先前行为将新的 X509ChainPolicy.VerificationTimeIgnored
属性分配给 false
或将 X509ChainPolicy.VerificationTime
属性分配给 DateTime.Now
的调用方。
var policy = new X509ChainPolicy
{
// ...
VerificationTime = DateTime.Now,
};
或
var policy = new X509ChainPolicy
{
// ...
VerificationTimeIgnored = false,
};
受影响的 API
- System.Security.Cryptography.X509Certificates.X509ChainPolicy
- System.Security.Cryptography.X509Certificates.X509ChainPolicy.VerificationTime
System.Security.Cryptography.X509Certificates.X509ChainPolicy.VerificationTimeIgnored