【Laravel】php artisan key:generateコマンドの使い方と構文|APP_KEY生成・オプション・本番の注意点

Artisanコマンドリファレンス

php artisan key:generate は、Laravel アプリケーションの暗号化基盤で使用される APP_KEY(アプリケーションキー)を自動生成し、.env ファイルに設定する Artisan コマンドです。構文は php artisan key:generate [--show] [--force] であり、新規プロジェクト作成時や環境構築時に必ず実行します。ただし、稼働中の本番環境で不用意に再実行するとセッションの切断や暗号化データの復号不能を引き起こすため、正しい仕様と運用の理解が不可欠です。

  • カテゴリ: artisan(コマンドライン)
  • 対応バージョン: Laravel 11 / Laravel 12(PHP 8.2〜8.4対応)
  • コマンド: php artisan key:generate
  • 関連コマンド / 設定: config:clear, optimize:clear, .env, APP_KEY, APP_PREVIOUS_KEYS

要点(TL;DR)

  • php artisan key:generate は 32バイトのランダムな暗号化秘密鍵(APP_KEY)を生成して .env に書き込む コマンド。
  • --show オプションで .env を書き換えずにキーのみを表示可能(DockerやCI、Secret Manager連携で重宝)。
  • --force オプションで本番環境(APP_ENV=production)での対話型確認プロンプトをスキップして上書き可能。
  • 本番環境での安易な再生成は厳禁。既存のセッション切断、Cookie無効化、データベース暗号化カラムの復号不能(データ破損)が発生します。

概要とLaravel 11/12における基本動作

key:generate は、Laravel の暗号化サービス(Illuminate\Encryption\Encrypter)が利用する共通鍵(APP_KEY)を安全な乱数生成器から生成するコマンドです。

Laravel 11 および Laravel 12 ではアプリケーション構造が大幅にスリム化されましたが、暗号化の基本設計は踏襲されています。デフォルトでは暗号化方式として AES-256-CBC が採用されており、32バイトのランダムな文字列が生成され、base64: プレフィックスを伴って .env の APP_KEY に保存されます。

構文 / シグネチャとオプション

php artisan key:generate [--show] [--force]

利用可能なオプション一覧

オプション必須説明・実務での用途
--show任意生成した暗号化キーを画面(コンソール)に出力する。.env ファイルは書き換えない。CI環境やSecret Managerへの登録時に使用。
--force任意本番環境(APP_ENV=production)や既に APP_KEY が設定されている場合の確認プロンプトをスキップし、強制的に上書きする。CI/CDビルドで必須。

基本的な使い方と実行例

1. 通常実行(.env への直接反映)

ローカル環境の初回セットアップ時は、引数なしでコマンドを実行します。

php artisan key:generate
# 出力例: Application key set successfully.

コマンドが完了すると、プロジェクトルートの .env ファイル内にある APP_KEY が更新されます。

APP_KEY=base64:4k8YVd1Vl93KqL7XJ3N5o8+x9a0b1c2d3e4f5g6h7i8=

2. –show オプションでキーのみを取得する

.env ファイルを変更せず、キー文字列だけを取得したい場合は --show を使用します。

php artisan key:generate --show
# 出力例: base64:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

3. –force オプションで強制上書きする

APP_ENV=production に設定された環境やスクリプト自動実行時、確認ダイアログ(Do you really wish to run this command?)で処理が停止しないように --force を付与します。

php artisan key:generate --force

Docker / CI環境での設定手順と自動化

DockerコンテナやCI/CDパイプラインにおいて、APP_KEY をどのように生成・管理すべきかはトラブルの多いポイントです。代表的なパターンを解説します。

Docker / Laravel Sail での環境構築手順

注意:Dockerイメージをビルドする際(Dockerfile内)で key:generate を実行してはいけません。イメージ内に固定のキーが焼き込まれてしまい、セキュリティ事故の原因になります。

Laravel Sail の場合:

# Sail コンテナ起動後、コンテナ内で実行
./vendor/bin/sail artisan key:generate

カスタム Dockerfile / コンテナ初期起動エントリポイントの場合:

コンテナ起動時のシェルスクリプト(entrypoint.sh)で .env の存在と APP_KEY の未設定を検知して自動生成させる設計が標準的です。

#!/bin/sh
set -e

# .envが存在しない場合はコピー
if [ ! -f .env ]; then
    cp .env.example .env
fi

# APP_KEYが空の場合は生成
if ! grep -q "^APP_KEY=base64:" .env; then
    php artisan key:generate --force
fi

# 設定キャッシュのクリア
php artisan config:clear

exec "$@"

CI/CD(GitHub Actions)でのテスト実行手順

GitHub Actions などのCI環境で自動テストを実行する場合、.env.ci や .env.example をコピーした上で key:generate --force を実行するか、ワークフローの環境変数に直接注入します。

name: Laravel Tests

on: [push, pull_request]

jobs:
  laravel-tests:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4

      - name: Setup PHP
        uses: shivammathur/setup-php@v2
        with:
          php-version: '8.3'
          extensions: mbstring, pdo, pdo_sqlite

      - name: Install Dependencies
        run: composer install -q --no-ansi --no-interaction --no-scripts --no-progress --prefer-dist

      - name: Prepare Environment
        run: |
          cp .env.example .env
          php artisan key:generate --force

      - name: Execute Tests
        run: php artisan test

本番環境での再生成リスクと重大な注意点

運用中の本番環境で php artisan key:generate を実行してキーを変更すると、旧キーで暗号化されていたすべてのデータが復号不能になります。

影響を受ける機能発生する障害・現象対処・予防策
データベース暗号化カラムCrypt::encrypt() や Eloquent の暗号化キャストで保存したデータが復号できず例外が発生する(実質的なデータ破損)キー再生成前に旧キーで全件復号し、新キーで再暗号化するバッチスクリプトを実行する
ユーザーセッション保存されていた全ユーザーのセッションが無効化され、強制ログアウトが発生するメンテナンス時間帯に実施し、再ログインを促す
Cookie・CSRFトークンCookie署名の不整合により 419 Page Expired エラーが多発するブラウザCookieのクリアまたは再アクセスで解消
署名付きURL / パスワードリセット送信済みのメール認証リンクやパスワード再設定リンクが無効になるユーザーにリンクの再発行を案内する

本番環境でキーを変更する必要が生じた場合は、Laravel 11 / 12 で導入された APP_PREVIOUS_KEYS による安全なキーローテーション手法を活用してください。詳しい仕組みと移行手順はLaravelのAPP_KEYとは?暗号化の仕組み・変更時の影響と安全な生成・管理ガイドで詳しく解説しています。

設定が反映されない場合の対処(キャッシュクリア)

キーを手動で変更した場合や key:generate 実行後にエラーが解消しない場合、設定ファイルがキャッシュされている可能性があります。本番環境や最適化済みの環境では、必ず以下のコマンドで設定キャッシュをクリア・再生成してください。

# 設定キャッシュをクリア
php artisan config:clear

# または全キャッシュを一括クリア
php artisan optimize:clear

# (本番環境の場合)キャッシュを再作成
php artisan config:cache

テストコード例(Pest / PHPUnit)

CI環境などで APP_KEY が正常に設定されているかを検証するテストコードです。

// Pest でのテスト例
it('has a valid application encryption key', function () {
    expect(config('app.key'))
        ->not->toBeEmpty()
        ->and(config('app.key'))->toStartWith('base64:');
});

トラブルシューティング(エラー別解決策)

エラーメッセージ / 症状主な原因解決策
RuntimeException: No application encryption key has been specified..env の APP_KEY が空、または .env ファイル自体が存在しないcp .env.example .env を実行後、php artisan key:generate を実行する
The MAC is invalid. / The payload is invalid.暗号化時と異なる APP_KEY で復号を試みた元の APP_KEY に戻すか、Laravel 11以降であれば APP_PREVIOUS_KEYS に旧キーを追加する
Permission denied(.envへの書き込み失敗)実行ユーザーに .env の書き込み権限がないchmod 644 .env または chown で権限を修正するか、--show でキーを取得して手動設定する
本番環境で実行時に停止するAPP_ENV=production による確認プロンプトスクリプトやCIからの実行時は --force オプションを付与する

よくある質問(FAQ)

Q1. 誤って .env を Git にプッシュしてしまった場合はどうすればいいですか?

A. 公開されたキーは漏洩したものとみなし、直ちに php artisan key:generate --force で再発行してください。また、Git履歴から該当コミットを削除(git filter-repo や BFG Repo-Cleaner 等を使用)し、.gitignore に .env が指定されているか確認します。キー変更により既存セッションは切断されるため注意してください。

Q2. 開発環境・ステージング環境・本番環境で同じキーを使っても良いですか?

A. 絶対に避けてください。同じキーを使い回すと、開発環境のデータベースダンプが漏洩した場合に本番環境の暗号化データまで復号されてしまうリスクが生じます。環境ごとに必ず個別のキーを発行してください。

Q3. APP_KEY を紛失した場合、暗号化データは復元できますか?

A. 復元できません。AES-256 暗号は鍵がない状態での復号が数学的に極めて困難であるため、キーを紛失したデータは二度と取り出せなくなります。.env のバックアップや Secret Manager での保管を徹底してください。

まとめ・関連記事

php artisan key:generate は、Laravel アプリケーションの暗号化・セキュリティを担保するための最も基本的かつ重要なコマンドです。

  • プロジェクト作成時や新規環境構築時には必ず一度実行する
  • コンテナやCI/CD環境では --show や --force を適切に使い分ける
  • 本番環境での安易な再生成は避け、キー変更時は APP_PREVIOUS_KEYS によるローテーションを行う

関連するおすすめ記事:

参考リンク

レン (Wren)

こんにちは。レンです。

Laravelのコードの森に住んでいる、小さな案内役です。
ルーティングの枝やクラスの影を歩きながら、コードの流れや仕組みを眺めています。

このサイトでは、Laravelの基本から実装のコツまで、開発で役立つポイントを静かに整理しています。
難しいことを増やすのではなく、コードの見通しが少し良くなるヒントを届けるのが役目です。

「この処理はどこに書くのがいいのか」
「Laravelではどう考えると整理できるのか」

そんな疑問に、小さなメモを残すような気持ちで記事を書いています。

コードを書いている途中で迷ったとき、
このサイトが少し立ち止まって整理できる場所になればうれしいです。

レン (Wren)をフォローする