记ASP.NET 使用 X509Certificate2 出现的一系列问题
在做微信支付退款的时候,由于需要使用到p12证书,结果就遇到一系列的坑。这里做个记录方便以后查阅。
原先加载证书的代码:
X509Certificate2 cert = new X509Certificate2(path + WxPayConfig.SSLCERT_PATH, WxPayConfig.SSLCERT_PASSWORD);
Request.ClientCertificates.Add(cert);
在vs 上测试通过。但是部署到IIS上一直报这个问题:
System.Security.Cryptography.CryptographicException: 系统找不到指定的文件。
详细 Stack Trace 信息:
在 System.Security.Cryptography.CryptographicException.ThrowCryptographicException(Int32 hr)
在 System.Security.Cryptography.X509Certificates.X509Utils._LoadCertFromFile(String fileName, IntPtr password, UInt32 dwFlags, Boolean persistKeySet, SafeCertContextHandle& pCertCtx)
在 System.Security.Cryptography.X509Certificates.X509Certificate.LoadCertificateFromFile(String fileName, Object password, X509KeyStorageFlags keyStorageFlags)
在 System.Security.Cryptography.X509Certificates.X509Certificate2..ctor(String fileName, String password)
在 TenpayCore.HttpService.Post(TenpayException& tpEx, Byte[] xml, String url, Boolean isUseCert, Int32 timeout)。
反复测试之后,确认不是代码跟文件路径的问题。在查询微软的文档后发现了相关说明,指明了问题所在,以下分享一下我的操作流程。
1.将证书安装上去
点击 [开始] -> [运行] -> 键入[mmc] 进入“控制台”界面 -> 选择[文件] -> [添加/删除管理单元](Ctrl+M)
选择 [证书] -> [计算机账户] -> [下一步] -> [完成]
选择 [证书] -> [导入]
导入你的证书文件
2.授权证书
先安装 winhttpcertcfg.exe 工具( Windows HTTP Services Certificate Configuration Tool )。安装完成之后在该工具在 C:\Program Files (x86)\Windows Resource Kits\Tools 或者 C:\Program Files\Windows Resource Kits\Tools 文件夹下。打开cmd键入命令:
winhttpcertcfg -g -c LOCAL_MACHINE\MY -s "你的证书名称" -a "你的iis账号标识"
-g 指令 就是授权
-c 是指证书所在的存储区
另外,证书的名称就是这个,如图所示 而不是其他什么东西,我就是搞错了,点击这个证书的详情取了里面的名称,导致授权不成功。
而iis账号标识,是指站点对应的应用程序池,高级设置里有标识这个选项来选择对应的用户。当时我授权的标识是Network Service,而应用程序池中的标识ApplicationPoolIdentity,结果导致我发起请求时出现了:
System.Net.WebException: 请求被中止: 未能创建 SSL/TLS 安全通道。
3.修改代码
做完这些配置之后修改一下之前加载证书的代码。
X509Store store = new X509Store("My", StoreLocation.LocalMachine);
store.Open(OpenFlags.ReadOnly | OpenFlags.OpenExistingOnly); System.Security.Cryptography.X509Certificates.X509Certificate2 cert =
store.Certificates.Find(X509FindType.FindBySubjectName, "你的证书名称", false)[];
再测试一下,终于成功!
最新文章
- 串行移位锁存并行输出可级联器件74HC595
- PoE以太网远程供电
- mysql 授权
- dir:一行代码,提取出所有视频文件名称及路径
- C#多线程编程(1):线程的启动
- RAC 的一些概念性和原理性的知识(转)
- Nginx的HTTP模块
- Android平台中实现对XML的三种解析方式
- Matplotlib快速入门笔记
- Linux上安装Libssh2
- React的入门知识与概念【1】
- 个人用的感觉比较舒服的 idea 插件,不定时更新
- Spring MVC 注解相关
- 【iCore4 双核心板_ARM】例程三十八:DSP MATH库测试
- PHP 字符串包含判断
- IT软件外包行业深入分析:现状、前途、趋势、待遇 什么是软件外包 外包公司是怎么工作的 软件外包公司的面试 软件外包公司需要什么样的人
- <;<;精通正在表达式>;>; 书评
- Android 时间轴的实现
- spark上的一些常用命令(一)
- Java List添加元素
热门文章
- php语法分析
- h5移动端聊天室|仿微信界面聊天室|h5多人聊天室
- 使用json-lib-*.jar的JSON解析工具类
- (转)AWK函数
- Vue的Computed的使用
- LNMT(Linux+Nginx+MySQL+Tomcat)常见性能参数调优
- Okhttp3上传多张图片同时传递参数
- OpenGL12-shader(GLSL)着色语言4-广告版的实现
- glide 解决 golang.org/x/net 等依赖包无法获取
- CentOS6.5安装php7+nginx+mysql实现安装WordPress