Azure 上的 Certenroll - 生成自签名证书

Posted

技术标签:

【中文标题】Azure 上的 Certenroll - 生成自签名证书【英文标题】:Certenroll on Azure - Generating self signed certificates 【发布时间】:2019-11-11 10:56:23 【问题描述】:

我已经使用 Certenroll (CERTENROLLLib) 构建了一个创建自签名证书。一切都在本地工作,但只要我将它部署Azure,我就会得到:

服务器 API 错误:消息: CertEnroll::CX509Enrollment::_CreateRequest:访问被拒绝。 0x80070005(WIN32:5 ERROR_ACCESS_DENIED),堆栈跟踪:在 CERTENROLLLib.IX509Enrollment2.CreateRequest(EncodingType 编码) 在 Foo.Api.Core.Providers.CertificateProvider.GenerateBase64EncodedPfx(字符串 subjectName, Int32 certificateValidityInYears, String password) at Foo.Api.Core.Services.CertificateService.d__4.MoveNext() --- 从先前抛出异常的位置结束堆栈跟踪 --- 在 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务 任务)在 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务 任务)在 Foo.ServerApi.Services.DocumentSigningService.d__7.MoveNext() --- 从先前抛出异常的位置结束堆栈跟踪 --- 在 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务 任务)在 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务 任务)在 Foo.ServerApi.Services.DocumentSigningService.d__5.MoveNext() --- 从先前抛出异常的位置结束堆栈跟踪 --- 在 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务 任务)在 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务 任务)在 System.Runtime.CompilerServices.TaskAwaiter.ValidateEnd(任务任务) 在 Foo.ServerApi.Controllers.DocumentController.c__DisplayClass10_1.d.MoveNext()

如果使用:

var cert = new CX509CertificateRequestCertificate();
            cert.InitializeFromPrivateKey(X509CertificateEnrollmentContext.ContextMachine, privateKey, "");

服务器 API 错误:消息: CertEnroll::CX509CertificateRequestCertificate::InitializeFromPrivateKey: 参数不正确。 0x80070057 (WIN32: 87 ERROR_INVALID_PARAMETER),堆栈跟踪:在 CERTENROLLLib.IX509CertificateRequestCertificate2.InitializeFromPrivateKey(X509CertificateEnrollmentContext 上下文,IX509PrivateKey pPrivateKey,字符串 strTemplateName) 在 Foo.Api.Core.Providers.CertificateProvider.GenerateBase64EncodedPfx(字符串 subjectName, Int32 certificateValidityInYears, String password) at Foo.Api.Core.Services.CertificateService.d__4.MoveNext() --- 从先前抛出异常的位置结束堆栈跟踪 --- 在 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务 任务)在 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务 任务)在 Foo.ServerApi.Services.DocumentSigningService.d__7.MoveNext() --- 从先前抛出异常的位置结束堆栈跟踪 --- 在 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务 任务)在 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务 任务)在 Foo.ServerApi.Services.DocumentSigningService.d__5.MoveNext() --- 从先前抛出异常的位置结束堆栈跟踪 --- 在 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务 任务)在 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务 任务)在 System.Runtime.CompilerServices.TaskAwaiter.ValidateEnd(任务任务) 在 Foo.ServerApi.Controllers.DocumentController.c__DisplayClass10_1.d.MoveNext()

如果使用:

var cert = new CX509CertificateRequestCertificate();
            cert.InitializeFromPrivateKey(X509CertificateEnrollmentContext.ContextUser, privateKey, "");

有什么方法可以通过 Azure 上的 Certenroll 解决这个问题?

编辑:引导我找到正确路径的最终错误。

服务器 API 错误:消息:CertEnroll::CX509PrivateKey::Create: The 系统找不到指定的文件。 0x80070002 (WIN32: 2 ERROR_FILE_NOT_FOUND),堆栈跟踪:在 CERTENROLLLib.IX509PrivateKey2.Create() 在 Foo.Api.Core.Providers.CertificateProvider.GenerateBase64EncodedPfx(字符串 subjectName, Int32 certificateValidityInYears, String password) at Foo.Api.Core.Services.CertificateService.d__4.MoveNext() --- 从先前抛出异常的位置结束堆栈跟踪 --- 在 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务 任务)在 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务 任务)在 Foo.ServerApi.Services.DocumentSigningService.d__7.MoveNext() --- 从先前抛出异常的位置结束堆栈跟踪 --- 在 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务 任务)在 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务 任务)在 Foo.ServerApi.Services.DocumentSigningService.d__5.MoveNext() --- 从先前抛出异常的位置结束堆栈跟踪 --- 在 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务 任务)在 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务 任务)在 System.Runtime.CompilerServices.TaskAwaiter.ValidateEnd(任务任务) 在 Foo.ServerApi.Controllers.DocumentController.c__DisplayClass10_1.d.MoveNext()

【问题讨论】:

相关帖子 - 对于本地部署:CryptographicException was unhandled: System cannot find the specified file. 【参考方案1】:
    InitializeFromPrivateKey 中使用X509CertificateEnrollmentContext.ContextUser 创建私钥时设置privateKey.MachineContext = false;Azure 上添加新的应用程序设置

WEBSITE_LOAD_USER_PROFILE = 1

这让它对我有用

【讨论】:

当我的应用服务计划使用Free 层时,即使将WEBSITE_LOAD_USER_PROFILE 设置为1,对我来说,事情也没有奏效。在我将它升级到S1 层后它开始工作了。

以上是关于Azure 上的 Certenroll - 生成自签名证书的主要内容,如果未能解决你的问题,请参考以下文章

哪款适合 Azure 上的自定义推送?

应用自定义域后,Azure 上的 Web 应用加载缓慢

IE9,使用 CertEnroll.dll 时自动化服务器无法创建对象错误

TFS Api 未在 Dev Azure 上的自定义流程模板中提供自定义状态

在 Service Fabric 中运行 Azure DevOps 自托管生成代理时出现“无法解析远程名称”

消息正文上的 Azure 服务总线订阅筛选器