【问题标题】:C# Visual Studio 2015: IWebProxy certificate validationC# Visual Studio 2015:IWebProxy 证书验证
【发布时间】:2017-06-28 16:30:39
【问题描述】:

我正在尝试创建一个 C# 代理 DLL,允许 VS2015 Community 在我的离线工作站上通过具有身份验证的公司 HTTP 代理访问互联网。

按照this MSDN blog post 的说明,我可以通过这种方式将 VisualStudio 连接到 HTTP 页面:

namespace VSProxy
{
    public class AuthProxyModule : IWebProxy
    {   
        ICredentials crendential = new NetworkCredential("user", "password");

        public ICredentials Credentials
        {
            get
            {
                return crendential;
            }
            set
            {
                crendential = value;
            }
        }

        public Uri GetProxy(Uri destination)
        {
            ServicePointManager.ServerCertificateValidationCallback = (Header, Cer, Claim, SslPolicyErrors) => true;
            return new Uri("http://128.16.0.123:1234", UriKind.Absolute);
        }

        public bool IsBypassed(Uri host)
        {
            return host.IsLoopback;
        }
    }
}

但我无法连接到帐户身份验证页面以访问 Visual Studio 社区。​​p>

所以,我正在尝试使用 DLL 验证 Microsoft 证书。

有什么方法可以完成 HTTPS 和证书问题?

如何验证 webProxy DLL 中的证书?

【问题讨论】:

    标签: c# visual-studio http ssl proxy


    【解决方案1】:

    您可能拥有公司提供的 SSL 代理证书。您只需将其导入 IE 中的根证书(即@9​​87654321@、https://bto.bluecoat.com/webguides/sslv/sslva_first_steps/Content/Topics/Configure/ssl_ie_cert.htm

    或者只是通过 .Net config 忽略证书验证

    1. how to set ServicePointManager.ServerCertificateValidationCallback in web.config

    2. How to stop certificate errors temporarily with WCF services(OzrenTkalcecKrznaric 的回答)

    对于 Visual Studio 2015,.Net 配置文件位于“%PROGRAMFILES(x86)%\Microsoft Visual Studio 14.0\Common7\IDE\devenv.exe.config”。

    希望对你有帮助。

    【讨论】:

      【解决方案2】:

      ServicePointManager.ServerCertificateValidationCallback 是 .Net 上网络证书验证的主要访问权限,如果您希望验证证书,您必须在此处进行。我建议您将回调绑定到 GetProxy 方法之外的其他地方。把它放在你初始化代理的地方并在那里执行你的证书验证。

      【讨论】:

        【解决方案3】:

        如果您想完全绕过证书检查,您可以将ServicePointManager.ServerCertificateValidationCallback 设置为始终使用返回 true 的委托:

        var validationCallback = new RemoteCertificateValidationCallback(delegate { return true; });
        

        ....

        ServicePointManager.ServerCertificateValidationCallback += validationCallback;
        

        我会将它包装在 try / catch / finally 和 finally 中,删除委托(否则它会应用进程范围的 iirc):

        finally
        {
             ServicePointManager.ServerCertificateValidationCallback -= validationCallback;
        }
        

        26/03/18 更新: 如果您可以控制HttpClient 的创建,则可以在构造它时传递HttpClientHandler,并将其ServerCertificateCustomValidationCallback 委托设置为返回true。您有效地限制了在整个进程范围内禁用 SSL 检查并将其限制为使用此 HttpClient 的危险影响。安全多了。代码:

        var handler = new HttpClientHandler();
        
        // Optional check to enable / disable based on config setting.
        if (ConfigurationManager.AppSettings["EnableSslCertificateCheck"] == null ||
            Convert.ToBoolean(ConfigurationManager.AppSettings["EnableSslCertificateCheck"]) == false)
        {
            handler = new HttpClientHandler
            {
                ClientCertificateOptions = ClientCertificateOption.Manual,
                ServerCertificateCustomValidationCallback =
                    (httpRequestMessage, cert, cetChain, policyErrors) => true
            };
        }
        
        return new HttpClient(handler);
        

        【讨论】:

        • **warnung:++ 由于该设置是全局的,即使您关闭验证,它也将应用于多线程调用。最好实施特定的主机检查或接受特定的证书指纹。更好的是,将证书安装到 Windows 证书存储中,以便自动获取。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-07-22
        • 1970-01-01
        • 2016-12-16
        • 2016-02-13
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多