X.509 憑證是代表使用者、電腦、服務或裝置的數位文件。 憑證授權機構(CA)、下屬機構或註冊機構會發出 X.509 證書。 憑證包含該憑證主體的公開金鑰。 它們不包含主體的私鑰,必須安全儲存。 RFC 5280 記錄了公鑰憑證,包括其欄位與擴展。 公鑰憑證具有數位簽章,通常包含以下資訊:
- 關於證書科目的資訊
- 對應於主體私鑰的公鑰
- 關於發行 CA 的資訊
- 支援的加密及/或數位簽章演算法
- 判斷證書撤銷及有效狀態的資訊
證書欄位
X.509 憑證標準有三個增量版本,每個後續版本都會在標準中新增憑證欄位:
- 版本 1(v1)於 1988 年發布,遵循最初的 X.509 憑證標準。
- 版本 2(v2)於 1993 年發布,在版本 1 的欄位中新增兩個欄位。
- 版本 3(v3)於 2008 年發布,代表現行的 X.509 標準版本。 此版本新增了憑證擴充功能的支援。
本節旨在作為 X.509 憑證中憑證欄位及憑證擴充的一般參考。 欲了解更多關於憑證欄位與憑證擴充的資訊,包括資料型別、約束及其他細節,請參閱 RFC 5280 規範。
版本 1 欄位
下表描述了 X.509 憑證的版本 1 憑證欄位。 此表中包含的所有欄位在後續的 X.509 憑證版本中皆可使用。
| Name | Description |
|---|---|
| 版本 | 一個整數,用來識別憑證的版本號。 |
| 序號 | 一個整數代表由憑證授權機構(CA)發行的每張證書的唯一編號。 |
| 簽章 | CA 用於簽署憑證的密碼演算法識別碼。 該值包含演算法的識別碼以及該演算法所使用的任何可選參數(如適用)。 |
| 簽發者 | 該證書發出者CA的區別名稱(DN)。 |
| 有效期 | 證明有效期內包含的期間。 |
| 主旨 | 證書科目的尊貴名稱(DN)。 |
| 主題公鑰資訊 | 憑證主體擁有的公鑰。 |
版本 2 欄位
下表描述了版本 2 新增的欄位,包含憑證發行者的資訊。 然而,這些場很少被使用。 此表中包含的所有欄位在後續的 X.509 憑證版本中皆可使用。
| Name | Description |
|---|---|
| 發行者唯一識別碼 | 代表發行 CA 定義的獨特識別碼。 |
| 主體唯一識別碼 | 代表憑證主體的唯一識別碼,由發出憑證憑證(CA)定義。 |
版本 3 欄位
下表描述了版本 3 新增的欄位,代表一系列 X.509 憑證擴充。
| Name | Description |
|---|---|
| 擴充功能 | 一套標準及網際網路專用的憑證擴充套件。 欲了解更多關於 X.509 v3 憑證可用憑證擴充的資訊,請參見憑證擴充。 |
憑證延伸
憑證擴充功能於版本 3 引入,提供方法將更多屬性與使用者或公鑰關聯,並管理憑證授權中心間的關係。 欲了解更多關於憑證擴充的資訊,請參閱 RFC 5280 規範中的憑證擴充章節。
標準擴充套件
X.509 標準定義了本節所包含的擴充功能,供網際網路公鑰基礎架構(PKI)使用。
| Name | Description |
|---|---|
| 授權單位金鑰識別碼 | 一個識別碼,代表憑證主體及發出該憑證的 CA 憑證序號,或是發出憑證 CA 公鑰的雜湊值。 |
| 主體金鑰識別碼 | 是目前憑證公鑰的雜湊值。 |
| 金鑰使用 | 一個點陣式值,定義憑證可用於哪些服務。 |
| 私鑰使用期間 | 金鑰對中私鑰部分的有效期。 |
| 憑證政策 | 一組政策資訊,用於驗證憑證主體。 |
| 政策映射 | 一組政策映射,每個映射將一個組織中的政策映射到另一個組織的政策。 |
| 主體別名 | 這是該主題的各種別名集合。 |
| 發行人替代名稱 | 這是發行 CA 的多個別名集合。 |
| 主題目錄屬性 | 來自 X.500 或 LDAP 目錄的屬性集合。 |
| 基本限制 | 一組限制條件,允許憑證指定是頒發給 CA,還是發給使用者、電腦、裝置或服務。 此擴充還包含一個路徑長度限制,限制可存在的次級 CA 數量。 |
| 名稱限制 | 一組限制條件,用以指定在 CA 發行的憑證中允許使用哪些命名空間。 |
| 政策限制 | 一組可用來禁止 CA 間政策映射的約束。 |
| 擴展金鑰使用 | 一組關鍵目的值,指示憑證公鑰可用於金鑰 使用擴充包 中指定的用途之外。 |
| CRL 分銷點 | 一組 URL 集合,發布了基礎憑證撤銷清單(CRL)。 |
| 抑制任何政策 | 禁止在次級CA憑證中使用 所有發行政策 OID(2.5.29.32.0) |
| 最新CRL | 此擴充功能,也稱為 Delta CRL 分發點,包含一個或多個 URL,發布 CA 的 delta CRL 即在此處發布。 |
私人網際網路擴充
本節所包含的擴展與標準擴展相似,可用於引導申請至有關核發 CA 或證書主題的線上資訊。
| Name | Description |
|---|---|
| 管理局資訊存取 | 一組描述發布 CA 所提供額外資訊格式與位置的條目集合。 |
| 主體資訊存取 | 一組描述證書主體所提供額外資訊格式與位置的條目集合。 |
憑證格式
證書可以儲存多種格式。 Azure IoT 中樞認證通常使用 Privacy-Enhanced 郵件(PEM)和個人資訊Exchange(PFX)格式。 下表說明常用的憑證檔案與格式。
| Format | Description |
|---|---|
| 二進位憑證 | 一份使用特殊編碼規則(DER)ASN.1 編碼的原始二進位證書。 |
| ASCII PEM 格式 | PEM 證書(.pem)檔案包含以 base 64 編碼的憑證,開頭 -----BEGIN CERTIFICATE----- 與結尾皆為 -----END CERTIFICATE-----。 PEM 格式是 X.509 憑證最常見的格式之一,IoT 中樞 在上傳特定憑證(如裝置憑證)時必須使用PEM格式。 |
| ASCII PEM 金鑰 | 包含一個 Base64 編碼的 DER 金鑰,並可選擇性地提供更多關於密碼保護演算法的元資料。 |
| PKCS #7 證書 | 一種專為傳輸簽名或加密資料而設計的格式。 它可以包含整個憑證鏈。 RFC 2315 定義了此格式。 |
| PKCS #8 金鑰 | 私鑰儲存的格式。 RFC 5208 定義了此格式。 |
| PKCS #12 金鑰與憑證 | 一種複雜的格式,可以儲存並保護金鑰及整條憑證鏈。 它通常搭配 .p12 或 .pfx 擴展檔一起使用。 PKCS #12 與 PFX 格式同義。 RFC 7292 定義了此格式。 |
自我簽署憑證
你可以用兩張自簽憑證將裝置認證到你的物聯網中樞進行測試。 這種認證有時稱為指 紋認證 ,因為憑證是透過計算出來的雜湊值(指 紋 或 指紋)來識別。 這些計算出來的雜湊值會被 IoT 中樞 用來驗證你的裝置。
Important
我們建議您使用由發行憑證授權機構(CA)簽署的憑證,即使是測試目的。 在生產環境中切勿使用自簽憑證。
建立自我簽署憑證
您可以使用 OpenSSL 來建立自我簽署憑證。 以下步驟會教你如何在 bash shell 中執行 OpenSSL 指令,建立自簽憑證,並取得憑證指紋,用於 IoT 中樞 的裝置認證。
Note
如果你想使用自簽憑證進行測試,必須為每個裝置建立兩張憑證。
執行以下指令以產生私鑰並建立 PEM 編碼的私鑰(.key)檔案,將以下佔位符替換為對應值。 以下指令產生的私鑰使用帶有 2048 位元加密的 RSA 演算法。
{KeyFile}。 你的私鑰檔案名稱。
openssl genpkey -out {KeyFile} -algorithm RSA -pkeyopt rsa_keygen_bits:2048執行以下指令以產生 PKCS #10 憑證簽署請求(CSR),並建立 CSR(.csr)檔案,將以下佔位符替換為對應值。 當被要求簽署憑證時,務必指定物聯網裝置的裝置 ID。
{KeyFile}。 你的私鑰檔案名稱。
{CsrFile}。 你的CSR檔案名稱。
{裝置ID}。 你的物聯網裝置名稱。
openssl req -new -key {KeyFile} -out {CsrFile} 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) []:{DeviceID} Email Address []:. Please enter the following 'extra' attributes to be sent with your certificate request A challenge password []:. An optional company name []:.執行以下指令檢查並驗證你的 CSR,並將以下佔位符替換為對應的值。
{CsrFile}。 你的證書檔案名稱。
openssl req -text -in {CsrFile} -verify -noout執行以下指令以產生自簽憑證,並建立 PEM 編碼的憑證(.crt)檔案,將以下佔位符替換為對應值。 該指令會用你的私鑰轉換並簽署你的CSR,產生一份自簽憑證,該憑證在365天後到期。
{KeyFile}。 你的私鑰檔案名稱。
{CsrFile}。 你的CSR檔案名稱。
{CrtFile}。 你的證書檔案名稱。
openssl x509 -req -days 365 -in {CsrFile} -signkey {KeyFile} -out {CrtFile}執行以下指令以取得憑證的指紋,將以下佔位符替換為對應的值。 憑證的指紋是該憑證唯一計算出的雜湊值。 你需要指紋來在 IoT 中樞 中設定物聯網裝置進行測試。
{CrtFile}。 你的證書檔案名稱。
openssl x509 -in {CrtFile} -noout -fingerprint
上傳後手動驗證憑證
當你將根憑證授權中心(CA)憑證或其附屬憑證上傳到物聯網樞紐時,你可以選擇自動驗證憑證。 如果你在上傳時沒有選擇自動驗證你的憑證,你的憑證會顯示為 「未驗證」狀態。 您必須執行以下步驟手動驗證您的證書。
選擇憑證以查看 憑證詳情 對話框。
在對話框中選擇 產生驗證碼 。
將驗證碼複製到剪貼簿。 你必須在後續步驟中使用此驗證碼作為證書主體。 例如,如果驗證碼是
75B86466DA34D2B04C0C4C9557A119687ADAE7D4732BDDB3,就將它作為你證書的主題,如下一步所示。產生驗證證書有三種方式:
如果你使用的是 Microsoft 提供的 PowerShell 腳本,執行
New-CACertsVerificationCert "<verification code>"以建立名為VerifyCert4.cer的憑證,並用先前產生的驗證碼取代<verification code>。 如需詳細資訊,請參閱適用於 C 的 Azure IoT 中樞裝置 SDK (英文) GitHub 存放庫中的管理範例和教學課程的測試 CA 憑證 (英文)。如果你使用的是 Microsoft 提供的 Bash 腳本,執行
./certGen.sh create_verification_certificate "<verification code>"以建立名為 verification-code.cert.pem 的憑證,並替換<verification code>成先前產生的驗證碼。 欲了解更多資訊,請參閱 GitHub 倉庫中的 Azure IoT 中樞 Device SDK for C 的範例與教學,請參閱「管理測試 CA 憑證」。如果你使用 OpenSSL 來產生憑證,必須先產生一組私鑰,然後再產生憑證簽署請求(CSR)檔案。 以下範例中,將 替換
<verification code>為先前產生的驗證碼:
openssl genpkey -out pop.key -algorithm RSA -pkeyopt rsa_keygen_bits:2048 openssl req -new -key pop.key -out pop.csr ----- 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) []:<verification code> Email Address []: Please enter the following 'extra' attributes to be sent with your certificate request A challenge password []: An optional company name []:接著,使用根 CA 或下屬 CA 的適當設定檔,以及 CSR 檔案建立憑證。 以下範例示範如何使用 OpenSSL 從根 CA 設定檔和 CSR 檔案建立憑證。
openssl ca -config rootca.conf -in pop.csr -out pop.crt -extensions client_ext更多資訊請參閱 教學 - 建立並上傳測試憑證。
在憑證詳情檢視中選擇新憑證。
憑證上傳後,選擇 驗證。 證書狀態應該會變成 已驗證。
如需詳細資訊
欲了解更多關於 X.509 憑證及其在 IoT 中樞 中的應用,請參閱以下文章: