【问题标题】:Export Azure SSL certificate as pfx file将 Azure SSL 证书导出为 pfx 文件
【发布时间】:2016-12-14 16:08:20
【问题描述】:

我从 azure 购买了通配符证书。它现在位于 Key Vault 中。我需要将它上传到我们的另一台服务器,该服务器托管同一域的其他应用程序之一。在 azure 门户中的任何位置都没有将证书导出为 .pfx 文件的选项。

请帮忙。

【问题讨论】:

  • 您的其他服务器是否在 Azure 中?从 Scott Simms 发布的内容看来,您只能在 Azure 的 Web 应用程序中重复使用该证书。它不适用于 Azure 之外的东西,也许可以用于 Azure IaaS VM,但这并不容易。
  • 我也在尝试导出此密钥,但似乎只有 azure 应用服务才能做到这一点。你成功了吗?
  • 您可以使用上传到 azure web 应用程序的证书导出 .cert,但不能导出 .pfx。要了解如何导出.cert,请查看此帖子:Export SSL Certificate from Azure Web App

标签: azure ssl-certificate azure-web-app-service


【解决方案1】:

有些文档已经过时,所以这里有一个版本,说明如何在 Mac 上使用 PowerShell 和 Azure CLI 将其导出 + 转换为 Nginx 的 PEM 格式。分享只是因为它对我来说很痛苦,所以希望它对某人有用:

pwsh
az keyvault secret show --vault-name KeyVaultName --name SecretName | tail -n 1 | cut -d ' ' -f 3 | pbcopy
echo $(pbpaste) > /tmp/pass
$secret=$(cat /tmp/pass)
$pfxCertObject= New-Object System.Security.Cryptography.X509Certificates.X509Certificate2 -ArgumentList @([Convert]::FromBase64String($secret),"",[System.Security.Cryptography.X509Certificates.X509KeyStorageFlags]::Exportable)
$pfxPassword = -join ((65..90) + (97..122) + (48..57) | Get-Random -Count 50 | % {[char]$_})
$currentDirectory = (Get-Location -PSProvider FileSystem).ProviderPath
[Environment]::CurrentDirectory = (Get-Location -PSProvider FileSystem).ProviderPath
[io.file]::WriteAllBytes("./appservicecertificate.pfx",$pfxCertObject.Export([System.Security.Cryptography.X509Certificates.X509ContentType]::Pkcs12,$pfxPassword))
openssl pkcs12 -in appservicecertificate.pfx -out /tmp/certificate.pem -clcerts -nokeys -password pass:$(echo $pfxPassword)
openssl pkcs12 -in appservicecertificate.pfx -out /tmp/certificate.key_protected -nocerts -password pass:$(echo $pfxPassword)
openssl rsa -in /tmp/certificate.key_protected -out /tmp/certificate.key -passin pass:$(echo $pfxPassword)

最后三行取自here,中间部分是主要guide的精简版

【讨论】:

    【解决方案2】:

    我发现@dmitry-kazakov 的回答很有帮助,但必须执行一些小的更新才能让它为我工作。

    首先我必须执行这个命令并将其分配给$azureUserPrincipalName

    PS Azure:\> Get-Azureaduser
    
    ObjectId                             DisplayName UserPrincipalName                                             UserType
    --------                             ----------- -----------------                                             --------
    89500455-0019-4059-8ef8-f1w32993z520 A User rmoore_roundlabinc.com#EXT#@rmooreroundlabinc.onmicrosoft.com Member
    

    那么这里是更新的脚本:

    $appServiceCertificateName = "ascdemo" #This is the "Subject Name" in Azure, not "Name"
    $resourceGroupName = "ascdemorg"
    $azureLoginEmailId = "user@microsoft.com"
    $subscriptionId = "fb2c25dc-6bab-45c4-8cc9-cece7c42a95a"
    $azureUserPrincipalName = "user@microsoft.com#EXT#@user@microsoft.com.onmicrosoft.com"
    
    Login-AzureRmAccount
    Set-AzureRmContext -SubscriptionId $subscriptionId
    
    $ascResource= Get-AzureRmResource -ResourceName $appServiceCertificateName -ResourceGroupName $resourceGroupName -ResourceType "Microsoft.CertificateRegistration/certificateOrders" -ApiVersion "2019-05-01"
    $keyVaultId = ""
    $keyVaultSecretName = ""
    
    $certificateProperties=Get-Member -InputObject $ascResource.Properties.certificates[0] -MemberType NoteProperty
    $certificateName = $certificateProperties[0].Name
    $keyVaultId = $ascResource.Properties.certificates[0].$certificateName.KeyVaultId
    $keyVaultSecretName = $ascResource.Properties.certificates[0].$certificateName.KeyVaultSecretName
    
    $keyVaultIdParts = $keyVaultId.Split("/")
    $keyVaultName = $keyVaultIdParts[$keyVaultIdParts.Length - 1]
    $keyVaultResourceGroupName = $keyVaultIdParts[$keyVaultIdParts.Length - 5]
    Set-AzureRmKeyVaultAccessPolicy -ResourceGroupName $keyVaultResourceGroupName -VaultName $keyVaultName -UserPrincipalName $azureUserPrincipalName -PermissionsToSecrets get
    $secret = Get-AzureKeyVaultSecret -VaultName $keyVaultName -Name $keyVaultSecretName
    $pfxCertObject=New-Object System.Security.Cryptography.X509Certificates.X509Certificate2 -ArgumentList @([Convert]::FromBase64String($secret.SecretValueText),"", [System.Security.Cryptography.X509Certificates.X509KeyStorageFlags]::Exportable)
    $pfxPassword = -join ((65..90) + (97..122) + (48..57) | Get-Random -Count 50 | % {[char]$_})
    $currentDirectory = (Get-Location -PSProvider FileSystem).ProviderPath
    [Environment]::CurrentDirectory = (Get-Location -PSProvider FileSystem).ProviderPath
    [io.file]::WriteAllBytes(".\appservicecertificate.pfx", $pfxCertObject.Export([System.Security.Cryptography.X509Certificates.X509ContentType]::Pkcs12, $pfxPassword))
    Write-Host "Created an App Service Certificate copy at: $currentDirectory\appservicecertificate.pfx"
    Write-Warning "For security reasons, do not store the PFX password. Use it directly from the console as required."
    Write-Host "PFX password: $pfxPassword"
    
    Powershell –ExecutionPolicy Bypass
    .\copyasc.ps1
    

    【讨论】:

      【解决方案3】:

      您可以使用 PowerShell 创建 Azure 应用服务证书的本地 PFX 副本。

      从以下变量中提供适当的值并将脚本保存为copyasc.ps1

      变量:

      $appServiceCertificateName = "ascdemo"
      $resourceGroupName = "ascdemorg"
      $azureLoginEmailId = "user@microsoft.com"
      $subscriptionId = "fb2c25dc-6bab-45c4-8cc9-cece7c42a95a"
      

      copyasc.ps1:

      $appServiceCertificateName = ""
      $resourceGroupName = ""
      $azureLoginEmailId = ""
      $subscriptionId = ""
      
      Login-AzureRmAccount
      Set-AzureRmContext -SubscriptionId $subscriptionId
      
      $ascResource = Get-AzureRmResource -ResourceName $appServiceCertificateName -ResourceGroupName $resourceGroupName -ResourceType "Microsoft.CertificateRegistration/certificateOrders" -ApiVersion "2015-08-01"
      $keyVaultId = ""
      $keyVaultSecretName = ""
      
      $certificateProperties=Get-Member -InputObject $ascResource.Properties.certificates[0] -MemberType NoteProperty
      $certificateName = $certificateProperties[0].Name
      $keyVaultId = $ascResource.Properties.certificates[0].$certificateName.KeyVaultId
      $keyVaultSecretName = $ascResource.Properties.certificates[0].$certificateName.KeyVaultSecretName
      
      $keyVaultIdParts = $keyVaultId.Split("/")
      $keyVaultName = $keyVaultIdParts[$keyVaultIdParts.Length - 1]
      $keyVaultResourceGroupName = $keyVaultIdParts[$keyVaultIdParts.Length - 5]
      Set-AzureRmKeyVaultAccessPolicy -ResourceGroupName $keyVaultResourceGroupName -VaultName $keyVaultName -UserPrincipalName $azureLoginEmailId -PermissionsToSecrets get
      $secret = Get-AzureKeyVaultSecret -VaultName $keyVaultName -Name $keyVaultSecretName
      $pfxCertObject=New-Object System.Security.Cryptography.X509Certificates.X509Certificate2 -ArgumentList @([Convert]::FromBase64String($secret.SecretValueText),"", [System.Security.Cryptography.X509Certificates.X509KeyStorageFlags]::Exportable)
      $pfxPassword = -join ((65..90) + (97..122) + (48..57) | Get-Random -Count 50 | % {[char]$_})
      $currentDirectory = (Get-Location -PSProvider FileSystem).ProviderPath
      [Environment]::CurrentDirectory = (Get-Location -PSProvider FileSystem).ProviderPath
      [io.file]::WriteAllBytes(".\appservicecertificate.pfx", $pfxCertObject.Export([System.Security.Cryptography.X509Certificates.X509ContentType]::Pkcs12, $pfxPassword))
      Write-Host "Created an App Service Certificate copy at: $currentDirectory\appservicecertificate.pfx"
      Write-Warning "For security reasons, do not store the PFX password. Use it directly from the console as required."
      Write-Host "PFX password: $pfxPassword"
      

      在 PowerShell 控制台中键入以下命令以执行脚本:

      Powershell –ExecutionPolicy Bypass
      .\copyasc.ps1
      

      您可以在 Azure 应用服务团队博客Creating a local PFX copy of App Service Certificate 找到更多详细信息

      如果您有想要在 Azure 应用服务生态系统之外使用的应用服务证书,请尝试一下,让我们知道它是如何进行的。如果您遇到任何问题,请在 Stackoverflow 或 Azure App Service forum.

      上告诉我们

      【讨论】:

      • 来吧伙计们,把它变成一键导出。
      • 我需要在本地运行的步骤:1.Set-ExecutionPolicy RemoteSigned,2.Install-Module AzureRM -AllowClobber(虽然不确定-AllowClobber 是否必要),3.Import-Module AzureRM,4.运行 Dimitry 的脚本。希望这对其他人有帮助。完成后,出于安全考虑,考虑改回原来的执行策略
      猜你喜欢
      • 1970-01-01
      • 2017-02-03
      • 1970-01-01
      • 2017-06-03
      • 1970-01-01
      • 2011-04-22
      • 2010-10-07
      • 2022-01-01
      • 1970-01-01
      相关资源
      最近更新 更多