【Azure 雲服務】為Azure雲服務設定上自簽名的SSL證書步驟

2022-12-27 18:03:00

問題描述

在使用Azure Cloud Service(雲服務),預設的情況下都是使用的 HTTP 服務,通過 Visual Studio 2022 建立的預設 Cloud Service專案中,在ServiceDefinition.csdef 服務定義檔案中,值預設開啟了HTTP 80的Endpoint。

<InputEndpoint name="Endpoint1" protocol="http" port="80" />

而如果要讓雲服務使用HTTPS,需要那些操作步驟呢? 在官網中,有兩部分檔案對此有所介紹:

第一部分:雲服務證介紹和生成自簽名證書 https://docs.azure.cn/zh-cn/cloud-services/cloud-services-certs-create

$cert = New-SelfSignedCertificate -DnsName yourdomain.chinacloudapp.cn -CertStoreLocation "cert:\LocalMachine\My" -KeyLength 2048 -KeySpec "KeyExchange"
$password = ConvertTo-SecureString -String "your-password" -Force -AsPlainText
Export-PfxCertificate -Cert $cert -FilePath ".\my-cert-file.pfx" -Password $password

第二部分:為雲服務 設定TLS https://docs.azure.cn/zh-cn/cloud-services/cloud-services-configure-ssl-certificate-portal

參照以上兩部分內容,就可以實現為雲服務設定自簽名證書。雖然通過瀏覽器存取時,還是會提示自簽名證書不受信任,但在實驗階段已完全可用!

最終結果如下:

 

實現步驟

第一步: 通過Windows 機器使用Powershell指令碼生成 以雲服務域名為主題的自簽名證書 (注意:需要以管理員許可權執行PowerShell)

注意:如果沒有使用管理員許可權執行 New-SelfSignedCertificate 命令,則會出現許可權不夠的提示資訊「New-SelfSignedCertificate : CertEnroll::CX509Enrollment::_CreateRequest: Access is denied. 0x80070005 (WIN32: 5 ERROR_ACCESS_DENIED)」

證書生成完畢後,進入C:\WINDOWS\system32 目錄,找到 my-cert-file.pfx 檔案,雙擊,安裝此證書到本機。最後,通過 Certmgr 證書管理工具檢視證書的指紋資訊(thumbprint)

 

第二步:修改雲服務組態檔,新增 Certificates , Endpoints 以及 Site Binding

參考「為Azure雲服務設定SSL」文章中的第二部分,修改服務定義和組態檔。可以完全參考檔案中的步驟2操作,本試驗中,因為使用的是自簽名證書,所以就沒有有設定CA root部分。

一:修改 ServiceDefinition.csdef 檔案中的 Certificates, InputEndpoint 和 Site Binding

<?xml version="1.0" encoding="utf-8"?>
<ServiceDefinition name="AzureCloudService1" xmlns="http://schemas.microsoft.com/ServiceHosting/2008/10/ServiceDefinition" schemaVersion="2015-04.2.6">
    <WebRole name="WebRole2" vmsize="Standard_D1_v2">
        <Sites>
            <Site name="Web">
                <Bindings>
                    <Binding name="Endpoint1" endpointName="Endpoint1" />
                    <Binding name="HttpsIn" endpointName="HttpsIn" />
                </Bindings>
            </Site>
        </Sites>
        <ConfigurationSettings>
            <Setting name="Microsoft.WindowsAzure.Plugins.Diagnostics.ConnectionString"/>
        </ConfigurationSettings>
        <Endpoints>
            <InputEndpoint name="Endpoint1" protocol="http" port="80" />
            <InputEndpoint name="HttpsIn" protocol="https" port="443"
             certificate="SampleCertificate" />
        </Endpoints>
        <Imports>
            <Import moduleName="RemoteAccess" />
            <Import moduleName="RemoteForwarder" />
        </Imports>
        <Certificates>
            <Certificate name="SampleCertificate"
                        storeLocation="LocalMachine"
                        storeName="My"
                        permissionLevel="limitedOrElevated" />
            <!-- IMPORTANT! Unless your certificate is either
        self-signed or signed directly by the CA root, you
        must include all the intermediate certificates
        here. You must list them here, even if they are
        not bound to any endpoints. Failing to list any of
        the intermediate certificates may cause hard-to-reproduce
        interoperability problems on some clients.-->
            <!--<Certificate name="CAForSampleCertificate"
                        storeLocation="LocalMachine"
                        storeName="CA"
                        permissionLevel="limitedOrElevated" />-->
        </Certificates>
    </WebRole>
</ServiceDefinition>
  1. 在 Sites 節中新增 Binding 元素。 此元素新增 HTTPS 繫結以將終結點對映到站點
  2. 在「Endpoints」部分中新增 InputEndpoint 元素以啟用 HTTPS
  3. Certificates 節定義了證書的名稱、位置及其所在儲存的名稱

二:在服務組態檔 (CSCFG) ServiceConfiguration.Cloud.cscfg 中,新增 Certificates 值併為其指定證書的指紋(thumbprint)

<?xml version="1.0" encoding="utf-8"?>
<ServiceConfiguration serviceName="AzureCloudService1" xmlns="http://schemas.microsoft.com/ServiceHosting/2008/10/ServiceConfiguration" osFamily="6" osVersion="*" schemaVersion="2015-04.2.6">
    <Role name="WebRole2">
        <Instances count="1" />
    
    ... ...
    
        <Certificates>
            <Certificate name="Microsoft.WindowsAzure.Plugins.RemoteAccess.PasswordEncryption" thumbprint="B8E0XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXD6D8" thumbprintAlgorithm="sha1" />
            <Certificate name="SampleCertificate"
              thumbprint="deb8bff5ced1e43e0723cdf9857b6a6ca1d793b2"
              thumbprintAlgorithm="sha1" />
        </Certificates>
    </Role>
</ServiceConfiguration>

在雲服務專案檔案中修改的動圖說明如下:

 

第三步:上傳第一步生成的 my-cert-file.pfx證書到 雲服務的 Certificates 頁面

 

在門戶中,上傳服務證書。 這一步需要在部署之前操作,否則會出現部署失敗。失敗原因為:The certificate with thumbprint deb8bff5ced1e43e0723cdf9857b6a6ca1d793b2 was not found.'

 

第四步:重新部署雲服務, 然後使用https存取,而不是http

 如果使用自簽名證書,瀏覽到與自簽名證書關聯的 HTTPS 終結點時,瀏覽器中可能會顯示一個證書錯誤。 使用由受信任證書頒發機構簽名的證書可消除此問題;同時,你可以忽略此錯誤。 (也可以將自簽名證書新增到使用者的受信任證書頒發機構證書儲存中。)

 

參考資料

雲服務證介紹和生成自簽名證書 : https://docs.azure.cn/zh-cn/cloud-services/cloud-services-certs-create

為雲服務 設定TLS : https://docs.azure.cn/zh-cn/cloud-services/cloud-services-configure-ssl-certificate-portal