在 Azure Functions 中加载证书运行时错误

Runtime error loading certificate in Azure Functions

我想创建一个将文件上传到 Office365 Sharepoint 文档库的 Azure 函数(C# API 通用 HTTP)方法。

因为 OneDrive API 允许我上传大文件(使用守护进程和证书身份验证),我已经成功地使用 C# 控制台应用程序实现了目标。

现在的想法是将代码移到 Azure 函数中。 但是,我在函数运行时收到有关加载 pfx 证书的错误。

public static async Task<bool> Run(HttpRequestMessage req, TraceWriter log)
{
   string certfile = System.IO.Path.Combine(Environment.ExpandEnvironmentVariable‌​s("%HOME%"), @"site\wwwroot\<functionname>\mykeyfile.pfx"); 

    X509Certificate2 cert = new X509Certificate2(certfile, "<myinsanepwd>");

    return true; //temporary 
}

行 X509Certificate2 cert = new X509Certificate2(certfile, "");抛出异常 System.Security.Cryptography.CryptographicException: 系统找不到指定的文件。

这真的很奇怪,因为文件存在于指定的路径上(我在方法中使用 File.Exists() 进行了检查:)) 此错误可能与 support.microsoft.com/en-us/kb/948154 有关吗?我该如何解决?

此致, 詹斯

  1. 通过门户上传您的证书: 功能应用设置 -> 进入应用服务设置 -> SSL 证书 -> 上传证书

  2. 通过 Azure 门户上传证书后,您需要添加一个名为 WEBSITE_LOAD_CERTIFICATES 的应用程序设置(也通过门户)并将其值设置为您上传的指纹证书。如果需要,这可以是多个指纹的逗号分隔列表,甚至可以 * 加载所有上传的证书

  3. 代码:

    using System.Net;
    using System.Security.Cryptography;
    using System.Security.Cryptography.X509Certificates;
    
    public static async Task<HttpResponseMessage> Run(HttpRequestMessage req, TraceWriter log)
    {
        var store = new X509Store(StoreName.My, StoreLocation.CurrentUser);
        store.Open(OpenFlags.ReadOnly);
        var certs = store.Certificates.Find(X509FindType.FindByThumbprint, "Your thumb", false);
    

添加X509KeyStorageFlags.MachineKeySet | X509KeyStorageFlags.PersistKeySet | X509KeyStorageFlags.Exportable 给构造函数。此代码对我有用:

using System.Net;
using System;
using System.Security.Cryptography;
using System.Security.Cryptography.X509Certificates;

public static async Task<HttpResponseMessage> Run(HttpRequestMessage req, TraceWriter log)
{
    string certfile = System.IO.Path.Combine(Environment.ExpandEnvironmentVariable‌​s("%HOME%"), @"site\wwwroot\HttpTriggerCSharp4\myCertFile.pfx");        
    log.Info(certfile); 
    log.Info(System.IO.File.Exists(certfile).ToString());
    X509Certificate2 cert = new X509Certificate2(certfile, "password", X509KeyStorageFlags.MachineKeySet | X509KeyStorageFlags.PersistKeySet | X509KeyStorageFlags.Exportable);     
    log.Info(cert.Thumbprint);