使用HttpWebRequest实现双向SSL遇到问题,请教高手!

smallfz 2009-02-05 03:10:35
如题,业务要求与对方服务器使用HTTP双向验证的SSL通信,这方面我经验很少,只了解大致的概念,就是客户端和服务器都使用自己的证书来表明自己身份,但是具体的过程我没有明晰的流程。

我的代码部分是这样的:


HttpWebRequest request = HttpWebRequest.Create(fullurl /* 一个https开头的URL地址 */) as HttpWebRequest;
request.AuthenticationLevel = AuthenticationLevel.MutualAuthRequired;
request.Credentials = CredentialCache.DefaultCredentials;
request.CookieContainer = new CookieContainer();

X509Certificate crt = X509Certificate.CreateFromSignedFile(@"d:\abc.crt" /* 一个证书文件的路径 */);
request.ClientCertificates.Add(crt);

request.Method = "post";
request.ContentType = "application/x-www-form-urlencoded";
byte[] requestData = Encoding.Default.GetBytes(GetBody() /* 一个类似A=a&B=b的字符串 */);
request.ContentLength = requestData.Length;
Stream requestStream = request.GetRequestStream();
requestStream.Write(requestData, 0, requestData.Length);

WebResponse response=request.GetResponse();
Stream responseStream = response.GetResponseStream();
context.Response.Write(response.IsMutuallyAuthenticated + "\r\n");


目标地址确认是可连接的地址。现在得到的报错是:
请求被中止: 未能创建 SSL/TLS 安全通道。

出错行是:
Stream requestStream = request.GetRequestStream();

我的问题是,出现这个错误,一般的原因是什么?我的证书有问题,还是服务器证书有问题?或者是其他原因?
...全文
961 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
System.Net.ServicePointManager.ServerCertificateValidationCallback = delegate { return true; };
加载上面那句代码试试
John_Yang 2009-02-09
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 smallfz 的回复:]
引用 4 楼 John_Yang 的回复:
好像.net已经处理过这些细节了。

3.5下面不需要做任何处理就成功了呢

C# code
HttpWebRequest request = (HttpWebRequest)WebRequest.Create("https://www.alipay.com");
request.Method = "GET";
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
Stream stream = response.GetResponseStream();

[/Quote]


这个你完全可以放心,建立SSL/TLS安全通道的前提条件就是双向验证都通过,也必须双方都验证成功才能建立安全通道,否则HTTPS就失去了它存在的意义。
我看了你的代码,因为你显式的指定了客户端证书,所以你之所以建立安全通道失败估计是你的这个证书无效,服务器端验证失败。
我写的那段代码,之所以能够成功,应该是因为在未显式指定证书的时候,.net使用IE默认的证书提交验证。
其中在.net框架之下使用HttpWebRequest来完成HTTPS请求,框架已经帮我们完成了所有的流程细节
WeekWant 2009-02-06
  • 打赏
  • 举报
回复
不懂,但在学习中。所以友情帮顶!!!!
John_Yang 2009-02-06
  • 打赏
  • 举报
回复
好像.net已经处理过这些细节了。

3.5下面不需要做任何处理就成功了呢

HttpWebRequest request = (HttpWebRequest)WebRequest.Create("https://www.alipay.com");
request.Method = "GET";
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
Stream stream = response.GetResponseStream();
StreamReader reader = new StreamReader(stream, Encoding.UTF8);
string html = reader.ReadToEnd();
John_Yang 2009-02-06
  • 打赏
  • 举报
回复
Https是基于SSL实现的,基本流程是先进行客户端和服务器的双向认证,然后交换密钥,然后双方使用这个密钥进行数据处理。
这个过程未在LZ代码中得到体现,当然不能正确创建SSL安全通道。
我现在来写一下代码,==。
smallfz 2009-02-06
  • 打赏
  • 举报
回复
似乎并不是程序本身的问题, 是证书用错了
smallfz 2009-02-06
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 John_Yang 的回复:]
好像.net已经处理过这些细节了。

3.5下面不需要做任何处理就成功了呢

C# code
HttpWebRequest request = (HttpWebRequest)WebRequest.Create("https://www.alipay.com");
request.Method = "GET";
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
Stream stream = response.GetResponseStream();
StreamReader reader = new Str…
[/Quote]

我查了msdn,还找了网上很多帖子,基本是有两种方法,一种是使用TcpClient+SslStream,一种是HttpWebRequest,
我猜HttpWebRequest封装的彻底一些。

我遇到的问题是,我可以用HttpWebRequest去下载https站的内容,但是这只是对服务器身份的验证,也就是说是单向的验证。
我理解的双向验证,是指我在验证服务器身份的同时,还需要向服务器表明我的身份(我有对方给我的证书),服务器才会处理我的请求,也就是双向的信任。

谢谢4楼的阶级兄弟,如果您做过类似的项目,请一定帮帮忙。。。
eynStudio 2009-02-06
  • 打赏
  • 举报
回复
关注。。。
smallfz 2009-02-05
  • 打赏
  • 举报
回复
自己顶下,高手帮帮忙....
ZJ159 2009-02-05
  • 打赏
  • 举报
回复
怎么没人啊 顶下先

110,545

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧