8

ServicePointManager.ServerCertificateValidationCallback是一个全局静态属性,只需执行以下操作即可被应用程序中的任何代码覆盖:

ServicePointManager.ServerCertificateValidationCallback
    = (sender, cert, chain, sslPolicyErrors) => true;

为什么他们决定以这种方式实施它?当然,它应该是WebRequest对象的属性,并且您应该有一个很好的理由来说明您忽略证书的原因。

4

1 回答 1

5

能够设置此属性的其他代码不是安全问题,因为设置该属性需要SecurityPermissionFlag.Infrastructure权限,您不需要授予您不信任的代码。

另一方面,我同意这是糟糕的设计,因为它是全局可变状态,应该避免。特别是它使得在程序的不同部分使用不同的验证策略变得不必要地困难。正如您所建议的那样,共享配置文件会更糟糕。

正确的选择是回调的实例属性,就像普通SslStream类使用的一样。我对框架的那部分不够熟悉,无法说明此属性是否存在,因此ServicePointManager.ServerCertificateValidationCallback仅用作默认值,或者此全局变量是否是影响证书验证的唯一方法。

于 2012-07-11T12:08:02.610 回答