最近倒腾一个银行的项目,被折腾的伤痕累累,主要是与银行对接时采用的证书验证的方式比较坑,也可能是之前没有接触过类似的东西吧。
在这记录一下踩的坑,以备缅怀。
1、项目最好使用FRAMEWORK 4.6版本。4.0版本说实话好多东西确实已经不适宜了。比如
ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3
| SecurityProtocolType.Tls
| SecurityProtocolType.Tls11//Tls11
| SecurityProtocolType.Tls12; //Tls12
中 Tls11和Tls12这两个属性4.0中都没有的。
2、如果加载证书加载为空,可以尝试看看遍历一下能获取到的证书。
X509Store store = new X509Store(StoreName.My, StoreLocation.LocalMachine);// 这里要注意证书的位置
store.Open(OpenFlags.OpenExistingOnly | OpenFlags.ReadWrite);
Common.Common.WriteLogs(Common.Common.ObjectToJson(store));
Common.Common.WriteLogs(Common.Common.ObjectToJson(store.Certificates));
X509Certificate2Collection collect = store.Certificates;
Common.Common.WriteLogs(collect.Count.ToString());
for (int iIndex = 0; iIndex < collect.Count; iIndex++)
{
X509Certificate2 cer = collect[iIndex];
Common.Common.WriteLogs("第" + iIndex.ToString() + "个证书");
Common.Common.WriteLogs("SerialNumber:" + cer.SerialNumber);
Common.Common.WriteLogs("Thumbprint:" + cer.Thumbprint);
Common.Common.WriteLogs("SubjectName:" + cer.SubjectName);
}
Common.Common.WriteLogs方法为写日志的方法。
这样如何去查找证书就可以更有针对性了
我是通过证书指纹进行查找的,开始用序列数,但是不知道为啥始终查询不到。
开始指纹用的查看证书中的两位两位间隔的字符串,发现也找不到,后来打印到日志发现都是连在一起的。不过测试环境中序列号就是2位2位空格隔开的那种字符串也没问题。
X509Certificate2 certificate = store.Certificates.Find(X509FindType.FindByThumbprint, "指纹", false)[0];
3、应用程序池中的标识一定要设置。
经常会提示“未能创建 SSL/TLS 安全通道”。证书加载成功了,但是这就是死活过不去,后来,应用程序池-高级设置-进程模型-标识修改后解决了。我最终采用的是LocalSystem。