在本地运行,什么事都没有,发布到服务器上死活就是请求不成功。报错“The request was aborted: Could not create SSL/TLS secure channel”。其实最开始的异常是WebException 详细信息是“UnknowError”。这就比较尴尬了,最开始怀疑是网络问题,后来发现应该不是,还是得找原因。于是,各种加日志,终于暴露了这个错误。
我这是webclient进行请求的,因为对方是银行的系统,所以各种证书加密很完善,还有一个PFX的网络证书。于是找到一个覆盖webclient的解决方案:
public class MyWebClient : WebClient
{
protected override WebRequest GetWebRequest(Uri address)
{
HttpWebRequest request = (HttpWebRequest)base.GetWebRequest(address);
// 本地环境证书配置
//Common.Common.WriteLogs("证书地址为:" + System.AppDomain.CurrentDomain.BaseDirectory + "证书地址和名称.pfx");
//X509Certificate certificate = new X509Certificate(System.AppDomain.CurrentDomain.BaseDirectory + "证书地址和名称.pfx", "密码");
try
{
X509Store store = new X509Store(StoreName.My, StoreLocation.LocalMachine);
if (store != null)
{
store.Open(OpenFlags.ReadOnly | OpenFlags.OpenExistingOnly);
try
{
Common.Common.WriteLogs("准备加载证书");
X509Certificate2 certificate = store.Certificates.Find(X509FindType.FindBySerialNumber, "证书序列数", false)[0];
Common.Common.WriteLogs("加载证书完成");
if (certificate != null)
{
Common.Common.WriteLogs("X509Certificate2不为空");
request.ClientCertificates.Add(certificate);
Common.Common.WriteLogs("添加到request");
return request;
}
else
{
throw new Exception("X509Certificate2加载失败");
}
}
catch (Exception ex)
{
Common.Common.WriteLogs("加载证书失败,错误为:" + ex.Message);
throw ex;
}
}
else
{
throw new Exception("X509Store加载失败");
}
}
catch
{
throw;
}
}
}
本地加载证书的时候是用的这句
X509Certificate certificate = new X509Certificate(System.AppDomain.CurrentDomain.BaseDirectory + "证书地址和名称.pfx", "密码");
但是服务器上始终报错“The request was aborted: Could not create SSL/TLS secure channel”,这看着应该是加载证书错误了。后来网上找到解决办法,这种PFX证书在IIS上需要导入然后使用的。
于是用如下方法添加:
Windows xp/2003
1. 单击 开始 ,单击 运行 ,键入 mmc ,然后单击 确定 。
2. 在 文件 菜单上单击 添加/删除管理单元 。
3. 在 添加/删除管理单元 对话框中,单击 添加 。
4. 在 添加独立管理单元 对话框单击 证书 ,然后单击 添加 。
5. 在在 证书管理单元中 对话框中单击 计算机帐户 ,然后单击 下一步
6. 在 选择计算机 对话框中,单击 完成 。
7. 在 添加独立管理单元 对话框单击 关闭 ,然后单击 确定 。
8. 展开 证书 (本地计算机) ,展开 个人 ,然后单击 证书 。
9. 右键 -》 所有任务-》导入 选择你的证书导入
Windows 7
1. 单击 开始 ,单击 运行 ,键入 mmc ,然后单击 确定 。
2. 在 文件 菜单上单击 添加/删除管理单元 。
3. 在 可用的管理单元 列表中选择 证书 ,点击 添加 。
4. 在 证书管理 对话框中选择 计算机账户 ,然后单击 下一步
5. 在 选择计算机 对话框中,单击 完成 。
6. 在 添加或删除管理单元 对话框单击 确定 。
7. 展开 证书 (本地计算机) ,展开 个人 ,然后单击 证书 。
8. 右键 -》 所有任务-》导入 选择你的证书导入
————————————————
版权声明:本文为CSDN博主「redmapleleaf25」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/redmapleleaf25/article/details/49530381
但是加完证书改完代码后还是不行,留意到一下这句
这里要注意的是授权账户,IIS6下面一般用的是NetworkService,如果你用的IIS7,必须要保证你网站所用的 应用程序池的 "标识"和要授权的账户一致。其它版本不用设置
于是设置应用程序池中的标识。最终成功。
有可能加载证书的账户和我代码中不一样,可以挨个试试。
这问题搞了两天,实在心力交瘁。赶紧记录下来,供自己缅怀吧。
感谢redmapleleaf25的博客内容。本文涉及的文章地址为:
https://blog.csdn.net/redmapleleaf25/article/details/49530381