尝试连接到HTTPS时出错

时间:2014-08-07 18:58:33

标签: api rest ssl https

当我尝试连接到HTTPS REST服务时,我在执行期间遇到以下错误(目前在VS 2013中的单元测试中):

  

System.Net.Http.HttpRequestException:发送时发生错误   请求。 ---> System.Net.WebException:请求已中止:   无法创建SSL / TLS安全通道。结果StackTrace:at   System.Net.HttpWebRequest.EndGetRequestStream(IAsyncResult的   asyncResult,TransportContext&上下文中)

代码:

public class CompanyApi
    {
        private string _username;
        private string _password;
        private string _url;

        public CompanyApi(string username, string password, string url)
        {
            _username = username;
            _password = password;
            _url = url;
        }

        public string MakeUrl(string programHostName)
        {
            return string.Format("https://{0}/api/v1/program/", programHostName);
        }

        /// <summary>Creates a basic HTTP authentication token.</summary>
        protected AuthenticationHeaderValue CreateBasicCredentials()
        {
            string token = String.Format("{0}:{1}", _username, _password);
            return new AuthenticationHeaderValue("Basic",
                                                 Convert.ToBase64String(Encoding.UTF8.GetBytes(token))
                );
        }

        public void UserGivePoints(add_points newPointsRequest)
        {
            string url = MakeUrl(_url);
            WebRequestHandler handler =
                new WebRequestHandler
                {
                    AllowAutoRedirect = false,
                    UseProxy = false
                };

            HttpClient client =
                new HttpClient(handler)
                {
                    BaseAddress = new Uri(url)
                };
            client.DefaultRequestHeaders.Authorization = CreateBasicCredentials();

            // Add an Accept header for JSON format.
            client.DefaultRequestHeaders.Accept.Add(
                new MediaTypeWithQualityHeaderValue("application/x-javascript"));

            // Create the JSON formatter.
            MediaTypeFormatter jsonFormatter = new JsonMediaTypeFormatter();

            // Use the JSON formatter to create the content of the request body.
            HttpContent content = new ObjectContent<add_points>(newPointsRequest, jsonFormatter);

            client.Timeout = new TimeSpan(0, 0, 30);

            HttpResponseMessage message = client.PostAsync("user/add_points?outputFormat=JSON", content).Result;
            if (message.StatusCode != HttpStatusCode.OK)
                throw new Exception("Wrong result code - " + message.StatusCode);
            message.EnsureSuccessStatusCode();
        }
    }

    public class add_points
    {
        public string username { get; set; }
        public int amount { get; set; }
        public string account_name { get; set; }
        public string reason { get; set; }

        public add_points(string userId, int pointAmount, string account, string pointDescription)
        {
            username = userId;
            amount = pointAmount;
            account_name = account;
            reason = pointDescription;
        }

        public add_points()
        { }
    }

就我从错误中可以看出,它似乎不喜欢网站上的证书,这是我从Chrome获得的警告消息:

  

您试图访问tribute.site.com.int01.site.com,但相反   你实际上到达了一个服务器,将自己标识为* .int01.site.com。   这可能是由于服务器上的配置错误或某些原因造成的   更认真。您网络上的攻击者可能会试图找到您   访问假的(可能有害的)版本   tribute.site.com.int01.site.com。你不应该继续,特别是如果   你之前从未见过这个警告。

我无法解决这个问题,供应商向我保证,许多其他人会毫无问题地连接到API ......

有什么想法吗?

更新2014-08-08

我添加了

ServerCertificateValidationCallback = delegate(object s, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors) { return true; }

在WebRequestHandler初始化代码中行,仍然会遇到同样的问题。

2 个答案:

答案 0 :(得分:1)

主机名为*.int01.site.com的证书只会与com.int01.site.com匹配,但不会与tribute.site.com.int01.site.com匹配。通配符仅匹配相同级别。要使该证书有效,他们需要具有能够匹配*.*.*.int01.site.com的SSL证书。

高度建议避免使用任何会禁用证书检查的代码,并与供应商合作以获取有效证书。禁用或解决证书检查只会降低安全性。如果您确实必须禁用检查,请在发送数据之前使用证书固定来验证供应商证书。

答案 1 :(得分:1)

这里的选择很少:

的解决方法:

  • 禁用Https请求的证书验证。您可以借助ServerCertificateValidationCallback。
  • 来完成此操作
  • 将此证书添加为信任证书。

优选:

  • 要求第三方使用有效证书。