如何通过 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

根据此文档:

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 会产生此错误:

The manifest designer could not import the certificate.

The certificate you selected is not valid for signing because it is either expired or has another issue. For more information, see http://go.microsoft.com/fwlink/?LinkID=241478

我去了link,但没有任何解释真正发生了什么。一个人评论说要创建一个有效的临时证书,但它是一个仅持续一年的非特定测试证书。

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

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

你上面的 link 用于为 driver 制作 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\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\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! 

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

我在网上搜索了许多不同的答案,例如问题、评论中的答案、youtube 等……我决定把它放在一个整洁的地方,这样每个人都可以获取资源和学习。

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

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

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

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

  1. 您需要 self-signed 证书还是
  2. 您是否需要由 CA 证书颁发机构(即您的企业或组织)颁发的证书?

我将讨论这两种情况。在任何一种情况下,makecert 协议都已弃用 makecert deprecation notes

场景 1:如果您需要 self-signed 证书,您将如何进行

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

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

Create Certificate Package Signing
New-SelfSignedCertificate

1A。 *** 创建 New-SelfSignedCertificate 时,您必须了解必须以非常具体的方式创建证书。这是针对 self-signed 或 CA 颁发的证书。

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

a).必须有一个 Basic Constraints 扩展设置为 Subject Type=End Entity。简单来说,这就是说......当向您颁发此证书时,您不能让该证书成为具有颁发更多证书能力的进一步后续证书颁发机构。换句话说......这是行尾证书。

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

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

代码签名 (1.3.6..1.5.5.7.3.3) <<<< 这是用于对 1.3.6 进行代码签名的增强型密钥使用 OID... 编号

此信息是非常随机地找到的,并且没有按照任何特定的流动文档顺序找到,此处:

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={text}false") -KeyUsage DigitalSignature -KeyLength 2048 -NotAfter (Get-Date).AddMonths(33) -FriendlyName friendlyName2

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

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

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

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

  1. 使用命令,您将 运行 powershell 中的 cmdlet Export-PfxCertificate:

这是导出 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
  1. 此时你有一个可以与 visual studio 一起使用的密钥,你现在可以打包你的应用程序并生成一个 .appx 文件或一个 appxbundle 文件,这些文件将能够部署到本地机器 windows 商店。

可在此处找到详细说明:

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

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

这里你要记住的是,上面的部分是相关的,但你需要理解两者之间的区别self-signed证书和受信任的根证书 CA 和/或后续 CA。

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

这称为证书链。从上面记住,我们想要的证书是这个链的末端......基本约束 = LIMITED 为 0 或 false,这意味着它必须被签名为 End-endtity 或 Certificate Authroity = false ...换句话说,您不能出于任何原因从已颁发的证书中颁发更多证书。

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

再读一遍link: https://blogs.technet.microsoft.com/pki/2014/03/05/constraints-what-they-are-and-how-theyre-used/

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

当您将参数设置得恰到好处时...最终结果是一个可以由 openssl 或证书验证网站读取的文件,其扩展名为 .req 或 .csr

Powershell 能够通过一个名为 CertReq

的 cmdlet 创建它
  1. 您只需使用此命令并传入将创建您的 .req 证书请求的 .inf 文件

certreq -new TestReqConfig.inf MyRequest.req

  1. .inf 文件将包含密钥参数和证书信息,这与根据上述信息创建 new-selfsignedcertificate 时非常相似。

.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 = "{text}false"
2.5.29.37 = "{text}1.3.6.1.5.5.7.3.3"

Requesttype = PKCS10 允许它与 openssl csr 解码器一起使用...其他所有内容都通过这些站点进行了解释:

解码器通过打开创建文件并获取正在创建的信息来工作in-between

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

CertReq documentation

req / csr decoder

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