做了一个C# form客户端,从本地读取cer证书,往服务器页面发送Https的请求,但是证书验证老是报错System.Net.WebException: 基础连接已经关闭: 未能为 SSL/TLS 安全通道建立信任关系,网上有无视验证的方法,就是在客户端重写验证函数,让它一直返回true,但俺就想执行服务器对证书进行验证,因为要统计一个Https请求的时间(包括证书验证),所以想问问有没有其它的好方法,小菜鸟求助。
//HTTPS请求
public static bool GetHttpsResponse(string url, string method, string content, string cerPath, out string response, out string errorMsg)
{
errorMsg = "";
response = ""; //方法返回的结果,当调用接口成功后返回
bool result = true; //判断是参数是否合法
if (string.IsNullOrEmpty(url) == true)
{
result = false;
errorMsg = "url 不能为空";
}
//发送的内容不能为空
if (string.IsNullOrEmpty(content) == true)
{
result = false;
errorMsg = "content 不能为空";
} if (File.Exists(cerPath) == false)
{
result = false;
errorMsg = "“" + cerPath + "” 指定的证书不存在";
} try
{
HttpWebRequest req = (HttpWebRequest)WebRequest.Create(url);
//User-AgentHTTP标头的值
req.UserAgent = "Client Cert Sample";
req.Method = method.ToString();
req.Timeout = 1000 * 10;//超时间10秒;
req.KeepAlive = true;
req.ContentType = "application/x-www-form-urlencoded";
//创建证书文件
X509Certificate objx509 = new X509Certificate(cerPath); //添加证书到请求里
req.ClientCertificates.Add(objx509); byte[] contentBytes = Encoding.GetEncoding("UTF-8").GetBytes(content); req.ContentLength = contentBytes.Length; Stream reqStream = req.GetRequestStream();
reqStream.Write(contentBytes, 0, contentBytes.Length); //添加参数到请求 reqStream.Close(); HttpWebResponse rep = (HttpWebResponse)req.GetResponse(); StreamReader smr = new StreamReader(rep.GetResponseStream()); response = smr.ReadToEnd(); }
catch (Exception ex)
{
errorMsg = ex.Message;
result = false;
}
return result;
}
//HTTPS请求
public static bool GetHttpsResponse(string url, string method, string content, string cerPath, out string response, out string errorMsg)
{
errorMsg = "";
response = ""; //方法返回的结果,当调用接口成功后返回
bool result = true; //判断是参数是否合法
if (string.IsNullOrEmpty(url) == true)
{
result = false;
errorMsg = "url 不能为空";
}
//发送的内容不能为空
if (string.IsNullOrEmpty(content) == true)
{
result = false;
errorMsg = "content 不能为空";
} if (File.Exists(cerPath) == false)
{
result = false;
errorMsg = "“" + cerPath + "” 指定的证书不存在";
} try
{
HttpWebRequest req = (HttpWebRequest)WebRequest.Create(url);
//User-AgentHTTP标头的值
req.UserAgent = "Client Cert Sample";
req.Method = method.ToString();
req.Timeout = 1000 * 10;//超时间10秒;
req.KeepAlive = true;
req.ContentType = "application/x-www-form-urlencoded";
//创建证书文件
X509Certificate objx509 = new X509Certificate(cerPath); //添加证书到请求里
req.ClientCertificates.Add(objx509); byte[] contentBytes = Encoding.GetEncoding("UTF-8").GetBytes(content); req.ContentLength = contentBytes.Length; Stream reqStream = req.GetRequestStream();
reqStream.Write(contentBytes, 0, contentBytes.Length); //添加参数到请求 reqStream.Close(); HttpWebResponse rep = (HttpWebResponse)req.GetResponse(); StreamReader smr = new StreamReader(rep.GetResponseStream()); response = smr.ReadToEnd(); }
catch (Exception ex)
{
errorMsg = ex.Message;
result = false;
}
return result;
}
//User-AgentHTTP标头的值
req.UserAgent = "Client Cert Sample";
req.Method = method.ToString();
req.Timeout = 1000 * 10;//超时间10秒;
req.KeepAlive = true;
req.ContentType = "application/x-www-form-urlencoded";
之后添加
req.ProtocolVersion=HttpVersion.Version10;
试一下。