分享方式:


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

您可以使用 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 中樞裝置 SDK (英文)。指令碼僅供示範之用。 所建立的憑證不得用於生產環境。 憑證包含硬式程式碼密碼 (「1234」) ,並會在 30 天後到期。 您必須在實際執行環境中,使用自己的最佳做法來進行憑證建立和存留期管理。 如需詳細資訊,請參閱在適用於 C 的 Azure IoT 中樞裝置 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 憑證的目錄。
    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 目錄中,建立名為 rootca.conf 的文字檔。 在文字本編輯器中開啟該檔案,然後將下列 OpenSSL 組態設定複製並儲存到該檔案中。

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

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

    注意

    ca_default 區段中的 home 屬性會設定為 ../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] 視窗中,執行下列命令,在 rootca 目錄中產生憑證簽署要求 (CSR),並在 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 目錄中,且憑證的 PEM 憑證 (.pem) 檔案都存在於 rootca/certs 目錄中。 .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 的檔案,類似於前一節中為根授權建立的資料夾結構和檔案。

    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 目錄中,建立名為 subca.conf 的文字檔。 在文字本編輯器中開啟該檔案,然後將下列 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 中樞

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

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

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

  3. 在 [憑證名稱] 欄位中輸入次級 CA 憑證的顯示名稱。

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

  5. 勾選 [設定在上傳時驗證憑證狀態​] 旁的方塊。

    螢幕擷取畫面顯示如何在上傳時自動驗證憑證狀態。

  6. 選取 [儲存]。

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

建立裝置的用戶端憑證

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

用戶端憑證必須將其主體一般名稱 (CN) 欄位的值設定為在 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. 系統會提示您提供憑證詳細資料,如下列範例中所示。

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

    提供憑證詳細資料之後,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 目錄的 certs 子目錄中。 .pem 檔案的檔案名稱符合用戶端憑證的序號。

下一步

您可以向 IoT 中樞註冊裝置,以測試您為該裝置建立的用戶端憑證。 如需註冊裝置的詳細資訊,請參閱 建立和管理裝置身分識別

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