4

我試圖創建一個自簽名證書 KeyVault使用「自我」發行人。KeyVault生成的證書與可導出私鑰

$policy = New-AzureKeyVaultCertificatePolicy -SubjectName "CN=$($certificateName)" -IssuerName "Self" -ValidityInMonths 12 

$policy.Exportable = $true 

Add-AzureKeyVaultCertificate -VaultName $vaultName -Name $certificateName -CertificatePolicy $policy 

但是,在取回證書時,它似乎沒有私鑰。

在深入瞭解PowerVault cmdlet的其他API文檔和源代碼後,直接在KeyVault中創建證書似乎並沒有在網上得到很大的介紹,我很難過。

我希望它是簡單的東西我已經錯過了,因爲我想避免本地創建的證書..

回答

6

如果你想用自己的私鑰以及檢索您的證書,那麼你可以導出它通過您的磁盤上的一個PFX文件(密碼爲空):

$vaultName = "my-vault-name" 
$certificateName = "my-cert-name" 
$pfxPath = [Environment]::GetFolderPath("Desktop") + "\$certificateName.pfx" 

$pfxSecret = Get-AzureKeyVaultSecret -VaultName $vaultName -Name $certificateName 
$pfxUnprotectedBytes = [Convert]::FromBase64String($pfxSecret.SecretValueText) 
[IO.File]::WriteAllBytes($pfxPath, $pfxUnprotectedBytes) 

如果你想查看剛纔在內存中的私有密鑰本身沒有寫入磁盤,然後嘗試:

$vaultName = "my-vault-name" 
$certificateName = "my-cert-name" 
$pfxPath = [Environment]::GetFolderPath("Desktop") + "\$certificateName.pfx" 

$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) 
$pfx.PrivateKey.ExportParameters($true) 

除了指數和模數外,還將顯示私有參數。

如果你想保護磁盤上的PFX文件用自己的密碼(按「檢索PFX文件&添加密碼改回」在this blog post指令),然後嘗試:

$vaultName = "my-vault-name" 
$certificateName = "my-cert-name" 
$pfxPath = [Environment]::GetFolderPath("Desktop") + "\$certificateName.pfx" 
$password = "my-password" 

$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) 

如REST API文檔herehere中所述,Azure密鑰保管庫(AKV)通過三個相互關聯的資源(AKV證書,AKV密鑰和AKV密鑰)表示給定的X.509證書。所有三者將共享相同的名稱和相同的版本 - 要驗證此情況,請檢查Get-AzureKeyVaultCertificate的響應中的Id,KeyIdSecretId屬性。

每個3個資源的用於觀看給定的X.509證書提供不同的角度:

  • 的AKV證書提供了X.509證書的公鑰證書和元數據。它包含公鑰的模數和指數(ne)以及其他證書元數據(指紋,失效日期,主題名稱等)。在PowerShell中,您可以通過獲得此:
(Get-AzureKeyVaultCertificate -VaultName $vaultName -Name $certificateName).Certificate 
  • 的AKV鍵提供了X.509證書的私鑰。如果相應的證書被標記爲不可導出,那麼執行密碼操作(如簽名)可能會很有用。在PowerShell中,您只能獲得通過這個私鑰的公共部分:
(Get-AzureKeyVaultKey -VaultName $vaultName -Name $certificateName).Key 
  • 的AKV祕密提供了一種導出全X.509證書,包括其私人密鑰(如果其策略允許私鑰導出)。
(Get-AzureKeyVaultSecret -VaultName $vaultName -Name $certificateName).SecretValueText 
+1

非常徹底響應,由於阿德:如上所示,可以在PowerShell中通過以下方式獲得的電流base64編碼的證書!我已經開始認識到,我需要回避這個祕密,因爲powershell API不是最簡單易懂的--Certificate是一個陷阱:-)這有助於很好地解釋事情! –