如何通过 Visual Studio 2019、2017 和 2015 为 Windows 10 UWP 应用程序创建有效的受信任和/或自签名证书

Posted

技术标签:

【中文标题】如何通过 Visual Studio 2019、2017 和 2015 为 Windows 10 UWP 应用程序创建有效的受信任和/或自签名证书【英文标题】:How to create a working trusted and or self-signed certificate for a Windows 10 UWP application via Visual Studio 2019, 2017 and 2015 【发布时间】:2018-07-08 14:41:29 【问题描述】:

根据本文档:

https://docs.microsoft.com/en-us/windows-hardware/drivers/devtest/makecert

以下命令描述了创建 Windows cer 文件(即来自受信任的提供者的证书。)

问题在于,在 Visual Studio 2017 中构建应用程序时,它仅允许通过 package.windows10.appxmanifest 使用 pfx 文件。更新此命令行参考时,它不会生成 pvk 文件,因此需要添加

MakeCert -r -pe -ss PrivateCertStore -n "CN=Contoso.com(Test)" testcert.cer

额外的命令行选项,例如 /sv SubjectKeyFile,它将生成生成的 pvk 文件。

但是即使使用这个命令行参考:

MakeCert -r -pe -ss PrivateCertStore -n "CN=Contoso.com(Test)" -sv testcert.pvk testcert.cer

将生成的证书文件植入 Visual Studio 会产生此错误:

清单设计器无法导入证书。

您选择的证书对签名无效,因为它已过期或有其他问题。有关详细信息,请参阅 http://go.microsoft.com/fwlink/?LinkID=241478

我去链接,并没有解释真正发生了什么。一个人会创建一个可以工作的临时证书,但它是一个非特定的测试证书,只持续一年。

有没有更好的方法来使用 makecert 创建脚本?我如何知道证书最终是否正确构建?其他文档会有所帮助,但我没有找到其他任何东西。

【问题讨论】:

【参考方案1】:

根据本文档:https://docs.microsoft.com/en-us/windows-hardware/drivers/devtest/makecert。

在您的案例中,上述链接用于为驱动程序制作 Windows 证书。如果您想为您的 UWP 包制作证书,您可以参考以下步骤:

第 1 步:确定包的发布者名称

第 2 步:使用 MakeCert.exe 创建私钥

第 3 步:使用 Pvk2Pfx.exe 创建个人信息交换 (.pfx) 文件

更多详情请参考How to create an app package signing certificate

您也可以使用以下命令直接创建证书。您只需将CN 参数替换为您的参数即可。

制作Pvk

"<C:\Program Files (x86)\Windows Kits\10\bin\x64\MakeCert.exe>" /n "CN=Company, O=My Company, C=US" /r /pe /h 0 /eku "1.3.6.1.5.5.7.3.3,1.3.6.1.4.1.311.10.3.13" /e 01/01/2018 /sv C:\Development\certificates\Company.pvk C:\Development\certificates\Company.cer

制作 Cer

"<C:\Program Files (x86)\Windows Kits\10\bin\x64\Pvk2Pfx.exe>" /pvk C:\Development\certificates\Company.pvk /pi pvkPassword /spc C:\Development\certificates\Company.cer /pfx C:\Development\certificates\Company.pfx /po password! /pi password! 

【讨论】:

【参考方案2】:

@nico 提供的答案有正确的陈述,但让我意识到这个问题比我最初描述的要多。所以我清理了问题标题和问题,以提供更好的问题和后续答案。

在网上搜索我在很多不同的地方找到了许多这样的答案,例如。问题、cmets、youtube 等中的答案......我决定把它放在一个漂亮整洁的地方,这样每个人都可以资源和学习。

首先,人们必须问自己,他们使用该应用程序的目的是什么?应用程序是要上传到 Microsoft Store 还是仅供内部使用。

无论哪种方式,您都希望调试和开发应用程序。调试不需要安装证书,所以从这个意义上说我们是安全的。

如果您在组织内部使用该应用程序,或者只是在本地计算机上使用该应用程序,那么您将需要一个受信任的证书。

此证书可以存在于几个不同的场景中。

    您是否需要自签名证书或 您是否需要 CA 证书颁发机构(即您的企业或组织)颁发的证书?

我将介绍这两种情况。无论哪种情况,makecert 协议都已弃用 makecert deprecation notes

场景 1:如果您需要自签名证书,您将如何进行

    转到 powershell 并使用 New-SelfSignedCertificate pkiclient cmdlet...这将为您提供一个 .cer 和相应的私钥 + 公共证书组合 = .pfx 的创建,如果您为证书 + 私钥构建...而且您必须有一个私钥,即 .pfx,才能将您的应用程序与 Visual Studio 捆绑和打包,并将其安装到本地 Windows 应用程序商店(不要与 Microsoft 商店混淆。)

以下是要遵循的链接 ***请务必在创建证书之前先阅读 1A:

Create Certificate Package SigningNew-SelfSignedCertificate

1A。 *** 当您创建 New-SelfSignedCertificate 时,您必须了解必须以非常特定的方式创建证书。这适用于自签名或 CA 颁发的证书。

具体来说,证书必须具备 2 个属性

一)。必须将基本约束扩展设置为 Subject Type=End Entity。简而言之,这就是...当此证书颁发给您时,您不能让该证书成为具有颁发更多证书的能力的后续证书颁发机构。换句话说...这是行尾证书。

您可以在此处阅读有关约束的更多信息: https://blogs.technet.microsoft.com/pki/2014/03/05/constraints-what-they-are-and-how-theyre-used/

b)。增强型密钥使用 (EKU) 扩展的值设置为代码签名。这样做是为了防止证书被用于其预期目的之外的任何其他用途......这是确保软件来自软件发布者 &&& 保护软件在发布后不被更改。 在证书的详细信息中,信息将如下所示:

代码签名 (1.3.6..1.5.5.7.3.3)

这个信息是随机找到的,没有任何特定的文档流动顺序,在这里:

Generating Certificates for the Windows Store Apps

1B。因此,最终通过 powershell 使用 New-SelfSignedCertifcate cmdlet 将运行如下命令:

New-SelfSignedCertificate -Type CodeSigningCert -Subject "CN=YourCompany CA, 0=Your Corporation, C=US" -TextExtension @("2.5.29.19=textfalse") -KeyUsage DigitalSignature -KeyLength 2048 -NotAfter (Get-Date).AddMonths(33) -FriendlyName friendlyName2

上述命令满足代码签名证书的两个条件(尽管您可以选择具有相应代码签名类型的密钥使用扩展 oid 来代替 -type 属性,即代码签名 oid= 1.3.6.1.5.5 .7.3.3)

如果您在 powershell 中运行上述命令,您将创建 2 个现在可以导出的东西......

A.) 公共证书 B.) 包含在 .pfx 文件格式中的私钥 + 公共证书。

现在我们能够导出 .pfx,这就是您创建密码和导出私钥 + 证书 .pfx 文件的方式。

    使用该命令可以在 powershell Export-PfxCertificate 中运行 cmdlet:

这里是导出 pfx 文档:

https://docs.microsoft.com/en-us/powershell/module/pkiclient/export-pfxcertificate?view=win10-ps

    $pwd = ConvertTo-SecureString -String <Your Password> -Force -AsPlainText 
    Export-PfxCertificate -cert "Cert:\LocalMachine\My\<Certificate Thumbprint>" -FilePath <FilePath>.pfx -Password $pwd
    此时,您拥有一个可与 Visual Studio 一起使用的密钥,您现在可以打包您的应用程序并生成一个 .appx 文件或一个 appxbundle 文件,该文件将能够部署到本地计算机的 Windows 商店。

详细说明可以在这里找到:

https://docs.microsoft.com/en-us/windows/uwp/packaging/packaging-uwp-apps

场景 2:如果您需要来自组织证书颁发机构的可信证书

您需要记住的是,上面的部分是相关的,但您需要了解自签名证书与受信任的根证书 CA 和/或后续 CA 之间的区别。

这是理解它的一种方法。最初的根证书是自签名证书。但是,它有能力为其他人颁发各种证书。即服务器授权或代码签名......想想基本约束无限。它还可以颁发其他能够出于各种原因向他人颁发证书的证书颁发机构。

这称为证书链。从上面记住,我们想要的证书是这个链的末端...... Basic Constraints = LIMITED 为 0 或 false,这意味着它必须被签名为 End-endtity 或 Certificate Authority = false...... 在其他换句话说,您不能出于任何原因从已颁发的证书中颁发进一步的证书。

因为这是一个只需要安装和使用的应用程序。这是有道理的。

再次阅读此链接: https://blogs.technet.microsoft.com/pki/2014/03/05/constraints-what-they-are-and-how-theyre-used/

因此,对于下一部分,我将解释通过证书请求从您的证书颁发机构请求证书的步骤。在通过 openssl 的 linux 世界中,这被称为 .csr ... 在 powershell 世界中,这被称为 .req

当你把参数放得恰到好处...最终结果是一个可以被openssl或cert验证网站读取的文件,扩展名为.req或.csr

Powershell 能够通过名为 CertReq 的 cmdlet 来创建它

    您只需使用此命令并传入一个 .inf 文件,该文件将创建您的 .req 证书请求

certreq -new TestReqConfig.inf MyRequest.req

    .inf 文件将包含密钥和证书信息的参数,这与根据上述信息创建新的自签名证书时非常相似。

.inf 文件如下所示:

[NewRequest] 
Subject = "C=US,ST=Florida,L=City,O=Your Company Information,OU=City 
Information,CN=certname.com" 
Requesttype = PKCS10
Exportable = TRUE
HashAlgorithm = md5
KeyAlgorithm = RSA
KeyLength = 2048 
KeyUsage = CERT_DIGITAL_SIGNATURE_KEY_USAGE 
FriendlyName = "FriendlyName CERT"
[Extensions] 
2.5.29.19 = "textfalse"
2.5.29.37 = "text1.3.6.1.5.5.7.3.3"

Requesttype = PKCS10 允许它与 openssl csr 解码器一起工作......其他一切都通过这些网站进行解释:

解码器通过打开创建文件并获取中间创建的信息来工作

-----BEGIN NEW CERTIFICATE REQUEST-----
-----END NEW CERTIFICATE REQUEST-----

CertReq documentation

req / csr decoder

我希望这些信息能帮助人们了解证书以及如何在 Windows 应用商店应用程序的打包和创建中使用它们。

【讨论】:

-TextExtension 参数中缺少 )。这让我走了一会儿。 我为上述类型添加了编辑并添加了一些附加信息,用于在本地运行自签名 CA 证书,而不会收到警告。 @whodeee 我正在尝试编辑它,但我并没有真正看到如何......我明白你在说什么。 @RoyJacobs 我读到了您的编辑,有一个很容易直接从 Visual Studio 获得临时证书,但这是临时的,而不是在这种情况下需要的企业解决方案。跨度> 那太痛苦了。感谢您记录它。

以上是关于如何通过 Visual Studio 2019、2017 和 2015 为 Windows 10 UWP 应用程序创建有效的受信任和/或自签名证书的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Visual Studio 2019 进行 .NET Core 远程开发

如何在 Visual Studio 2019 中禁用重构菜单箭头/弹出窗口?

如何在 Visual Studio 2019 中有条件地编译 c++ 源文件?

如何在 Visual Studio 2019 中使用 C#10

如何使用 Visual Studio 2019 在 ASP.NET Core 2.2 中安装 Font Awesome [关闭]

如何在 Visual Studio 2019 C++ 中创建非虚拟文件夹