使用来自 Azure Key Vault 的证书对程序集进行 Nuke 构建签名

Nuke-build sign assemblies with Certificate from Azure Key Vault

我正在尝试使用来自 Azure Key Vault 的证书来签署我的程序集。

到目前为止,我已经将证书从本地服务器复制到我的构建目录中并签名:

    SignToolSettings settings = new SignToolSettings()
        .SetFileDigestAlgorithm("SHA256")
        .SetFile(CertFileNameAndPath)
        .SetFiles(fileNames)
        .SetPassword(password)
        .SetTimestampServerDigestAlgorithm("SHA256")
        .SetRfc3161TimestampServerUrl("http://timestamp.globalsign.com/tsa/r6advanced1");
    SignToolTasks.SignTool(settings);

我可以使用此 Nuke 设置从 Azure Key Vault 下载证书:

[KeyVaultSettings(
    BaseUrlParameterName = nameof(KeyVaultBaseUrl), 
    ClientIdParameterName = nameof(KeyVaultClientId),
    ClientSecretParameterName = nameof(KeyVaultClientSecret))] 
readonly KeyVaultSettings KeyVaultSettings;

[KeyVault] readonly KeyVault KeyVault;

[Parameter] readonly string KeyVaultBaseUrl;
[Parameter] readonly string KeyVaultClientId;
[Parameter] readonly string KeyVaultClientSecret;

[KeyVaultCertificate("MyCertificateIdentifier")] KeyVaultCertificate Certificate;

Certificate.Cer 现在包含 1276 个字节的 'something'。

我试图将那 1276 个字节保存为我的 certificate.pfx,但它不能用作代码签名证书。

在 Powershell 中我可以这样做:

$vaultName = "MyStorage"
$certificateName = "MyCertificate"
$pfxPath = ".$certificateName.pfx"
$password = "MyPassword"

Connect-AzureRmAccount
$pfxSecret = Get-AzureKeyVaultSecret -VaultName $vaultName -Name $certificateName
$pfxUnprotectedBytes = [Convert]::FromBase64String($pfxSecret.SecretValueText)
$pfx = New-Object Security.Cryptography.X509Certificates.X509Certificate2
$pfx.Import($pfxUnprotectedBytes, $null, [Security.Cryptography.X509Certificates.X509KeyStorageFlags]::Exportable)
$pfxProtectedBytes = $pfx.Export([Security.Cryptography.X509Certificates.X509ContentType]::Pkcs12, $password)
[IO.File]::WriteAllBytes($pfxPath, $pfxProtectedBytes)

所以我尝试对用 Nuke 收到的证书做同样的事情(它看起来不像是 base64 编码的,所以我跳过了解码):

    var pfx = new System.Security.Cryptography.X509Certificates.X509Certificate2(Certificate.Cer, (string)null, System.Security.Cryptography.X509Certificates.X509KeyStorageFlags.Exportable);
    var pfxProtectedBytes = pfx.Export(System.Security.Cryptography.X509Certificates.X509ContentType.Pkcs12, "MyPassword");
    File.WriteAllBytes(CertFileNameAndPath, pfxProtectedBytes);

但还是没有运气。

保存到磁盘文件当然是一个选项,但如果 SignToolSettings 直接接受 KeyVaultCertificate 就更好了。

我的解决方案确实是一种解决方法。

而不是引用证书:

[KeyVaultCertificate("MyCertificateIdentifier")] KeyVaultCertificate Certificate;

我将其作为字符串引用:

[KeyVaultSecret("MyCertificateIdentifier")] string CertificateBase64;

这个字符串可以进行 Base64 解码并保存到本地文件,我可以使用我的标准 SignTool。

N.B。有一个专用的 AzureSignTool,可以直接在 Azure 上使用,因此您根本不需要下载证书。不过还没试过。