当我尝试连接到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初始化代码中行,仍然会遇到同样的问题。
答案 0 :(得分:1)
主机名为*.int01.site.com
的证书只会与com.int01.site.com
匹配,但不会与tribute.site.com.int01.site.com
匹配。通配符仅匹配相同级别。要使该证书有效,他们需要具有能够匹配*.*.*.int01.site.com
的SSL证书。
我高度建议避免使用任何会禁用证书检查的代码,并与供应商合作以获取有效证书。禁用或解决证书检查只会降低安全性。如果您确实必须禁用检查,请在发送数据之前使用证书固定来验证供应商证书。
答案 1 :(得分:1)
这里的选择很少:
的解决方法:
优选: