• 记ASP.NET 使用 X509Certificate2 出现的一系列问题


    在做微信支付退款的时候,由于需要使用到p12证书,结果就遇到一系列的坑。这里做个记录方便以后查阅。

    原先加载证书的代码:

    1  X509Certificate2 cert = new X509Certificate2(path + WxPayConfig.SSLCERT_PATH, WxPayConfig.SSLCERT_PASSWORD);
    2  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 KitsTools 或者 C:Program FilesWindows Resource KitsTools 文件夹下。打开cmd键入命令:

    winhttpcertcfg -g -c LOCAL_MACHINEMY -s "你的证书名称" -a "你的iis账号标识"

    -g 指令 就是授权

    -c 是指证书所在的存储区

    另外,证书的名称就是这个,如图所示   而不是其他什么东西,我就是搞错了,点击这个证书的详情取了里面的名称,导致授权不成功。

    而iis账号标识,是指站点对应的应用程序池,高级设置里有标识这个选项来选择对应的用户。当时我授权的标识是Network Service,而应用程序池中的标识ApplicationPoolIdentity,结果导致我发起请求时出现了:

    System.Net.WebException: 请求被中止: 未能创建 SSL/TLS 安全通道。

    3.修改代码

    做完这些配置之后修改一下之前加载证书的代码。

    1 X509Store store = new X509Store("My", StoreLocation.LocalMachine);
    2 store.Open(OpenFlags.ReadOnly | OpenFlags.OpenExistingOnly);
    3 
    4 System.Security.Cryptography.X509Certificates.X509Certificate2 cert  = 
    5     store.Certificates.Find(X509FindType.FindBySubjectName, "你的证书名称", false)[0];

    再测试一下,终于成功!

  • 相关阅读:
    iOS7 Assertion failure in -[UITableView layoutSublayersOfLayer:], /SourceCache/UIKit/UIKit-2903.2/UIView.m:8536
    mac上launchpad上顽固图标的删除办法
    证书和配置文件
    直接调用对象方法的两种方式
    Instrument使用
    ios第三方库和工具类
    pod 私有 pod 库创建和使用
    iOS 新 app 上架准备
    iOS 上架记录:Other
    ios Permission denied Command PhaseScriptExecution failed with a nonzero exit code
  • 原文地址:https://www.cnblogs.com/DannyShen/p/5390160.html
Copyright © 2020-2023  润新知