在 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.ExpandEnvironmentVariables("%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 有关吗?我该如何解决?
此致,
詹斯
通过门户上传您的证书:
功能应用设置 -> 进入应用服务设置 -> SSL 证书 -> 上传证书
通过 Azure 门户上传证书后,您需要添加一个名为 WEBSITE_LOAD_CERTIFICATES 的应用程序设置(也通过门户)并将其值设置为您上传的指纹证书。如果需要,这可以是多个指纹的逗号分隔列表,甚至可以 * 加载所有上传的证书
代码:
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.ExpandEnvironmentVariables("%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);
我想创建一个将文件上传到 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.ExpandEnvironmentVariables("%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 有关吗?我该如何解决?
此致, 詹斯
通过门户上传您的证书: 功能应用设置 -> 进入应用服务设置 -> SSL 证书 -> 上传证书
通过 Azure 门户上传证书后,您需要添加一个名为 WEBSITE_LOAD_CERTIFICATES 的应用程序设置(也通过门户)并将其值设置为您上传的指纹证书。如果需要,这可以是多个指纹的逗号分隔列表,甚至可以 * 加载所有上传的证书
代码:
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.ExpandEnvironmentVariables("%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);