使用来自 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 上使用,因此您根本不需要下载证书。不过还没试过。
我正在尝试使用来自 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 上使用,因此您根本不需要下载证书。不过还没试过。