天天看點

在 Azure 中的 Windows 虛拟機上使用 SSL 證書保護 IIS Web 伺服器

若要保護 Web 伺服器,可以使用安全套接字層 (SSL) 證書來加密 Web 流量。 這些 SSL 證書可存儲在 Azure Key Vault 中,并可安全部署到 Azure 中的 Windows 虛拟機 (VM)。 本教程介紹如何執行下列操作:

  • 建立 Azure Key Vault
  • 生成證書或将其上傳到 Key Vault
  • 建立 VM 并安裝 IIS Web 伺服器
  • 将證書注入 VM 并使用 SSL 綁定配置 IIS

本教程需要 Azure PowerShell 子產品 3.6 或更高版本。 運作 

Get-Module -ListAvailable AzureRM

 即可查找版本。 如果需要進行更新,請參閱 Install Azure PowerShell module(安裝 Azure PowerShell 子產品)。

概述

Azure Key Vault 保護加密密鑰和機密、此類證書或密碼。 Key Vault 有助于簡化證書管理過程,讓我們持續掌控用于通路這些證書的密鑰。 可以在 Key Vault 中建立自簽名證書,或者上傳已擁有的現有受信任證書。

無需使用包含植入證書的自定義 VM 映像,而可将證書直接注入正在運作的 VM。 此過程可確定在部署過程中,在 Web 伺服器上安裝最新的證書。 如果續訂或替換了證書,也不需要建立新的自定義 VM 映像。 建立附加的 VM 時,會自動注入最新證書。 在整個過程中,證書永遠不會離開 Azure 平台,也不會在腳本、指令行曆史記錄或模闆中公開。

建立 Azure Key Vault

建立 Key Vault 和證書之前,需使用 New-AzureRmResourceGroup 建立資源組。 以下示例在“中國北部”位置建立名為 myResourceGroupSecureWeb 的資源組。

PowerShell 複制

$resourceGroup = "myResourceGroupSecureWeb"
$location = "China North"
New-AzureRmResourceGroup -ResourceGroupName $resourceGroup -Location $location
           

接下來,使用 New-AzureRmKeyVault 建立 Key Vault。 每個 Key Vault 均需具備唯一名稱且全部小寫。 将下例中的 

<mykeyvault>

 替換為自己唯一的 Key Vault 名稱:

PowerShell 複制

$keyvaultName="<mykeyvault>"
New-AzureRmKeyVault -VaultName $keyvaultName `
    -ResourceGroup $resourceGroup `
    -Location $location `
    -EnabledForDeployment
           

生成證書并存儲在 Key Vault 中

針對生産用途,應使用 Import-AzureKeyVaultCertificate 導入由受信任提供程式簽名的有效證書。 在本教程中,以下示例示範了如何使用 Add-AzureKeyVaultCertificate 生成一個自簽名證書,該證書使用 New-AzureKeyVaultCertificatePolicy 指定的預設證書政策:

PowerShell 複制

$policy = New-AzureKeyVaultCertificatePolicy `
    -SubjectName "CN=www.contoso.com" `
    -SecretContentType "application/x-pkcs12" `
    -IssuerName Self `
    -ValidityInMonths 

Add-AzureKeyVaultCertificate `
    -VaultName $keyvaultName `
    -Name "mycert" `
    -CertificatePolicy $policy 
           

建立虛拟機

使用 Get-Credential 設定 VM 的管理者使用者名和密碼:

PowerShell 複制

現在,可使用 New-AzureRmVM 建立 VM。 以下示例建立所需的虛拟網絡元件、OS 配置,然後建立名為“myVM”的 VM:

PowerShell 複制

# Create a subnet configuration
$subnetConfig = New-AzureRmVirtualNetworkSubnetConfig `
    -Name mySubnet `
    -AddressPrefix ./

# Create a virtual network
$vnet = New-AzureRmVirtualNetwork `
    -ResourceGroupName $resourceGroup `
    -Location $location `
    -Name "myVnet" `
    -AddressPrefix ./ `
    -Subnet $subnetConfig

# Create a public IP address and specify a DNS name
$publicIP = New-AzureRmPublicIpAddress `
    -ResourceGroupName $resourceGroup `
    -Location $location `
    -AllocationMethod Static `
    -IdleTimeoutInMinutes  `
    -Name "myPublicIP"

# Create an inbound network security group rule for port 3389
$nsgRuleRDP = New-AzureRmNetworkSecurityRuleConfig `
    -Name "myNetworkSecurityGroupRuleRDP"  `
    -Protocol "Tcp" `
    -Direction "Inbound" `
    -Priority  `
    -SourceAddressPrefix * `
    -SourcePortRange * `
    -DestinationAddressPrefix * `
    -DestinationPortRange  `
    -Access Allow

# Create an inbound network security group rule for port 443
$nsgRuleWeb = New-AzureRmNetworkSecurityRuleConfig `
    -Name "myNetworkSecurityGroupRuleWWW"  `
    -Protocol "Tcp" `
    -Direction "Inbound" `
    -Priority  `
    -SourceAddressPrefix * `
    -SourcePortRange * `
    -DestinationAddressPrefix * `
    -DestinationPortRange  `
    -Access Allow

# Create a network security group
$nsg = New-AzureRmNetworkSecurityGroup `
    -ResourceGroupName $resourceGroup `
    -Location $location `
    -Name "myNetworkSecurityGroup" `
    -SecurityRules $nsgRuleRDP,$nsgRuleWeb

# Create a virtual network card and associate with public IP address and NSG
$nic = New-AzureRmNetworkInterface `
    -Name "myNic" `
    -ResourceGroupName $resourceGroup `
    -Location $location `
    -SubnetId $vnet.Subnets[].Id `
    -PublicIpAddressId $publicIP.Id `
    -NetworkSecurityGroupId $nsg.Id

# Create a virtual machine configuration
$vmConfig = New-AzureRmVMConfig -VMName "myVM" -VMSize "Standard_DS2" | `
Set-AzureRmVMOperatingSystem -Windows -ComputerName "myVM" -Credential $cred | `
Set-AzureRmVMSourceImage -PublisherName "MicrosoftWindowsServer" `
    -Offer "WindowsServer" -Skus "2016-Datacenter" -Version "latest" | `
Add-AzureRmVMNetworkInterface -Id $nic.Id

# Create virtual machine
New-AzureRmVM -ResourceGroupName $resourceGroup -Location $location -VM $vmConfig

# Use the Custom Script Extension to install IIS
Set-AzureRmVMExtension -ResourceGroupName $resourceGroup `
    -ExtensionName "IIS" `
    -VMName "myVM" `
    -Location $location `
    -Publisher "Microsoft.Compute" `
    -ExtensionType "CustomScriptExtension" `
    -TypeHandlerVersion  `
    -SettingString '{"commandToExecute":"powershell Add-WindowsFeature Web-Server -IncludeManagementTools"}'
           

建立 VM 需要幾分鐘時間。 最後一個步驟通過 Set-AzureRmVmExtension 使用 Azure 自定義腳本擴充來安裝 IIS Web 伺服器。

将 Key Vault 中的證書添加到 VM

若要将 Key Vault 中的證書添加到 VM,請使用 Get-AzureKeyVaultSecret 獲驗證書的 ID。 使用 Add-AzureRmVMSecret 将證書添加到 VM:

PowerShell 複制

$certURL=(Get-AzureKeyVaultSecret -VaultName $keyvaultName -Name "mycert").id

$vm=Get-AzureRMVM -ResourceGroupName $resourceGroup -Name "myVM"
$vaultId=(Get-AzureRmKeyVault -ResourceGroupName $resourceGroup -VaultName $keyVaultName).ResourceId
$vm = Add-AzureRmVMSecret -VM $vm -SourceVaultId $vaultId -CertificateStore "My" -CertificateUrl $certURL

Update-AzureRmVM -ResourceGroupName $resourceGroup -VM $vm
           

将 IIS 配置為使用該證書

再次通過 Set-AzureRmVMExtension 使用自定義腳本擴充來更新 IIS 配置。 此項更新會應用從 Key Vault 注入 IIS 的證書,并配置 Web 綁定:

PowerShell 複制

$PublicSettings = '{
    "fileUris":["https://raw.githubusercontent.com/iainfoulds/azure-samples/master/secure-iis.ps1"],
    "commandToExecute":"powershell -ExecutionPolicy Unrestricted -File secure-iis.ps1"
}'

Set-AzureRmVMExtension -ResourceGroupName $resourceGroup `
    -ExtensionName "IIS" `
    -VMName "myVM" `
    -Location $location `
    -Publisher "Microsoft.Compute" `
    -ExtensionType "CustomScriptExtension" `
    -TypeHandlerVersion  `
    -SettingString $publicSettings
           

測試 Web 應用是否安全

使用 Get-AzureRmPublicIPAddress 擷取 VM 的公共 IP 位址。 以下示例擷取前面建立的 

myPublicIP

 的 IP 位址:

PowerShell 複制

現可打開 Web 浏覽器,并在位址欄中輸入 

https://<myPublicIP>

。 若要接受有關使用自簽名證書的安全警告,請依次選擇“詳細資訊”和“繼續轉到網頁”:

在 Azure 中的 Windows 虛拟機上使用 SSL 證書保護 IIS Web 伺服器

随即顯示受保護的 IIS 網站,如下例所示:

在 Azure 中的 Windows 虛拟機上使用 SSL 證書保護 IIS Web 伺服器

後續步驟

本教程已介紹如何使用 Azure Key Vault 中存儲的 SSL 證書保護 IIS Web 伺服器。 你已了解如何:

  • 建立 Azure Key Vault
  • 生成證書或将其上傳到 Key Vault
  • 建立 VM 并安裝 IIS Web 伺服器
  • 将證書注入 VM 并使用 SSL 綁定配置 IIS

請通路以下連結,檢視預先生成的虛拟機腳本示例。

Windows 虛拟機腳本示例 立即通路http://market.azure.cn

繼續閱讀