ローカルでの開発に HTTPS を使用する

ほとんどの場合、開発目的では http://localhost は HTTPS と同様に動作します。ただし、特別なケース(カスタム ホスト名を使用する場合や、ブラウザ間でセキュア Cookie を使用する場合など)では、本番環境でのサイトの動作を正確に表すために、開発サイトを HTTPS のように動作するように明示的に設定する必要があります。(本番環境のウェブサイトで HTTPS を使用していない場合は、HTTPS に切り替えることを優先してください)。

このページでは、HTTPS を使用してサイトをローカルで実行する方法について説明します。

簡単な手順については、mkcert クイック リファレンスをご覧ください。**

mkcert を使用して HTTPS でサイトをローカルで実行する(推奨)

ローカル開発サイトで HTTPS を使用して https://localhost または https://mysite.example(カスタム ホスト名)にアクセスするには、デバイスとブラウザが信頼するエンティティ(信頼できる 認証局(CA)と呼ばれます)によって署名された TLS 証明書が必要です。 ブラウザは、HTTPS 接続を確立する前に、開発サーバーの証明書が信頼できる CA によって署名されているかどうかを確認します。

証明書の作成と署名には、mkcert、 クロスプラットフォーム CA を使用することをおすすめします。その他の便利な オプションについては、HTTPS でサイトをローカルで実行する: その他のオプションをご覧ください。

多くのオペレーティング システムには、 opensslなどの証明書を作成するためのライブラリが含まれています。ただし、mkcert よりも複雑で信頼性が低く、必ずしもクロスプラットフォームではないため、大規模なデベロッパー チームにとってはアクセスしにくいものとなっています。

設定

  1. mkcert をインストールします(1 回のみ)。

    オペレーティング システムに mkcert をインストールする手順 に沿って操作します。たとえば、macOS の場合:

    brew install mkcert
    brew install nss # if you use Firefox
    
  2. mkcert をローカルのルート CA に追加します。

    ターミナルで、次のコマンドを実行します。

    mkcert -install
    

    これにより、ローカル認証局(CA)が生成されます。 mkcert で生成されたローカル CA は、デバイス上でローカル でのみ信頼されます。

  3. mkcert で署名されたサイトの証明書を生成します。

    ターミナルで、サイトのルート ディレクトリまたは証明書を保存するディレクトリに移動します。

    次のコマンドを実行します。

    mkcert localhost
    

    mysite.example などのカスタム ホスト名を使用している場合は、次のコマンドを実行します。

    mkcert mysite.example
    

    このコマンドは次の 2 つの処理を行います。

    • 指定したホスト名の証明書を生成します。
    • mkcert に証明書の署名を許可します。

    これで、証明書が準備され、ブラウザがローカルで信頼する認証局によって署名されました。

  4. 作成した TLS 証明書を使用して HTTPS を使用するようにサーバーを構成します。

    この方法の詳細はサーバーによって異なります。いくつかの例を次に示します。

    👩🏻‍💻 node の場合:

    server.js{PATH/TO/CERTIFICATE...}{PORT} を置き換えます):

    const https = require('https');
    const fs = require('fs');
    const options = {
      key: fs.readFileSync('{PATH/TO/CERTIFICATE-KEY-FILENAME}.pem'),
      cert: fs.readFileSync('{PATH/TO/CERTIFICATE-FILENAME}.pem'),
    };
    https
      .createServer(options, function (req, res) {
        // server code
      })
      .listen({PORT});
    

    👩🏻‍💻 http-server の場合:

    次のようにサーバーを起動します({PATH/TO/CERTIFICATE...} を置き換えます)。

    http-server -S -C {PATH/TO/CERTIFICATE-FILENAME}.pem -K {PATH/TO/CERTIFICATE-KEY-FILENAME}.pem
    

    -S は HTTPS でサーバーを実行し、-C は証明書を設定し、-K は鍵を設定します。

    👩🏻‍💻 React 開発用サーバーの場合:

    次のように package.json を編集し、{PATH/TO/CERTIFICATE...} を置き換えます。

    "scripts": {
    "start": "HTTPS=true SSL_CRT_FILE={PATH/TO/CERTIFICATE-FILENAME}.pem SSL_KEY_FILE={PATH/TO/CERTIFICATE-KEY-FILENAME}.pem react-scripts start"
    

    たとえば、サイトのルート ディレクトリに localhost の証明書を作成した場合:

    |-- my-react-app
        |-- package.json
        |-- localhost.pem
        |-- localhost-key.pem
        |--...
    

    start スクリプトは次のようになります。

    "scripts": {
        "start": "HTTPS=true SSL_CRT_FILE=localhost.pem SSL_KEY_FILE=localhost-key.pem react-scripts start"
    

    👩🏻‍💻 その他の例:

  5. ブラウザで https://localhost または https://mysite.example を開き、HTTPS を使用してサイトをローカルで実行していることを確認します。ブラウザは mkcert をローカル認証局として信頼するため、ブラウザの警告は表示されません。

mkcert クイック リファレンス

mkcert クイック リファレンス

HTTPS を使用してローカル開発サイトを実行するには:

  1. mkcert を設定します。

    まだインストールしていない場合は、mkcert をインストールします(macOS の場合など)。

    brew install mkcert

    Windows と Linux の手順については、mkcert をインストールする をご覧ください。

    次に、ローカル認証局を作成します。

    mkcert -install
  2. 信頼できる証明書を作成します。

    mkcert {YOUR HOSTNAME e.g. localhost or mysite.example}

    これにより、mkcert が自動的に署名する有効な証明書が作成されます。

  3. ステップ 2 で作成した HTTPS と証明書を使用するように開発用サーバーを構成します。

これで、警告なしでブラウザで https://{YOUR HOSTNAME} にアクセスできるようになりました。

</div>

HTTPS でサイトをローカルで実行する: その他のオプション

証明書を設定する他の方法を次に示します。一般に、mkcert を使用するよりも複雑またはリスクが高くなります。

自己署名証明書

mkcert などのローカル認証局を使用せず、証明書に自分で署名する こともできます。この方法にはいくつかの落とし穴があります。

  • ブラウザは認証局として信頼しないため、手動で回避する必要がある警告が表示されます。Chrome では、フラグ #allow-insecure-localhostを使用して、 localhostでこの警告を自動的に回避できます。
  • 安全でないネットワークで作業している場合は安全ではありません。
  • mkcert などのローカル CA を使用するよりも簡単または高速であるとは限りません。
  • 自己署名証明書は、信頼できる証明書とまったく同じように動作するわけではありません。
  • ブラウザ コンテキストでこの手法を使用していない場合は、サーバーの証明書検証を無効にする必要があります。本番環境で再度有効にしないと、セキュリティ上の問題が発生します。
自己署名証明書が使用されたときにブラウザに表示される警告のスクリーンショット。
自己署名証明書を使用した場合にブラウザに表示される警告。

証明書を指定しない場合、ReactVue の開発用サーバーの HTTPS オプションは、自己署名証明書を内部で作成します。これは迅速ですが、自己署名証明書のブラウザの警告やその他の落とし穴と同じです。幸い、フロントエンド フレームワークの組み込み HTTPS オプションを使用して、mkcert などで作成したローカルで信頼できる証明書を指定できます。詳細については、 React での mkcert の例をご覧ください。

ブラウザが自己署名証明書を信頼しないのはなぜですか?

HTTPS を使用してローカルで実行中のサイトをブラウザで開くと、ブラウザはローカル開発サーバーの証明書を確認します。証明書に自分で署名したことがわかると、信頼できる認証局として登録されているかどうかを確認します。登録されていないため、ブラウザは証明書を信頼できず、接続が安全でないことを示す警告が表示されます。続行すると HTTPS 接続は作成されますが、自己責任で行う必要があります。

ブラウザが自己署名証明書を信頼しない理由: 図。
ブラウザが自己署名証明書を信頼しない理由。

通常の認証局によって署名された証明書

公式 CA によって署名された証明書を使用することもできます。これには次の問題があります。

  • mkcert などのローカル CA 手法を使用する場合よりも、設定作業が多くなります。
  • 管理している有効なドメイン名を使用する必要があります。つまり、次の目的で公式 CA を使用することはできません。

リバース プロキシ

HTTPS を使用してローカルで実行中のサイトにアクセスするもう 1 つの方法は、 リバース プロキシ (たとえば ngrok) を使用することです。これには次のリスクがあります。

  • リバース プロキシ URL を共有したユーザーは、ローカル開発サイトにアクセスできます。これはクライアントにプロジェクトをデモする際に役立ちますが、権限のないユーザーが機密情報を共有する可能性もあります。
  • 一部のリバース プロキシ サービスでは使用料金が発生するため、料金がサービスの選択に影響する可能性があります。
  • ブラウザの新しいセキュリティ対策は、これらのツールの 動作に影響する可能性があります。

Chrome で mysite.example などのカスタム ホスト名を使用している場合は、フラグを使用して、ブラウザに mysite.example を安全と見なすように強制できます。次の理由から、これを行うことは避けてください

  • mysite.example が常にローカル アドレスに解決されることを 100% 確認する必要があります。そうしないと、本番環境の認証情報が漏洩する可能性があります。
  • このフラグは Chrome でのみ機能するため、ブラウザ間でデバッグすることはできません。

すべてのレビュー担当者と貢献者(特に Ryan Sleevi、 Filippo Valsorda、Milica Mihajlija、Rowan Merewood)のご協力とフィードバックに感謝いたします。🙌

ヒーロー画像の背景: @ananduUnsplash)による(編集済み)。