教學課程:建立和上傳用於測試的憑證

您可以使用 X.509 憑證向 IoT 中樞驗證裝置。 針對生產環境,建議您從專業證書服務廠商購買 X.509 CA 憑證。 接著,您可以從連結至所購買 CA 憑證的內部自我管理證書頒發機構單位(CA)發行組織內的憑證,作為完整的公鑰基礎結構 (PKI) 策略的一部分。 如需從專業證書服務廠商取得 X.509 CA 憑證的詳細資訊,請參閱使用 X.509 CA 憑證驗證裝置的 X.509 CA 憑證一節。

不過,建立您自己的自我管理私人 CA,其會使用內部根 CA,因為信任錨點足以用於測試環境。 具有至少一個從屬 CA 鏈結至內部根 CA 的自我管理私人 CA,具有由您次級 CA 簽署之裝置的用戶端憑證,可讓您模擬建議的生產環境。

重要

不建議針對生產環境使用自我簽署憑證。 本教學課程僅供示範之用。

下列教學課程使用 OpenSSLOpenSSL Cookbook 來描述如何完成下列工作:

  • 建立內部跟證書授權單位 (CA) 和根 CA 憑證
  • 建立內部從屬 CA 和次級 CA 憑證,由內部根 CA 憑證簽署
  • 將次級 CA 憑證上傳至 IoT 中樞以供測試之用
  • 使用次級 CA 為您想要使用 IoT 中樞測試的 IoT 裝置建立用戶端憑證

注意

Microsoft 提供 PowerShell 和 Bash 腳本,協助您瞭解如何建立自己的 X.509 憑證,並將其驗證至 IoT 中樞。 腳本隨附於適用於 C 的 Azure IoT 中樞 Device SDK。腳本僅供示範之用。 它們所建立的憑證不得用於生產環境。 憑證包含硬式編碼密碼 (“1234”),並在 30 天后到期。 您必須在生產環境中使用自己的憑證建立和存留期管理最佳做法。 如需詳細資訊,請參閱在適用於 C 的 Azure IoT 中樞 Device SDK 的 GitHub 存放庫中管理範例和教學課程的測試 CA 憑證。

必要條件

  • Azure 訂用帳戶。 如果您沒有 Azure 訂用帳戶,請在開始前建立免費帳戶

  • Azure 訂用帳戶中的 IoT 中樞。 如果您還沒有中樞,您可以遵循建立IoT中樞中的步驟。

  • 最新版的 Git。 請確定 Git 已新增至命令視窗可存取的環境變數。 請參閱 Software Freedom Conservancy 的 Git 用戶端工具 ,以取得要安裝之最新版 git 的工具,其中包括 Git Bash,您可以用來與本機 Git 存放庫互動的命令行應用程式。

  • OpenSSL 安裝。 在 Windows 上,您的 Git 安裝包含 OpenSSL 的安裝。 您可以從 Git Bash 提示字元存取 OpenSSL。 若要確認已安裝 OpenSSL,請開啟 Git Bash 提示字元,然後輸入 openssl version

    注意

    除非您熟悉 OpenSSL,且已在 Windows 電腦上安裝它,否則建議您從 Git Bash 提示字元使用 OpenSSL。 或者,您可以選擇下載原始程式碼並建置 OpenSSL。 若要深入瞭解,請參閱 OpenSSL 下載 頁面。 或者,您可以從第三方預先建置 OpenSSL。 若要深入瞭解,請參閱 OpenSSL Wiki。 Microsoft 不保證從第三方下載之套件的有效性。 如果您選擇建置或下載 OpenSSL,請確定您的路徑可存取 OpenSSL 二進位檔,且OPENSSL_CNF環境變數設定為 openssl.cnf 檔案的路徑

建立根 CA

您必須先建立內部跟證書授權單位 (CA) 和自我簽署的根 CA 憑證,才能作為信任錨點,您可以從中建立其他憑證進行測試。 用來建立和維護內部根 CA 的檔案會儲存在資料夾結構中,並初始化為此程式的一部分。 請執行下列步驟,以:

  • 建立並初始化根 CA 所使用的資料夾和檔案
  • 建立 OpenSSL 所使用的組態檔,以設定以根 CA 建立的根 CA 和憑證
  • 要求並建立自我簽署的 CA 憑證,做為您的根 CA 憑證
  1. 啟動 Git Bash 視窗並執行下列命令,並將 取代 {base_dir} 為在本教學課程中建立憑證所需的目錄。

    cd {base_dir}
    
  2. 在 Git Bash 視窗中,一次執行下列命令。 此步驟會建立下列目錄結構,並支援根 CA 的檔案。

    目錄或檔案 描述
    rootca 根 CA 的根目錄。
    rootca/certs 建立和儲存根 CA CA 之 CA 憑證的目錄。
    rootca/db 用來儲存根 CA 之憑證資料庫和支援檔案的目錄。
    rootca/db/index 根 CA 的憑證資料庫。 touch命令會建立不含任何內容的檔案,以供稍後使用。 憑證資料庫是由 OpenSSL 管理的純文本檔案,其中包含已發行憑證的相關信息。 如需憑證資料庫的詳細資訊,請參閱 openssl-ca 手冊頁面。
    rootca/db/serial 用來儲存要針對根 CA 建立之下一個憑證序號的檔案。 openssl命令會以十六進位格式建立16位元組的隨機數,然後將它儲存在此檔案中,以初始化檔案以建立根 CA 憑證。
    rootca/db/crlnumber 檔案,用來儲存根 CA 所簽發之已撤銷憑證的序號。 命令會將 echo 範例序號 1001 管線傳送至 檔案。
    rootca/private 儲存根 CA 的私人檔案,包括私鑰的目錄。
    此目錄中的檔案必須受到保護及保護。
    mkdir rootca
    cd rootca
    mkdir certs db private
    chmod 700 private
    touch db/index
    openssl rand -hex 16 > db/serial
    echo 1001 > db/crlnumber
    
  3. 在上一個步驟中建立的目錄中,建立名為 rootca.confrootca 文本檔。 在文本編輯器中開啟該檔案,然後將下列 OpenSSL 組態設定複製並儲存到該檔案中。

    檔案會提供 OpenSSL,其中包含設定測試根 CA 所需的值。 在此範例中,檔案會使用先前步驟中建立的目錄和檔案,設定名為 rootca 的根 CA。 檔案也提供下列設定的組態設定:

    • 根 CA 用於憑證辨別名稱 (DN) 欄位的 CA 原則
    • 根 CA 所建立的憑證要求
    • X.509 延伸模組套用至根 CA 憑證、次級 CA 憑證,以及根 CA 所簽發的客戶端憑證

    注意

    home 段中的 屬性 ca_default 會設定為 ../rootca ,因為建立次級 CA 的憑證時也會使用此組態檔。 指定的相對路徑可讓 OpenSSL 在該程式期間,從您的次級 CA 資料夾巡覽至根 CA 資料夾。

    如需 OpenSSL 組態檔語法的詳細資訊,請參閱 OpenSSL 檔中的設定 手冊頁面。

    [default]
    name                     = rootca
    domain_suffix            = exampledomain.com
    aia_url                  = http://$name.$domain_suffix/$name.crt
    crl_url                  = http://$name.$domain_suffix/$name.crl
    default_ca               = ca_default
    name_opt                 = utf8,esc_ctrl,multiline,lname,align
    
    [ca_dn]
    commonName               = "rootca_common_name"
    
    [ca_default]
    home                     = ../rootca
    database                 = $home/db/index
    serial                   = $home/db/serial
    crlnumber                = $home/db/crlnumber
    certificate              = $home/$name.crt
    private_key              = $home/private/$name.key
    RANDFILE                 = $home/private/random
    new_certs_dir            = $home/certs
    unique_subject           = no
    copy_extensions          = none
    default_days             = 3650
    default_crl_days         = 365
    default_md               = sha256
    policy                   = policy_c_o_match
    
    [policy_c_o_match]
    countryName              = optional
    stateOrProvinceName      = optional
    organizationName         = optional
    organizationalUnitName   = optional
    commonName               = supplied
    emailAddress             = optional
    
    [req]
    default_bits             = 2048
    encrypt_key              = yes
    default_md               = sha256
    utf8                     = yes
    string_mask              = utf8only
    prompt                   = no
    distinguished_name       = ca_dn
    req_extensions           = ca_ext
    
    [ca_ext]
    basicConstraints         = critical,CA:true
    keyUsage                 = critical,keyCertSign,cRLSign
    subjectKeyIdentifier     = hash
    
    [sub_ca_ext]
    authorityKeyIdentifier   = keyid:always
    basicConstraints         = critical,CA:true,pathlen:0
    extendedKeyUsage         = clientAuth,serverAuth
    keyUsage                 = critical,keyCertSign,cRLSign
    subjectKeyIdentifier     = hash
    
    [client_ext]
    authorityKeyIdentifier   = keyid:always
    basicConstraints         = critical,CA:false
    extendedKeyUsage         = clientAuth
    keyUsage                 = critical,digitalSignature
    subjectKeyIdentifier     = hash
    
  4. 在 [Git Bash] 視窗中,執行下列命令,以在目錄中產生憑證簽署要求 (CSR), rootca 並在目錄中產生私鑰 rootca/private 。 如需 OpenSSL req 命令的詳細資訊,請參閱 OpenSSL 檔中的 openssl-req 手動頁面。

    注意

    雖然此根 CA 僅供測試之用,而且不會公開為公鑰基礎結構 (PKI) 的一部分,但建議您不要複製或共用私鑰。

    winpty openssl req -new -config rootca.conf -out rootca.csr -keyout private/rootca.key
    

    系統會提示您輸入 PEM 傳遞片語,如下列範例所示的私鑰檔案。 輸入並確認傳遞片語,以產生您的私鑰和 CSR。

    Enter PEM pass phrase:
    Verifying - Enter PEM pass phrase:
    -----
    

    確認 CSR 檔案 rootca.csr存在於 rootca 目錄中,而私鑰檔案 rootca.key在繼續之前,會存在於 private 子目錄中。

  5. 在 Git Bash 視窗中,執行下列命令來建立自我簽署的根 CA 憑證。 命令會將 ca_ext 組態檔延伸模組套用至憑證。 這些延伸模組表示憑證適用於根 CA,而且可用來簽署憑證和證書吊銷清單 (CRL)。 如需 OpenSSL ca 命令的詳細資訊,請參閱 OpenSSL 檔中的 openssl-ca 手動頁面。

    winpty openssl ca -selfsign -config rootca.conf -in rootca.csr -out rootca.crt -extensions ca_ext
    

    系統會提示您提供 PEM 傳遞片語,如下列範例所示的私鑰檔案。 提供傳遞片語之後,OpenSSL 會產生憑證,然後提示您簽署並認可根 CA 的憑證。 針對這兩個提示指定 y ,以產生根 CA 的自我簽署憑證。

    Using configuration from rootca.conf
    Enter pass phrase for ../rootca/private/rootca.key:
    Check that the request matches the signature
    Signature ok
    Certificate Details:
        {Details omitted from output for clarity}
    Certificate is to be certified until Mar 24 18:51:41 2033 GMT (3650 days)
    Sign the certificate? [y/n]:
    
    
    1 out of 1 certificate requests certified, commit? [y/n]
    Write out database with 1 new entries
    Data Base Updated
    

    在OpenSSL更新憑證資料庫之後,請確認憑證檔案 rootca.crt、存在於 rootca 目錄中,以及憑證的 rootca/certs PEM 憑證 (.pem) 檔案都存在於 目錄中。 .pem 檔案的檔名符合根 CA 憑證的序號。

建立次級 CA

建立內部根 CA 之後,您應該建立次級 CA,以作為 中繼 CA ,用來簽署裝置的客戶端憑證。 理論上,您不需要建立次級 CA;您可以將根 CA 憑證上傳至 IoT 中樞,並直接從您的根 CA 簽署客戶端憑證。 不過,使用從屬 CA 作為中繼 CA 來簽署用戶端憑證,更仔細地模擬建議的生產環境,其中您的根 CA 會保持離線狀態。 您也可以使用次級 CA 簽署另一個次級 CA,接著可以簽署另一個次級 CA 等等。 使用次級 CA 簽署其他次級 CA 會建立中繼 CA 階層,做為信任憑證鏈結的一 部分。 在生產環境中,信任的憑證鏈結允許委派信任來簽署裝置。 如需將裝置簽署至信任憑證鏈結的詳細資訊,請參閱 使用 X.509 CA 憑證驗證裝置。

與根 CA 類似,用來建立和維護次級 CA 的檔案會儲存在資料夾結構中,並初始化為此程式的一部分。 請執行下列步驟,以:

  • 建立和初始化次級 CA 所使用的資料夾和檔案
  • 建立 OpenSSL 所使用的組態檔,以設定您的次級 CA 和使用您的次級 CA 建立的憑證
  • 要求並建立由根 CA 簽署的 CA 憑證,做為您的次級 CA 憑證
  1. 返回包含目錄的 rootca 基底目錄。 在此範例中,根 CA 和次級 CA 都位於相同的基底目錄中。

    cd ..
    
  2. 在 Git Bash 視窗中,一次執行下列命令。

    此步驟會建立目錄結構,並支援次級 CA 的檔案,類似於上一節中針對根 CA 建立的資料夾結構和檔案。

    mkdir subca
    cd subca
    mkdir certs db private
    chmod 700 private
    touch db/index
    openssl rand -hex 16 > db/serial
    echo 1001 > db/crlnumber
    
  3. 在上一個步驟中建立的目錄中,建立名為 subca.confsubca 文本檔。 在文本編輯器中開啟該檔案,然後將下列 OpenSSL 組態設定複製並儲存到該檔案中。

    如同測試根 CA 的組態檔,此檔案會提供 OpenSSL,並提供設定測試次級 CA 所需的值。 您可以建立多個次級 CA,以管理測試案例或環境。

    如需 OpenSSL 組態檔語法的詳細資訊,請參閱 OpenSSL 檔中的設定 主版手冊頁面。

    [default]
    name                     = subca
    domain_suffix            = exampledomain.com
    aia_url                  = http://$name.$domain_suffix/$name.crt
    crl_url                  = http://$name.$domain_suffix/$name.crl
    default_ca               = ca_default
    name_opt                 = utf8,esc_ctrl,multiline,lname,align
    
    [ca_dn]
    commonName               = "subca_common_name"
    
    [ca_default]
    home                     = ../subca
    database                 = $home/db/index
    serial                   = $home/db/serial
    crlnumber                = $home/db/crlnumber
    certificate              = $home/$name.crt
    private_key              = $home/private/$name.key
    RANDFILE                 = $home/private/random
    new_certs_dir            = $home/certs
    unique_subject           = no
    copy_extensions          = copy
    default_days             = 365
    default_crl_days         = 90
    default_md               = sha256
    policy                   = policy_c_o_match
    
    [policy_c_o_match]
    countryName              = optional
    stateOrProvinceName      = optional
    organizationName         = optional
    organizationalUnitName   = optional
    commonName               = supplied
    emailAddress             = optional
    
    [req]
    default_bits             = 2048
    encrypt_key              = yes
    default_md               = sha256
    utf8                     = yes
    string_mask              = utf8only
    prompt                   = no
    distinguished_name       = ca_dn
    req_extensions           = ca_ext
    
    [ca_ext]
    basicConstraints         = critical,CA:true
    keyUsage                 = critical,keyCertSign,cRLSign
    subjectKeyIdentifier     = hash
    
    [sub_ca_ext]
    authorityKeyIdentifier   = keyid:always
    basicConstraints         = critical,CA:true,pathlen:0
    extendedKeyUsage         = clientAuth,serverAuth
    keyUsage                 = critical,keyCertSign,cRLSign
    subjectKeyIdentifier     = hash
    
    [client_ext]
    authorityKeyIdentifier   = keyid:always
    basicConstraints         = critical,CA:false
    extendedKeyUsage         = clientAuth
    keyUsage                 = critical,digitalSignature
    subjectKeyIdentifier     = hash
    
  4. 在 [Git Bash] 視窗中,執行下列命令,以在次級 CA 目錄中產生私鑰和憑證簽署要求 (CSR)。

    winpty openssl req -new -config subca.conf -out subca.csr -keyout private/subca.key
    

    系統會提示您輸入 PEM 傳遞片語,如下列範例所示的私鑰檔案。 輸入並驗證傳遞片語,以產生您的私鑰和 CSR。

    Enter PEM pass phrase:
    Verifying - Enter PEM pass phrase:
    -----
    

    確認 CSR 檔案 subca.csr 存在於次級 CA 目錄中,且私鑰檔案 subca.key 存在於 private 子目錄中,然後再繼續。

  5. 在 [Git Bash] 視窗中,執行下列命令,在次級 CA 目錄中建立次級 CA 憑證。 命令會將 sub_ca_ext 組態檔延伸模組套用至憑證。 這些延伸模組表示憑證適用於次級 CA,也可用來簽署憑證和證書吊銷清單(CRL)。 不同於根 CA 憑證,此憑證不會自我簽署。 相反地,次級 CA 憑證會使用根 CA 憑證簽署,並建立類似於您用於公鑰基礎結構 (PKI) 的憑證鏈結。 接著會使用次級 CA 憑證來簽署客戶端憑證,以測試您的裝置。

    winpty openssl ca -config ../rootca/rootca.conf -in subca.csr -out subca.crt -extensions sub_ca_ext
    

    系統會提示您輸入傳遞片語,如下列範例所示,以取得根 CA 的私鑰檔案。 輸入傳遞片語之後,OpenSSL 會產生並顯示憑證的詳細數據,然後提示您簽署並認可次級 CA 的憑證。 針對 y 這兩個提示指定 ,以產生您次級 CA 的憑證。

    Using configuration from rootca.conf
    Enter pass phrase for ../rootca/private/rootca.key:
    Check that the request matches the signature
    Signature ok
    Certificate Details:
        {Details omitted from output for clarity}
    Certificate is to be certified until Mar 24 18:55:00 2024 GMT (365 days)
    Sign the certificate? [y/n]:
    
    
    1 out of 1 certificate requests certified, commit? [y/n]
    Write out database with 1 new entries
    Data Base Updated
    

    在 OpenSSL 更新憑證資料庫之後,請確認憑證檔案 subca.crt 存在於次級 CA 目錄中,且憑證的 PEM 憑證 (.pem) 檔案存在於 rootca/certs 目錄中。 .pem 檔案的檔名符合次級 CA 憑證的序號。

將次級 CA 憑證註冊到 IoT 中樞

將次級 CA 憑證註冊到 IoT 中樞,以在註冊和連線期間使用它來驗證您的裝置。 下列步驟說明如何將從屬 CA 憑證上傳並自動驗證至 IoT 中樞。

  1. Azure 入口網站 中,流覽至 IoT 中樞,然後從資源功能表中選取 [安全性設定] 下的 [憑證]。

  2. 從命令行選取 [新增] 以新增 CA 憑證。

  3. 在 [憑證名稱] 字段中輸入次級 CA 憑證的 顯示名稱

  4. rootca/certs 目錄選取您次級 CA 憑證的 PEM 憑證 (.pem) 檔案,以在 [憑證 .pem] 或 [.cer檔案 ] 字段中新增。

  5. 核取 [將憑證狀態設定為上傳時已驗證] 旁的方塊。

    顯示如何在上傳時自動驗證憑證狀態的螢幕快照。

  6. 選取 [儲存]。

上傳的次級 CA 憑證會顯示其狀態設定為 [已驗證 ] 工作窗格的 [ 憑證 ] 索引標籤。

建立裝置的客戶端憑證

建立次級 CA 之後,您可以為裝置建立客戶端憑證。 為次級 CA 建立的檔案和資料夾可用來儲存客戶端憑證的 CSR、私鑰和憑證檔案。

用戶端憑證必須將其 [主體通用名稱] 字段的值設定為在 Azure IoT 中樞 中註冊對應裝置時所使用的裝置標識符值。

請執行下列步驟,以:

  • 建立客戶端憑證的私鑰和憑證簽署要求 (CSR)
  • 建立由次級 CA 憑證簽署的客戶端憑證
  1. 在 Git Bash 視窗中,確定您仍在 subca 目錄中。

  2. 在 Git Bash 視窗中,一次執行下列命令。 以 IoT 裝置的名稱取代佔位元,例如 testdevice。 此步驟會為您的用戶端憑證建立私鑰和 CSR。

    此步驟會為您的用戶端憑證建立 2048 位 RSA 私鑰,然後使用該私鑰產生憑證簽署要求 (CSR)。

    winpty openssl genpkey -out private/<DEVICE_NAME>.key -algorithm RSA -pkeyopt rsa_keygen_bits:2048
    winpty openssl req -new -key private/<DEVICE_NAME>.key -out <DEVICE_NAME>.csr
    
  3. 出現提示時,請提供憑證詳細數據,如下列範例所示。

    您唯一必須提供特定值的提示是 Common Name,這 必須是 上一個步驟中提供的相同裝置名稱。 您可以略過或提供其餘提示的任意值。

    提供憑證詳細數據之後,OpenSSL 會產生並顯示憑證的詳細數據,然後提示您簽署並認可次級 CA 的憑證。 針對這兩個提示指定 y ,以產生您次級 CA 的憑證。

    -----
    Country Name (2 letter code) [XX]:.
    State or Province Name (full name) []:.
    Locality Name (eg, city) [Default City]:.
    Organization Name (eg, company) [Default Company Ltd]:.
    Organizational Unit Name (eg, section) []:
    Common Name (eg, your name or your server hostname) []:'<DEVICE_NAME>'
    Email Address []:
    
    Please enter the following 'extra' attributes
    to be sent with your certificate request
    A challenge password []:
    An optional company name []:
    
    

    確認 CSR 檔案存在於次級 CA 目錄中,且私鑰檔案存在於 private 子目錄中,然後再繼續。 如需 CSR 和私鑰檔案格式的詳細資訊,請參閱 X.509 憑證

  4. 在 Git Bash 視窗中,執行下列命令,以您在先前步驟中使用的相同名稱取代裝置名稱佔位元。

    此步驟會在次級 CA 目錄中建立客戶端憑證。 命令會將 client_ext 組態檔延伸模組套用至憑證。 這些延伸模組表示憑證適用於客戶端憑證,無法當做 CA 憑證使用。 用戶端憑證會使用次級 CA 憑證簽署。

    winpty openssl ca -config subca.conf -in <DEVICE_NAME>.csr -out <DEVICE_NAME>.crt -extensions client_ext
    

    系統會提示您輸入傳遞片語,如下列範例所示,代表您次級 CA 的私鑰檔案。 輸入傳遞片語之後,OpenSSL 會產生並顯示憑證的詳細數據,然後提示您簽署並認可裝置的客戶端憑證。 針對這兩個提示指定 y 來產生客戶端憑證。

    Using configuration from subca.conf
    Enter pass phrase for ../subca/private/subca.key:
    Check that the request matches the signature
    Signature ok
    Certificate Details:
        {Details omitted from output for clarity}
    Certificate is to be certified until Mar 24 18:51:41 2024 GMT (365 days)
    Sign the certificate? [y/n]:
    
    
    1 out of 1 certificate requests certified, commit? [y/n]
    Write out database with 1 new entries
    Data Base Updated
    

    在OpenSSL更新憑證資料庫之後,請確認客戶端憑證的憑證檔案存在於次級 CA 目錄中,且客戶端憑證的 PEM 憑證 (.pem) 檔案存在於 從屬 CA 目錄的憑證 子目錄中。 .pem 檔案的檔名符合客戶端憑證的序號。

下一步

您可以向IoT中樞註冊裝置,以測試您為該裝置建立的客戶端憑證。 如需註冊裝置的詳細資訊,請參閱使用 Azure 入口網站 建立IoT中樞中的IoT中樞一節中的註冊新裝置。

如果您有多個要測試的相關裝置,您可以使用 Azure IoT 中樞 裝置布建服務在註冊群組中布建多個裝置。 如需在裝置布建服務中使用註冊群組的詳細資訊,請參閱 教學課程:使用註冊群組布建多個 X.509 裝置。

如需憑證檔案格式的詳細資訊,請參閱 X.509 憑證