X.509 証明書

X.509証明書は、ユーザー、コンピュータ、サービス、またはデバイスを表すデジタル文書です。 証明書発行機関(CA)、下位CA、または登録機関がX.509証明書を発行します。 証明書には証明書の主体の公開鍵が含まれています。 それらは対象者の秘密鍵を含んでおらず、安全に保存する必要があります。 RFC 5280 は公開鍵証明書のフィールドや拡張を含む文書化を規定しています。 公開鍵証明書はデジタル署名されており、通常以下の情報が含まれています。

  • 証明書科目に関する情報
  • 対象の秘密鍵に対応する公開鍵
  • 発行CAに関する情報
  • サポートされる暗号化および/またはデジタル署名アルゴリズム
  • 証明書の取り消しおよび有効性の判断情報

証明書フィールド

X.509証明書標準には3つの増分バージョンがあり、各バージョンが標準に証明書フィールドを追加しました:

  • バージョン1(v1)は1988年に発行され、証明書の初期標準であるX.509に準拠しています。
  • 1993年にリリースされたバージョン2(v2)では、バージョン1に含まれるフィールドに2つのフィールドが追加されました。
  • バージョン3(v3)は2008年に公開され、現在のX.509標準のバージョンを表しています。 このバージョンでは証明書拡張のサポートが追加されました。

このセクションは、X.509証明書で利用可能な証明書フィールドおよび証明書拡張の一般的な参考資料として意図されています。 証明書フィールドや証明書拡張、データ型、制約、その他の詳細については、 RFC 5280 仕様を参照してください。

バージョン 1 のフィールド

以下の表は、X.509証明書のバージョン1証明書フィールドを説明しています。 この表に含まれるすべてのフィールドは、以降のX.509証明書バージョンでも利用可能です。

名前 説明
Version 証明書のバージョン番号を示す整数です。
Serial Number\(シリアル番号\) 整数は、証明書発行機関(CA)によって発行される各証明書の固有の番号を表します。
署名 CAが証明書に署名するために使用する暗号アルゴリズムの識別子です。 この値はアルゴリズムの識別子と、該当する場合はそのアルゴリズムが使用する任意のパラメータの両方を含みます。
発行者 証明書発行機関の識別名(DN)です。
有効期限までの日数 証明書が有効である期間を含めます。
表題 証明書科目の名(DN)。
主題公開鍵情報 証明書主体が所有する公開鍵。

バージョン 2 のフィールド

以下の表は、バージョン2に追加されたフィールドを説明し、証明書発行者に関する情報を含みます。 しかし、これらのフィールドはほとんど使われません。 この表に含まれるすべてのフィールドは、以降のX.509証明書バージョンでも利用可能です。

名前 説明
発行者ユニークID 発行CAが定義した一意識別子です。
被験者一意ID 発行CAによって定義された証明書の主題を表す一意識別子です。

バージョン3のフィールド

以下の表は、バージョン3に追加されたフィールドを説明しており、X.509証明書拡張の集合を表しています。

名前 説明
拡張機能 標準およびインターネット固有の証明書拡張のコレクションです。 X.509 v3証明書に利用可能な証明書拡張の詳細については、「 証明書拡張」を参照してください。

証明書の拡張

バージョン3で導入された証明書拡張は、ユーザーや公開鍵により多くの属性を関連付けたり、証明書発行機関間の関係を管理する方法を提供します。 証明書拡張に関する詳細は、RFC 5280仕様の証明書拡張セクションをご覧ください。

標準拡張機能

X.509標準は、この節に含まれる拡張をインターネット公開鍵インフラ(PKI)で使用するためのものを定義しています。

名前 説明
機関キー識別子 証明書の主体と、この証明書を発行したCA証明書のシリアル番号、または発行CAの公開鍵のハッシュを表す識別子です。
サブジェクト キー識別子 現在の証明書の公開鍵のハッシュ。
キー使用法 証明書が使用できるサービスを定義するビットマップ値です。
秘密鍵使用期間 鍵ペアの秘密鍵部分の有効期間。
証明書ポリシー 証明書の対象を検証するために使われるポリシー情報の集合体です。
ポリシーマッピング ポリシーマッピングの集合体で、それぞれがある組織内のポリシーを別の組織のポリシーにマッピングします。
サブジェクトの別名 この主題の別名の集合。
発行者別名 発行CAの別名の集合。
主題ディレクトリの属性 X.500またはLDAPディレクトリからの属性の集合です。
基本的な制約 証明書がCAに発行されるか、ユーザー、コンピュータ、デバイス、サービスに発行されるかを指定できる制約の集合体です。 この拡張には、存在可能な下位CAの数を制限するパス長制約も含まれています。
名前の制約 CA発行の証明書で許可される名前空間を指定する制約の集合体です。
方針の制約 CA間のポリシーマッピングを禁止するために使用できる制約の集合です。
拡張鍵の使用 証明書の公開鍵がどのように使えるかを示すキーパーパス値の集合であり、 キー使用 拡張で特定された目的を超えて使用可能です。
CRL配給ポイント 基本的な証明書取り消しリスト(CRL)が公開されるURLの集合体です。
ポリシーを抑制する すべての 発行ポリシーOID (2.5.29.32.0)を下位CA証明書で使用することを抑制します
最新のCRL この拡張はデル タCRL配信ポイントとも呼ばれ、発行するCAのデルタCRLが公開されている1つ以上のURLを含みます。

プライベートインターネット拡張

このセクションに含まれる拡張は標準的な拡張に似ており、発行するCAや証明書の対象に関するオンライン情報への申請を誘導するために使用できます。

名前 説明
機関情報アクセス 発行CAが提供する追加情報の形式や場所を説明するエントリーの集合。
主体情報アクセス 証明書主体から提供される追加情報の形式や場所を説明する項目のコレクション。

証明書の形式

証明書はさまざまな形式で保存可能です。 Azure IoT Hub認証は通常、Privacy-Enhanced メール(PEM)および個人情報Exchange(PFX)形式を使用します。 以下の表は、証明書を表現するために一般的に使われるファイルとフォーマットを説明します。

フォーマット 説明
バイナリ証明書 Distinguished Encoding Rules(DER)ASN.1エンコーディングを用いた生のフォームバイナリ証明書。
ASCII PEMフォーマット PEM証明書(.pem)ファイルには、 -----BEGIN CERTIFICATE----- から -----END CERTIFICATE-----で終わるBase64エンコード証明書が含まれています。 X.509証明書の最も一般的な形式の一つであるPEM形式は、IoT Hubが特定の証明書(例えばデバイス証明書)をアップロードする際に必須としています。
ASCII PEMキー Base64でエンコードされたDERキーを含み、パスワード保護に使われるアルゴリズムに関するメタデータもオプションで追加可能です。
PKCS #7証明書 署名または暗号化されたデータの伝送を目的としたフォーマットです。 証明書チェーン全体を含めることができます。 RFC 2315 がこのフォーマットを定義しています。
PKCS #8キー 秘密鍵ストアのフォーマット。 RFC 5208 がこのフォーマットを定義しています。
PKCS #12鍵と証明書 鍵と証明書チェーン全体を保存・保護できる複雑なフォーマットです。 .p12や.pfx拡張子と一緒に使われることが多いです。 PKCS #12はPFXフォーマットの代名詞です。 RFC 7292 がこのフォーマットを定義しています。

自己署名入りの証明書

テスト目的でIoTハブにデバイスを認証するには、2つの自己署名証明書を使います。 この種の認証は、証明書が指指紋と呼ばれる計算されたハッシュ値によって識別されるため、サムプリント認証とも呼ばれます。 これらの計算されたハッシュ値はIoT Hubでデバイスの認証に使用されます。

Important

テスト目的であっても、発行する証明書発行機関(CA)が署名した証明書の使用を推奨します。 本番環境では自己署名証明書を絶対に使わないでください。

自己署名証明書を作成する

OpenSSL を使用して自己署名証明書を作成できます。 以下の手順では、bashシェルでOpenSSLコマンドを実行して自己署名証明書を作成し、IoT Hubでデバイスの認証に使える認証フィンガープリントを取得する方法を示します。

Note

テストに自己署名証明書を使いたい場合は、各デバイスごとに2つの証明書を作成する必要があります。

  1. 以下のコマンドを実行して秘密鍵を生成し、PEMで符号化された秘密鍵(.key)ファイルを作成し、以下のプレースホルダーを対応する値に置き換えます。 以下のコマンドで生成される秘密鍵は、2048ビット暗号化を用いたRSAアルゴリズムを使用します。

    {キーファイル}。 あなたの秘密鍵ファイルの名前です。

    openssl genpkey -out {KeyFile} -algorithm RSA -pkeyopt rsa_keygen_bits:2048
    
  2. 以下のコマンドを実行してPKCS #10証明書署名要求(CSR)を生成し、CSR(.csr)ファイルを作成し、以下のプレースホルダーを対応する値に置き換えます。 自己署名証明書にIoTデバイスのデバイスIDを必ず指定してください。

    {キーファイル}。 あなたの秘密鍵ファイルの名前です。

    {CsrFile}。 あなたのCSRファイルの名前です。

    {DeviceID}。 あなたのIoTデバイスの名前です。

    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 []:.
    
  3. 以下のコマンドを実行してCSRを確認し、以下のプレースホルダーを対応する値に置き換えてください。

    {CsrFile}。 証明書ファイルの名前です。

    openssl req -text -in {CsrFile} -verify -noout
    
  4. 以下のコマンドを実行して自己署名証明書を生成し、PEMエンコードされた証明書(.crt)ファイルを作成します。これらのプレースホルダーは対応する値に置き換えられます。 このコマンドは秘密鍵でCSRに変換・署名し、365日後に有効期限となる自己署名証明書を生成します。

    {キーファイル}。 あなたの秘密鍵ファイルの名前です。

    {CsrFile}。 あなたのCSRファイルの名前です。

    {CrtFile}。 証明書ファイルの名前です。

    openssl x509 -req -days 365 -in {CsrFile} -signkey {KeyFile} -out {CrtFile}
    
  5. 以下のコマンドを実行して証明書の指紋を取得し、以下のプレースホルダーを対応する値に置き換えます。 証明書のフィンガープリントは、その証明書に固有の計算されたハッシュ値です。 IoT HubでIoTデバイスをテストするためには指紋が必要です。

    {CrtFile}。 証明書ファイルの名前です。

    openssl x509 -in {CrtFile} -noout -fingerprint
    

アップロード後に証明書を手動で確認してください

ルート証明書発行機関(CA)証明書または従属CA証明書をIoTハブにアップロードすると、自動的に証明書の検証を選択できます。 アップロード時に証明書の自動認証を選択していない場合、証明書の状態は 未確認のまま表示されます。 証明書を手動で確認するために、以下の手順を踏む必要があります。

  1. 証明書を選択して証明書 詳細 ダイアログをご覧ください。

  2. ダイアログで「 検証コードを生成 」を選択します。

    証明書詳細ダイアログのスクリーンショットです。

  3. 確認コードをクリップボードにコピーします。 この認証コードは、今後の手順で証明書の対象として使用してください。 例えば、認証コードが 75B86466DA34D2B04C0C4C9557A119687ADAE7D4732BDDB3の場合は、次のステップで示すように証明書の件名として追加してください。

  4. 認証証明書を作成する方法は3つあります。

    • Microsoftが提供するPowerShellスクリプトを使用している場合は、New-CACertsVerificationCert "<verification code>"を実行して「VerifyCert4.cer」という証明書を作成し、<verification code>を以前に生成した検証コードに置き換えます。 詳細については、Azure IoT Hub Device SDK for C の GitHub リポジトリにある「サンプルおよびチュートリアルのためのテスト用 CA 証明書の管理」を参照してください。

    • Microsoftが提供するBashスクリプトを使用している場合は、./certGen.sh create_verification_certificate "<verification code>"を実行してverification-code.cert.pemという証明書を作成し、<verification code>を以前に生成した検証コードに置き換えます。 詳細については、Azure IoT Hub Device SDK for CのGitHubリポジトリにある「Managing test CA certificates」のサンプルやチュートリアルをご覧ください。

    • 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ファイルを使って証明書を作成します。 以下の例は、rootのCA設定ファイルとCSRファイルからOpenSSLを使って証明書を作成する方法を示しています。

    openssl ca -config rootca.conf -in pop.csr -out pop.crt -extensions client_ext
    

    詳細は「 チュートリアル - テスト用証明書の作成とアップロード」をご覧ください。

  5. 証明書詳細ビューで新しい証明書を選択してください。

  6. 証明書のアップロード後、「 Verify」を選択します。 証明書の状態は 「Verified」に変更されるはずです。

詳細については次の情報をご覧ください。

X.509証明書やIoT Hubでの使用方法についての詳細は、以下の記事をご覧ください。