Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/wix/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#Visual Studio 2015:IWebProxy证书验证_C#_Visual Studio_Http_Ssl_Proxy - Fatal编程技术网

C#Visual Studio 2015:IWebProxy证书验证

C#Visual Studio 2015:IWebProxy证书验证,c#,visual-studio,http,ssl,proxy,C#,Visual Studio,Http,Ssl,Proxy,我正在尝试创建一个C#代理DLL,允许VS2015社区在我的脱机工作站上通过一个具有身份验证的公司HTTP代理访问internet 按照的说明,我可以通过以下方式将VisualStudio连接到HTTP页面: namespace VSProxy { public class AuthProxyModule : IWebProxy { ICredentials crendential = new NetworkCredential("user", "passw

我正在尝试创建一个C#代理DLL,允许VS2015社区在我的脱机工作站上通过一个具有身份验证的公司HTTP代理访问internet

按照的说明,我可以通过以下方式将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社区访问的帐户身份验证页面

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

有什么方法可以完成HTTPS和证书颁发


如何验证webProxy DLL中的证书?

您可能拥有公司提供的SSL代理证书。您只需将一个导入IE中的根证书(即)

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

  • (Ozrentkalcechkrznaric的回答)

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


    我希望这会有所帮助。

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

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

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

    我会将其包装在try/catch/finally中,并在finally中删除委托(因为它会应用流程范围的iirc):

    更新日期:2018年3月26日: 如果您可以控制
    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证书存储中,以便自动获取证书。
    finally
    {
         ServicePointManager.ServerCertificateValidationCallback -= validationCallback;
    }
    
    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);