. net客户端连接到ssl Web API
本文关键字:Web API ssl 客户端 连接 net | 更新日期: 2023-09-27 18:02:02
我有一个ASP。. NET Web API,我想使用ssl。目前服务器正在使用自签名证书,此时http和https都是允许的。我有一个非常基本的测试客户端工作良好的http,但不工作的https。我想知道如何修改下面的客户端代码,使其与https一起工作。目前,IE、Firefox和Chrome都可以使用http和https(带有证书警告)连接到Web API,所以这让我相信我不应该修改服务器上的任何东西,只需要修改客户端代码。下面是客户端代码:
static void Main(string[] args)
{
try
{
if (args.Length != 1)
{
Console.WriteLine("Please provide a url, and only a url.");
return;
}
var url = new Uri(args[0]);
var urlAuthority = url.GetLeftPart(UriPartial.Authority);
var urlPathQuery = args[0].Substring(urlAuthority.Length);
HttpClient client = new HttpClient();
client.BaseAddress = new Uri(urlAuthority);
HttpResponseMessage response = client.GetAsync(urlPathQuery).Result;
if (response.IsSuccessStatusCode)
Console.WriteLine(response.Content.ReadAsAsync<string>().Result); // expecting scalar results only
else
Console.WriteLine("{0} ({1})", (int)response.StatusCode, response.ReasonPhrase);
}
catch (Exception ex)
{
Exception tempEx = ex;
while (tempEx != null)
{
Console.WriteLine(tempEx.Message);
tempEx = tempEx.InnerException;
}
}
}
当我用http url运行上面的代码时,它工作得很好。当我将url更改为https时,打印出以下错误:
One or more errors occurred.
An error occurred while sending the request.
The underlying connection was closed: Could not establish trust relationship for the SSL/TLS secure channel.
The remote certificate is invalid according to the validation procedure.
我的一个问题是,如果客户端必须手动发送公钥到服务器,以便它知道如何发送回加密响应,或者如果这在幕后自动发生?第二,现在看到最后一个错误后,我想知道我是否还必须在客户端内做其他事情来忽略证书警告,只是相信这个证书可以继续?
看看c#忽略证书错误SO问题。我相信您可以使用ServicePointManager添加一个证书验证处理程序来规避证书验证。不过,在您的生产环境中使用已签名的证书可能是个好主意。
ServicePointManager
.ServerCertificateValidationCallback +=
(sender, cert, chain, sslPolicyErrors) => true;
这对我很有效。只需在调用GetAsync之前添加以下代码:
ServicePointManager.ServerCertificateValidationCallback = delegate { return true; };
这将忽略SSL错误。这只建议在内网环境或其他封闭网络中,服务器身份不能伪造。
此错误消息表示客户端在SSL握手期间不信任服务器证书。有些浏览器比较宽容,会给你一个"红色条",但是从代码中调用会导致401和一个被拒绝的调用。
您不需要对IIS中的客户端证书设置做任何操作(因为我假设您没有使用客户端证书)。
此异常消息告诉您,在客户端验证时拒绝了自签名证书链。您可以通过导出(不带私钥)自签名证书并将其作为根证书安装在客户机上来解决这个问题。
如果这不起作用,您需要制作一个新的CA(证书颁发机构证书),然后生成一个由CA签名的新服务器证书。该CA最终必须作为根证书安装在客户机上。
这是一个很好的帖子,展示了使用makecert和pvk2pfx的过程。
编辑:似乎有一种方法可以将HttpClient
配置为忽略SSL错误。但是,我强烈建议您从一开始就不要出现SSL错误。