📢 Webサイト閉鎖と移転のお知らせ
このWebサイトは2026年9月に閉鎖いたします。
新しい記事は移転先で追加しております。(旧サイトでは記事を追加しておりません)

 
(同じ利用者による、間の4版が非表示)
25行目: 25行目:
<br><br>
<br><br>


== 鍵ペア ==
== 鍵ペア (秘密鍵 / DER) ==
秘密鍵ファイル (.priv) および DERファイル (.der) は、公開鍵暗号方式における鍵ペアを表現するファイルである。<br>
秘密鍵ファイル (.priv) および DERファイル (.der) は、公開鍵暗号方式における鍵ペアを表現するファイルである。<br>
これらのファイルは、カーネルモジュールの署名と検証に重要な役割を持つ。<br>
これらのファイルは、カーネルモジュールの署名と検証に重要な役割を持つ。<br>
63行目: 63行目:
<br>
<br>
これらのファイルを適切に使用することにより、MOKシステムはセキュアブート環境下でもカスタムモジュールの安全な使用を可能にしている。<br>
これらのファイルを適切に使用することにより、MOKシステムはセキュアブート環境下でもカスタムモジュールの安全な使用を可能にしている。<br>
<br><br>
== 設定ファイル ==
鍵ペア (秘密鍵 / DER) を生成する場合、OpenSSL等を使用して証明書要求 (CSR) と自己署名証明書を生成するための設定を定義する必要がある。<br>
<br>
この定義を使用することにより、MOKシステムで使用するための属性と拡張機能を持つ鍵ペアと証明書を生成することができる。<br>
生成された.privファイルは秘密鍵、.derファイルは公開鍵証明書をDERフォーマットで含むことになる。<br>
<br>
以下に示す設定ファイルの定義は、セキュアブート環境でカーネルモジュールの署名に使用される証明書の要件を満たすように調整されている。<br>
特に、<code>keyUsage</code>が<code>digitalSignature</code>に設定されているため、この鍵がモジュール署名専用であることを示している。<br>
<br>
<syntaxhighlight lang="ini">
[ req ]
default_bits = 4096
distinguished_name = req_distinguished_name
prompt = no
string_mask = utf8only
x509_extensions = myexts
[ req_distinguished_name ]
O = SUSE Linux Products GmbH            # 任意の名前
CN = SUSE Linux Enterprise Secure Boot  # 任意の名前
emailAddress = suse@localhost          # 任意のメールアドレス
[ myexts ]
basicConstraints=critical,CA:FALSE
keyUsage=digitalSignature
subjectKeyIdentifier=hash
authorityKeyIdentifier=keyid
</syntaxhighlight>
<br>
* [req]セクション
** default_bits
**: 鍵のビット長を指定する。
**: 上記の例に記述されている4096とは、強力な暗号化を提供する。
** distinguished_name
**: 証明書要求 (CSR) や証明書に含める識別名 (Distinguished Name, DN) 情報を定義するセクションを指定する。
**: 任意の文字列が使用できる。
**: <br>
**: <u>※注意</u>
**: <u>値を変更する場合、その値と同じ名前のセクションを設定ファイル内に作成する必要がある。</u>
** prompt
**: <code>no</code>を指定する場合、対話的なプロンプトを無効にして、ファイルから直接情報を読み取る。
** string_mask
**: <code>utf8only</code>を指定する場合、文字列をUTF-8エンコーディングに制限する。
** x509_extensions
**: 生成されるX.509証明書に追加する拡張機能を定義するセクションを指定する。
**: 任意の文字列が使用できる。
**: 省略も可能である。(省略時は拡張機能が追加されない)
**: <br>
**: <u>※注意</u>
**: <u>値を変更する場合、その値と同じ名前のセクションを設定ファイル内に作成して、そこで拡張機能を定義する必要がある。</u>
*: <br>
* [req_distinguished_name]セクション ※ユーザ定義のセクション名
** O
**: 組織 (Organization) 名を指定する。
** CN
**: 共通名 (Common Name) を指定する。
**: 一般的には、証明書の主要な識別子として使用する。
** emailAddress
**: 連絡先のメールアドレスを指定する。
*: <br>
* [myexts]セクション (X.509証明書拡張) ※ユーザ定義のセクション名
** basicConstraints
**: <code>critical,CA:FALSE</code>を指定する場合、この証明書が認証局 (CA) でないことを示し、このフィールドを重要 (critical) とマークする。
** keyUsage
**: <code>digitalSignature</code>を指定する場合、この鍵のの使用目的がデジタル署名であることを指定する。
** subjectKeyIdentifier
**: <code>hash</code>を指定する場合、証明書の公開鍵のハッシュを含む識別子を追加する。
** authorityKeyIdentifier
**: 証明書の発行者 (自己署名の場合はユーザ自身) の公開鍵を識別するための方法を指定する。
**: <code>keyid</code>を指定する場合、発行者の公開鍵のハッシュを使用することを意味する。
**:* keyid, issuer : 発行者の公開鍵のハッシュと発行者の名前を両方含める。
**:* issuer: 発行者の名前のみを含める。
**:* 省略することができる。(省略時はこの拡張機能が追加されない)
**: <br>
**: <u>※注意</u>
**: <u>自己署名証明書の場合、<code>keyid</code>が最も一般的な選択肢である。</u>
**: <code>issuer</code>を含める場合、自己参照的な情報になる可能性がある。</u>
<br><br>
== 鍵ペア (秘密鍵 / DER) の生成 ==
OpenSSL等を使用して、鍵ペア (秘密鍵 / DER) を生成する。<br>
<br>
以下の例では、自己署名証明書と対応する秘密鍵を生成する。<br>
<br>
このコマンドは、MOKシステムで使用するための形式と属性を持つ証明書と鍵ペアを生成する。<br>
生成された.derファイルは公開鍵証明書、.privファイルは対応する秘密鍵を含む。<br>
<br>
特に、<code>-addext</code>オプションを指定することにより、この証明書がコード署名 (カーネルモジュールの署名等) に使用できることが明示できる。<br>
これは、セキュアブート環境でモジュールを署名する場合に必要な属性である。<br>
<br>
以下の例では、-days 36500のように長期の有効期限を設定しているが、セキュリティの観点からは、より短い期間で定期的に更新することが推奨される場合もある。<br>
<br>
openssl req -x509 -new -nodes -utf8 -sha256 \
            -days 36500 \
            -batch \
            -config <上記で作成した設定ファイルのパス> \
            -outform DER \
            -out <生成するDERファイルのパス> \
            -keyout <生成する.privファイルのパス> \
            -addext "extendedKeyUsage=codeSigning"
<br>
* -reqオプション
*: 証明書要求 (CSR) の処理や証明書の生成を行うOpenSSLのサブコマンドである。
* -x509
*: CSRではなく、自己署名X.509証明書を直接生成することを指定する。
* -new
*: 新しい証明書要求を生成する。
*: -x509オプションと組み合わせることにより、新しい自己署名証明書を生成する。
* -nodes
*: 秘密鍵を暗号化せずに生成する。
* -utf8
*: 証明書のフィールドにUTF-8エンコーディングを使用する。
* -sha256
*: 証明書の署名にSHA-256ハッシュアルゴリズムを使用する。
* -days <日数>
*: 証明書の有効期限を指定する。
*: 36500と指定する場合、証明書の有効期限は36500日 (約100年) となる。
* -batch
*: 対話的なプロンプトを無効にして、設定ファイルから全ての情報を読み取る。
* -config <使用する設定ファイル>
*: 使用する設定ファイルを指定する。
* -outform DER
*: 出力形式をDER (Distinguished Encoding Rules) に設定する。
* -out <DERファイルのパス>
*: 生成された証明書 (公開鍵部分) の出力先を指定する。
* -keyout <.privファイルのパス>
*: 生成された秘密鍵の出力先を指定する。
* -addext "extendedKeyUsage=codeSigning"
*: 証明書に拡張キー使用法を追加して、コード署名用であることを示す。
<br><br>
== MOKキーの登録 ==
以下に示すコマンドを実行して、MOKにキーをインポートする。<br>
sudo mokutil --import <DERファイルのパス>
# または
sudo mokutil --import <DERファイルのパス> --root-pw
<br>
PCを再起動して、Linuxブートローダ起動前にキーをインポートする。<br>
sudo systemctl reboot
<br><br>
== 署名 ==
==== カーネルモジュールの署名 ====
カーネルモジュールをMOKに署名する。<br>
sudo /lib/modules/$(uname -r)/build/scripts/sign-file sha256 \
      <.privファイルのパス> \
      <.derファイルのパス>  \
      <署名するカーネルモジュールのパス  例: /lib/modules/$(uname -r)/kernel/fs/f2fs/f2fs.ko>
<br><br>
<br><br>