OpenSSLで証明書を作成してMAMPのローカル環境にSSL設定。
MAMPのローカル環境でSSLを有効化する設定の作業で色々とエラーが出たので、Google Chrome、Firefox、Safariで動作確認した方法のメモ。
ターミナルでコマンドラインツールのOpenSSLを使って自分でSSL用の鍵と証明書を作成して、Apacheとブラウザに証明書を設置してSSL化する方法。
※ 必要となるSSL通信の基礎知識は前の記事を参照。
MAMP環境でSSL化に必要な作業
- OpenSSLを使用して「CA証明書」と「サーバー証明書」を発行。
- MAMAPのWebサーバーのApacheの設定ファイルにSSLを有効化するディレクティブを記述。
- ブラウザの証明書ストアに、自分で発行した「CA証明書」をルート証明書として追加。
※ CA(Certification Authority) : 認証局。
macOS High Sierra バージョン 10.13.6
MAMP Version 6.6
LibreSSL 2.2.7
Google Chrome バージョン: 95.0.4638.69
Firefox 94.0.1
Safari バージョン13.1.2 で確認。
Google ChromeとFirefoxの対応
ChromeとFirefoxの両方に対応するためには、証明書の中にそれぞれ以下の設定の記述が必要。
- ルートCA証明書 : 「CA:TRUE」
- サーバー証明書 : 「CA:FALSE」と「サブジェクトの別名」(SAN : Subject Alternative Name)
※ 証明書の拡張領域に記述できる。
[ Google Chromeでのエラー ]
「SAN」の情報が設定されていない証明書だと、Chromeでは、
- 「このサーバーのセキュリティ証明書で SAN(サブジェクトの別名)が指定されていません」
というエラーが表示されてSSL接続できない。
通常、ブラウザは「実際にリクエストされたドメイン」と「サーバー証明書」内の「共通名」(CN : Common Name)の項目の記述が一致するかを検証しているが、Chromeの場合は、「CN」ではなく「SAN」でチェックしている。
※ Chromeに対応するには、「サーバー証明書」に「SAN」の項目設定が必要。
SNA(Subject Alternate Name)
サブジェクトの別名。サーバー証明書を有効にするすべてのFQDN(完全修飾ドメイン)を記述しておく項目。主に、サーバー証明書を複数のドメインやIPアドレスで有効にしたい場合に使用する。
[ Firefoxでのエラー ]
(Chromeに対応するために)「SAN」の項目を追加した証明書をFirefoxの「ルート証明書」に使おうとすると、
- 「この証明書は認証局の証明書ではないため、認証局の一覧には追加できません。」
と表示され、Firefoxの証明書ストアに追加できない。(「SAN」の設定によって証明書の拡張領域の情報をチェックするようになるが、「Basic Constraints」の項目は設定していないので、「CA:FALSE」とされ「サーバー証明書」扱いになるため。)
これに対処するために「CA証明書」であることを示す「CA:TRUE」を設定すればFirefoxの証明書ストアに追加できるが、その証明書を「サーバー証明書」にも使い回すと、
- 「MOZILLA_PKIX_ERROR_CA_CERT_USED_AS_END_ENTITY」
とエラーが表示されてサイトにアクセスできない。(設定に「CA証明書」(CA:TRUE)であると明示したので、「サーバー証明書」としては認められなくなる。)
※ Firefoxに対応するには、「ルートCA証明書」に「CA:TRUE」、「サーバー証明書」に「CA:FALSE」の項目設定が必要。(証明書をひとつだけ作成して「CA証明書」と「サーバー証明書」の両方に使い回す方法では対応できない。)
OpenSSLについて
OpenSSLは、業界標準でSSL通信の運用に使用されるオープンソースのソフトウェアで、MacにはOpenSSLからフォーク(派生)したLibreSSLがインストールされている。
※ OpenSSLの公式サイト。
※ LibreSSLの公式サイト。
※ OpenBSDによる「openssl」コマンドのマニュアル。
OpenSSL(LibreSSL)のバージョンを確認するコマンド。(オプション「-a」で、詳細情報を表示。)
openssl version -a
「openssl」コマンドの実行ファイルの場所を確認するコマンド。
which openssl
LibreSSLの最新バージョンをHomebrewでインストールするコマンド。
※ そのままではデフォルトでインストールされている方のLibreSSLが実行されてしまうので、Homebrewでインストールした方の実行ファイルにパスを変更する必要がある。
※ Homebrewについては前の記事を参照。
※ LibreSSLではなくOpenSSLを使用したい場合は「openssl」を指定してインストール。
brew install libressl
「openssl」コマンドで使用可能なサブコマンドの一覧を表示。
openssl -help
「openssl」コマンドの基本的な記述書式。
openssl サブコマンド [オプション] [引数]
※ コマンド実行時に設定の値が必要な場合、デフォルトの「config」ファイルが使用される。(自分で設定をカスタマイズした「config」ファイルを用意して指定することもできる。)
※ サブコマンドのオプションで設定値を明示した場合は、「config」ファイルでの設定よりも優先される。
※ 値の指定が必要なサブコマンドを実行した場合に、コマンドのオプションでも「config」ファイルでも値が与えられていなければエラーになる。
証明書の発行
「ルートCA証明書」と「サーバー証明書」を発行する作業。
- ルートCA証明書 : 認証局(今回は自分)がルート認証局であることを証明するために自己署名した証明書。(クライアントの証明書ストアに設置する。)
- サーバー証明書 : ドメイン(今回の環境では「localhost」)の所有権者であることを証明するために認証局が発行した証明書。(サーバーに設置する。)
ローカル運用なので、申請も発行もターミナルでOepnSSLを利用して自分で行う。
※ OpenSSLでは、公開鍵証明書の標準規格の「X.509」フォーマットで「証明書」が作成される。(現行はバージョン3なので、「X.509 v3証明書」とも呼ばれる。)
- 管理用のフォルダを作成。
- 「CAの秘密鍵」を作成。
- 「CAの秘密鍵」を使用して「CAの証明書署名要求」(CSR : Certificate Signing Request)を作成。
- 「CAの秘密鍵」で「CAのCSR」に自己署名して「CA証明書」を発行。
- 簡易なCAの環境を構築。
- 「サーバーの秘密鍵」を作成。
- 「サーバーの秘密鍵」を使用して「サーバーのCSR」を作成。
- 「CAの秘密鍵」と「CA証明書」を使用して「サーバーのCSR」にCAとして署名して「サーバー証明書」を発行。
(1) 生成する各ファイルの保管先となるディレクトリを作成
管理しやすいように、生成するすべてのファイルを保管するためのフォルダを作成する。
- Apacheのディレクトリ内に任意のディレクトリを作成。(ここでは「ag2ssl」。)
- 作成したディレクトリに移動。( 以降の作業はすべてこのディレクトリ上で実行する。)
mkdir -p /Applications/MAMP/conf/apache/ag2ssl #ディレクトリを作成
cd /Applications/MAMP/conf/apache/ag2ssl #作成したディレクトリに移動
mkdir : ディレクトリを作成するコマンド。指定した名前のディレクトリを作成する。オプション「-p」で、指定パスに含まれるサブディレクトリが存在しなければ同時に作成する。
cd : カレントディレクトリを変更するコマンド。指定したディレクトリがカレントディレクトリになる。ディレクトリの指定が無ければ、ホームディレクトリがカレントディレクトリになる。
(2) 「CAの秘密鍵」を作成
「openssl genrsa」コマンドを使用して、鍵長が2048bitのRSA暗号の「秘密鍵」を生成し、任意の名前(ここでは「ag2ca.key」)でファイルにして出力する。
※ 自分でローカル運用するだけなので、鍵長は特に気にせず現在の認証局で一般的とされる2048bitを指定。(「openssl genrsa」コマンドのデフォルトの鍵長は2048bitなので、下記の場合は鍵長を指定しなくても同じ。)
openssl genrsa -out ag2ca.key 2048
openssl genrsa : RSA形式の秘密鍵を生成するコマンド。生成する暗号鍵のサイズ(ビット数)を指定する場合は必ず最後のオプションとして指定する。(鍵サイズのデフォルトは「2048」。)
オプション「-out」 : 指定のファイルとして出力する。(オプション指定無しのデフォルトは標準出力。)
※ 上記のようなサブコマンドのオプションを使わずに、リダイレクトで、出力を標準出力から指定したファイルに変更する方法。(結果は上記と同じ。)
openssl genrsa > ag2ca.key
> : 標準出力をリダイレクト。出力先を標準出力から指定のファイルへ変更する。指定のファイルが存在しない場合は新規作成して出力し、ファイルが存在する場合は新しい内容ですべてを上書きして保存。
(3) 「CAの証明書署名要求」(CSR)を作成
「openssl req」コマンドを使用して、「CAの秘密鍵」(上記で作成した「ag2ca.key」)を使って「CSR」を生成し、任意の名前(ここでは「ag2ca.csr」)でファイルにして出力する。
「openssl req」コマンドを実行すると、「CSR」に必要な情報を対話型で求められるので入力する。
- 自分で認証して自分だけが使うローカル運用なので、入力は任意。
- 「CA証明書」の場合、「Organization Name」だけは必須の項目。
- 他の情報も入力しておけば、証明書ストアに追加したあとで詳細情報として確認できる。
- 情報を入力しない場合は、未入力のまま「enter」キーで決定して次へ進める。(デフォルトの「config」ファイルに値があれば使用される。)
- 最後の「password」(下記では未入力)を「enter」キーで決定すると「ag2ca.csr」が作成される。
openssl req -new -key ag2ca.key -out ag2ca.csr
#実行結果
Country Name (2 letter code) []:JP
State or Province Name (full name) []:Tokyo
Locality Name (eg, city) []:
Organization Name (eg, company) []:AG2WORKS
Organizational Unit Name (eg, section) []:
Common Name (eg, fully qualified host name) []:
Email Address []:
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
openssl req : CSRに関する操作(生成や内容の確認など)を行うコマンド。
オプション「-new」 : CSRを新規に作成。
オプション「-key」 : 指定の秘密鍵を入力する。
オプション「-out」 : 指定のファイルとして出力する。(オプション指定無しのデフォルトは標準出力。)
オプション「-subj」 : サブジェクトフィールドに指定の情報を入力し、CSRの出力時に設定する。
※ 上記の対話型での情報入力が面倒な場合は、「openssl req」コマンドのオプション「-subj」で必要なものだけ指定しておけば、対話型での入力を省略できる。
(「-subj “/C=国/ST=都道府県/L=市区町村/O=組織名/OU=部署名/CN=コモンネーム”」)
openssl req -new -key ag2ca.key -out ag2ca.csr -subj "/C=JP/ST=Tokyo/O=AG2WORKS"
(4) 「CA証明書」を作成(発行)
「CAのCSR」に「CAの秘密鍵」で自己署名して「自己署名証明書」を発行する。
※ 自己署名の証明書なので「ルートCA証明書」としてのみ使用可能。
[ 証明書の拡張領域に追加する情報を用意 ]
Firefoxに対応するため、証明書の拡張領域の記述で「CA証明書」であることを明示しておく必要がある。
記述したい設定(「basicConstraints = critical,CA:true」)を、追加情報として任意のテキストファイルにして別途用意しておく。(ここでは「ag2ca.txt」。)
- Basic Constraints : 基本制約。
- critical : 基本制約に記述された制約を厳格に尊守する。
- CA:TRUE : CA証明書であることを明示。(「CA:FALSE」ならCA証明書ではないことを明示。)
※ 「X.509証明書」の拡張領域に追加できる情報についてのmozillaの公式ドキュメント。
※ 拡張領域の追加情報は、証明書を作成する「openssl x509」コマンドのオプション「-extfile」で外部のテキストファイルとして入力できる。(オプションを使わずに、カスタマイズした「config」ファイルでも設定できる。)
※ 下記のコマンドの代わりに、Finder上で手動でファイルを新規作成してテキストエディターで編集しても同じ。
echo basicConstraints = critical,CA:true > ag2ca.txt
echo : 指定したメッセージを出力するコマンド。
> : 標準出力をリダイレクト。出力先を標準出力から指定のファイルへ変更する。指定のファイルが存在しない場合は新規作成して出力し、ファイルが存在する場合は新しい内容ですべてを上書きして保存。
[ CA証明書の発行 ]
「openssl x509」コマンドを使用して、「CAの秘密鍵」で「CAのCSR」に自己署名をして「CA証明書」を生成する。
- 「有効期限」を設定。(下記では3650日に設定。)
- 拡張領域に追加する情報を持った入力ファイルを指定。(ここでは「ag2ca.txt」。)
- 「CAの秘密鍵」を指定。(ここでは「ag2ca.key」。)
- 「CAのCSR」を指定。(ここでは「ag2ca.csr」。)
- 出力ファイルの名前を指定。(ここでは「ag2ca.crt」。)
※ ルート証明書に許容される有効期限はサーバー証明書よりもかなり長いが、最近は短縮される傾向にあるようなので、ブラウザやOSのバージョンアップをしてからエラーが発生するようになった場合は、まず有効期限を短縮して発行し直して確認する。
openssl x509 -req -days 3650 -extfile ag2ca.txt -signkey ag2ca.key -in ag2ca.csr -out ag2ca.crt
openssl x509 : 証明書に関する操作(内容を表示したり、フォーマットを変更したりなど)を行う多目的なコマンド。
オプション「-req」 : 証明書の代わりにCSRを入力できるようにする。
オプション「-days」 : 指定の日数を証明書の有効期限に設定。
オプション「-extfile」 : 指定のファイルを証明書の拡張領域に入力。
オプション「-signkey」 : 指定の秘密鍵で入力ファイルに自己署名する。(入力ファイルがCSRの場合、CSR内にある名前を使用して自己署名証明書が生成される。)
オプション「-in」 : 指定のファイルを入力する。
オプション「-out」 : 指定のファイルとして出力する。(オプション指定無しのデフォルトは標準出力。)
[ 証明書の内容を確認 ]
「openssl x509」コマンドを使用して、作成した「CA証明書」の内容を念のために確認する。
CSR作成時に入力した情報、有効期限、公開鍵、署名データなどが表示される。
※ 正しく発行できていれば「ag2ca.txt」と「ag2ca.csr」は不要なので削除。
openssl x509 -in ag2ca.crt -text -noout
オプション「-text」 : 指定の証明書の内容をテキスト形式で表示する。
オプション「-noout」 : 出力ファイルに出力しない。
(5) CA環境を構築
自分がCAとなって「openssl ca」コマンドを使用して「サーバー証明書」を発行するので、事前に簡易なCA環境を構築する。
※ 「openssl ca」コマンドは、最小限のCAアプリケーション機能を提供するコマンド。
[ CA環境に必要なファイル ]
「openssl ca」コマンドで証明書を発行するには下記の3つが必要。
- 発行する証明書の「シリアルナンバー」(16進数)を管理するテキストファイル。
- 証明書の発行(または失効)を記録する「データベース」となるテキストファイル。
- 「openssl ca」コマンドに必要な設定の値が記述されている「config」ファイル。
※ 「シリアルナンバー」のファイルに記述されている番号が、次に発行する証明書のシリアルナンバーとして使用される。(「openssl ca」コマンドで証明書を発行すると、シリアルナンバーは自動的にインクリメントされる。)
※ 「データベース」のファイルには、発行(失効)処理した証明書のシリアルナンバー、サブジェクトの内容などが自動的に記述される。
[ CA環境構築の各ファイルを作成 ]
上述の必要なファイルを、ターミナルからコマンドで生成。
- CA環境構築に必要なファイルをまとめて保管するディレクトリを作成。(ここでは「ag2ca」。)
- 初期値「01」を記述したシリアルナンバーの管理ファイルを作成。(ここでは「ag2caserial」。)
- データベース用のファイルを作成。(ここでは「ag2cadb」。)
- 「config」ファイルを作成。(ここでは「ag2openssl.cnf」。)
※ シリアルナンバーに「1」と記述しておくと、「openssl ca」コマンド実行時にエラーになったので「01」と記述。(2桁以上だとエラーにならないが1桁だとエラーになる。おそらく16進数での記述のため。)
mkdir ag2ca #ディレクトリを作成
echo 01 > ag2ca/ag2caserial #シリアルナンバー用のファイルを作成
touch ag2ca/ag2cadb #データベース用のファイルを作成
touch ag2ca/ag2openssl.cnf #「config」ファイルを作成
mkdir : ディレクトリを作成するコマンド。指定した名前のディレクトリを作成する。オプション「-p」で、指定パスに含まれるサブディレクトリが存在しなければ同時に作成する。
echo : 指定したメッセージを出力するコマンド。
> : 標準出力をリダイレクト。出力先を標準出力から指定のファイルへ変更。指定のファイルが存在しない場合は新規作成して出力し、ファイルが存在する場合は新しい内容ですべてを上書きして保存。
touch : 指定したディレクトリやファイルのタイムスタンプを変更するコマンド。指定したファイルが存在しない場合はファイルを新規作成する。
[ 「config」ファイルに設定内容を記述 ]
作成した「config」ファイル(「ag2openssl.cnf」)に、「openssl ca」コマンドで使用する設定と値を記述しておく。
- 「openssl ca」コマンドを実行すると、「config」ファイル内の「[ ca ]」セクションが読み込まれる。(「openssl」コマンドのサブコマンド名に該当するセクションの記述が読み込まれる。)
- 読み込まれたセクション内の設定値に他のセクション名が指定されていれば、さらにそのセクションの設定が読み込まれる。
- ChromeとFirefoxに対応するために、「x509_extensions」の項目に以下の2つの設定が必要。(「X.509 v3」フォーマットの拡張領域へ記述される。)
Chrome対応 : 「subjectAltName」の値に自分のローカル環境でのドメインとIPアドレスを記述。
Firefox対応 : 「basicConstraints」の値に「サーバー証明書」であることを明示する「CA:false」を記述。
ターミナル上でVimなどのCUIエディターを使用するか、GUIエディターで「ag2openssl.cnf」を開いて下記を記述して保存する。
※ 下記は、「openssl ca」コマンドでエラーが出ないために最低限必要な設定だけの記述。
※ 「openssl ca」コマンドを実行して証明書を発行(後述)すると、「new_certs_dir」の項目で指定してあるディレクトリに、シリアルナンバーでのファイル名でPEM形式の証明書(「01.pem」など)が自動的に生成される。(「openssl ca」コマンドのオプション「-out」を指定すれば、このシリアルナンバーの証明書の複製が指定したファイル名で出力生成される。)
[ ca ]
default_ca = CA_default
[ CA_default ]
dir = /Applications/MAMP/conf/apache/ag2ssl/ag2ca
new_certs_dir = $dir
serial = $dir/ag2caserial
database = $dir/ag2cadb
default_md = sha256
policy = policy_anything
x509_extensions = v3_ca
[ policy_anything ]
countryName = optional
stateOrProvinceName = optional
localityName = optional
organizationName = optional
organizationalUnitName = optional
commonName = supplied
emailAddress = optional
[ v3_ca ]
subjectAltName = DNS:localhost, IP:127.0.0.1
basicConstraints = CA:false
(6) サーバーの秘密鍵を作成
「CAの秘密鍵」のときと同じように、「サーバーの秘密鍵」を生成して任意の名前(ここでは「server.key」)でファイルにして出力する。
openssl genrsa -out server.key 2048
(7) サーバーのCSRを作成
「CAのCSR」のときと同じように、「サーバーの秘密鍵」(「server.key」)を使って「サーバーのCSR」を生成し、任意の名前(ここでは「server.csr」)でファイルにして出力する。
このときに、すべての入力情報を「CAのCSR」と全く同じ内容で設定すると、「発行した証明書の申請者」とそれを認証している「CA証明書」(認証局)が同一となるため、このあとで発行する証明書が「自己署名証明書」扱いになってしまい、「サーバー証明書」としては使えなくなる。(最低1つ以上の項目で入力内容を変える必要がある。ここでは「CN」の有無が異なる。)
- 「サーバー証明書」のCSRの場合、「Common Name」は必須の項目。
- 「Common Name」は、実際に「サーバー証明書」を設置するサイトのドメインを入力する必要がある。(今回は「localhost」。)
- 最後の「password」(下記では未入力)を「enter」キーで決定すると「server.csr」が作成される。
※ 「Common Name」とは、サイトURLの「ドメイン」や「IPアドレス」部分のこと。(サブドメインを含める。)
※ ブラウザは、SSL通信の場合に「アドレスバーに入力されたドメイン」と「接続先のサーバー証明書にあるCommon Name」が一致しているかを検証するので、「Common Name」の設定は必須。
openssl req -new -key server.key -out server.csr
#実行結果
Country Name (2 letter code) []:JP
State or Province Name (full name) []:Tokyo
Locality Name (eg, city) []:
Organization Name (eg, company) []:AG2WORKS
Organizational Unit Name (eg, section) []:
Common Name (eg, fully qualified host name) []:localhost
Email Address []:
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
(8) 「サーバー証明書」を作成(発行)
「openssl ca」コマンドを使用して、自分がCAとなって「サーバー証明書」を発行する。
- 「有効期限」を設定。(下記では3650日に設定。)
- 「サーバーのCSR」を指定。(ここでは「server.csr」。)
- 「CAの秘密鍵」を指定。(ここでは「ag2ca.key」。)
- 「CAの証明書」を指定。(ここでは「ag2ca.crt」。)
- 出力ファイルの名前を指定。(ここでは「server.crt」。)
- 「コマンドの設定ファイル」を指定。(ここでは「ag2openssl.cnf」。)
※ ブラウザベンダーなどが取り決めている「サーバー証明書」の最大有効期限は年々短縮され、現状、「2020年9月1日以降に発行された証明書で有効期限が398日を超えるものは無効」とされている。(自分の環境では、有効期限を3650日に設定した証明書でもSSL接続できているので、実際のブラウザの実装状況は不明。)
openssl ca -days 3650 -in server.csr -keyfile ag2ca.key -cert ag2ca.crt -out server.crt -config ag2ca/ag2openssl.cnf -batch
openssl ca : 最小限のCAアプリケーション機能を提供するコマンド。
オプション「-days」 : 指定の日数を証明書の有効期限に設定。
オプション「-in」 : 指定のファイルを入力する。
オプション「-keyfile」 : 指定の秘密鍵で入力ファイルに署名する。
オプション「-cert」 : 指定のCA証明書を入力する。
オプション「-out」 : 指定のファイルとして出力する。(オプション指定無しのデフォルトは標準出力。)
オプション「-config」 : 指定の設定ファイルをデフォルトの設定ファイルの代わりに読み込む。
オプション「-batch」 : Batchモードを指定。確認アラートを出さずに、すべての証明書を自動的に認証するモード。(オプション指定無しのデフォルトでは署名と認証の確認が出る。)
[ 証明書の失効処理 ]
「openssl ca」コマンドで証明書を発行したあとに、もう一度同じ内容で発行しようとすると、
- 「failed to update database TXT_DB error number 2」
というコマンドエラーになって、発行できない。(構築したCA環境のデータベース「ag2cadb」ファイルの発行記録に、サブジェクトの内容が全く同じ証明書があると発行できない。)
「openssl ca」コマンドのオプション「-revoke」を使って、発行した証明書を指定して失効処理すれば、同じ内容でも再度発行できるようになる。(失効処理されるだけで証明書ファイルの削除はされない。)
※ データベースでシリアルナンバーを確認して、シリアルナンバーで発行されている方の証明書で失効処理しても同じ。
※ 失効処理をしなくても、テキストエディターでデータベース内の発行記録を手動で編集・削除しても対処できる。
openssl ca -revoke server.crt -keyfile ag2ca.key -cert ag2ca.crt -config ag2ca/ag2openssl.cnf
#シリアルナンバーで複製されているファイルを指定する場合
openssl ca -revoke ag2ca/01.pem -keyfile ag2ca.key -cert ag2ca.crt -config ag2ca/ag2openssl.cnf
オプション「-revoke」 : 指定の証明書を失効させる。
[ 証明書の内容を確認 ]
「openssl x509」コマンドで、作成した「サーバー証明書」の内容を念のために確認する。
※ 正しく発行できていれば「server.csr」は不要なので削除。
openssl x509 -in server.crt -text -noout
Apacheの設定
MAMPで使用しているWebサーバーのApacheにSSLの設定をする作業。
以下の2つのApacheの設定ファイルを編集する。
- httpd.conf : Apacheの主要な設定が記述してあるテキストファイル。
- httpd-ssl.conf : ApacheのSSLに関する設定が記述してあるテキストファイル。
(1) 「httpd.conf」ファイルを編集
Apacheの「SSLの機能」を有効にする作業。
SSL設定ファイル(「httpd-ssl.conf」)を読み込むように「httpd.conf」ファイルに記述する。
- Apacheの設定ファイルの構文は、1行に1つのディレクティブ(命令コマンド)を「ディレクティブ名 設定値」の形式で記述する。
- コメントアウトは「#」。(ディレクティブのある行の末尾にコメントアウトは記述できない。)
[ 「httpd.conf」ファイルの記述を編集 ]
- 「Macintosh HD > アプリケーション > MAMP > conf > apache」ディレクトリにある「httpd.conf」ファイルを任意のエディターで開く。
- 「# Secure (SSL/TLS) connections」(今回の環境では625行目)の1行下、「httpd-ssl.conf」ファイルを読み込むディレクティブの行頭にある「#」を削除してコメントアウトを外す。
- 編集を保存してファイルを閉じる。
- MAMPのサーバーを停止して再度スタートすると、「httpd-ssl.conf」ファイルが読み込まれるようになる。
※ 初期状態の「httpd.conf」ファイルには、このディレクティブがコメントアウトした状態で既に記述されているので、コメントアウトを外して有効にする。
# Secure (SSL/TLS) connections
Include /Applications/MAMP/conf/apache/extra/httpd-ssl.conf
Include ファイルパス : Includeディレクティブ。指定した設定ファイルを読み込む。パスの指定には、絶対パス、相対パス(ServerRootディレクティブからの相対パス)、ワイルドカード(「*」)が使用できる。
(2) 「httpd-ssl.conf」ファイルを編集
Apacheに「サーバー証明書」と「サーバーの秘密鍵」を設定してSSLを有効にする作業。
初期状態の「httpd-ssl.conf」ファイルにはデフォルトの設定が記述されているので、自分の環境に合わせて、以下の記述を修正する。
- 「DocumentRoot」と「ServerName」を変更。(SSL用のバーチャルホストの設定。)
- 「サーバー証明書」のファイルパスを変更。
- 「サーバーの秘密鍵」のファイルパスを変更。
- バーチャルホスト機能で複数のドメインを使用している場合にはそれぞれの設定記述を追加。
1. 「DocumentRoot」と「ServerName」を変更。
ローカル環境で実際に使用している「ドメイン」とその「ルートディレクトリ」に変更する。
(今回の環境では「httpd-ssl.conf」ファイルの127行目。)
※ ログなど他の設定は任意。(不要ならコメントアウト。)
# General setup for the virtual host
DocumentRoot "/Applications/MAMP/htdocs"
ServerName localhost
# ServerAdmin you@example.com
# ErrorLog "/Applications/MAMP/Library/logs/error_log"
# TransferLog "/Applications/MAMP/Library/logs/access_log"
2. 「サーバー証明書」のファイルパスを変更。
自分で発行した「サーバー証明書」が配置してあるファイルパスに変更する。
(今回の環境では「httpd-ssl.conf」ファイルの158行目。)
SSLCertificateFile "/Applications/MAMP/conf/apache/ag2ssl/server.crt"
3. 「サーバーの秘密鍵」のファイルパスを変更。
自分で作成した「サーバーの秘密鍵」が配置してあるファイルパスに変更する。
(今回の環境では「httpd-ssl.conf」ファイルの168行目。)
SSLCertificateKeyFile "/Applications/MAMP/conf/apache/ag2ssl/server.key"
4. バーチャルホストで複数のドメインを使用している場合。
バーチャルホストで複数のドメインを使用している場合、SSL設定するドメインすべてにSSL有効化の記述が必要。(「httpd-ssl.conf」ファイル内の一番下など任意の場所に記述。)
※ それぞれのホスト名を「Common Name」にして発行したそれぞれのサーバー証明書を設定する必要がある。(構築したCA環境で発行する証明書のシリアルナンバーもそれぞれ異なる必要がある。)
※ MAMPのバーチャルホストの設定方法は前の記事を参照。
※ MAMPのポート設定に関しては前の記事を参照。
<VirtualHost *:443>
DocumentRoot "任意のディレクトリ"
ServerName 任意のドメイン
SSLEngine on
SSLCertificateFile "/Applications/MAMP/conf/apache/ag2ssl/server002.crt"
SSLCertificateKeyFile "/Applications/MAMP/conf/apache/ag2ssl/server002.key"
</VirtualHost>
5. MAMPを再起動。
変更した設定を反映させるために一度MAMPのサーバーを停止して再度スタートする。
ブラウザの証明書ストアに自分のCA証明書を追加
ブラウザの「証明書ストア」に自分で発行した「CA証明書」を追加して、自分を「ルート認証局」として登録する作業。
ブラウザが元々保有する「ルート証明書」には、自分で発行した「サーバー証明書」の発行元CA(自分)は登録されていないので、SSLリクエストがエラー表示になる。
「証明書ストア」に自分で発行した「CA証明書」を追加することで、自分で発行した「サーバー証明書」もブラウザが信頼できるようになり、SSL接続できるようになる。
※ ブラウザのエラー表示内の「詳細情報」から強制的に接続できるが、鍵マークにアラートが表示された状態になる。
(1) Chrome、Safariの場合
ChromeとSafariはOSの証明書ストアを使用しているのでmacOSの証明書ストアに追加する。
macOSの証明書ストアにCA証明書を追加する方法
- 「キーチェーンアクセス」を起動。(「Launchpad」 > 「その他」 > 「キーチェーンアクセス」)
- 左カラムのメニュー「システム」を選択。(左下カラムの「分類」で「証明書」を選択すれば表示を絞れる。)
- 自分のCA証明書ファイル(今回は「ag2ca.crt」)のアイコンをFinderで選択してメインカラムにドラッグ。
- OSのユーザーパスワードの入力を求められるので入力。
- 証明書に設定している組織名(またはホスト名)で一覧に表示されていることを確認する。
- 一覧の中から証明書をダブルクリックして詳細を開く。(別ウィンドウで開かれる。)
- 「信頼」の項目をクリックして開く。
- 一番上の「この証明書を信頼するとき」の項目を「常に信頼」に変更する。(すべての項目が「常に信頼」に変更される。)
- 詳細ウィンドウを閉じるとユーザーパスワードの入力を求められるので入力。
- ローカル環境のサイトにSSLでアクセスして動作を確認する。
※ 証明書ストアから削除する場合は、一覧の中から選択して右クリックメニューの「削除」。
(2) Firefoxの場合
Firefoxの証明書ストアにCA証明書を追加する方法
- Firefoxの設定を開く。
- 左カラムのメニュー「ブラウザープライバシーとセキュリティ」 > メインカラムをスクロールして下部にある「証明書」の項目の「証明書を表示」をクリックして「証明書マネージャー」を開く。
- 「認証局証明書」タブ > 下部の「読み込む」を開いて、自分のCA証明書(今回は「ag2ca.crt」)を選択する。
- 認証局として本当に信頼できるかの確認ダイアログが表示されるので、「この認証局によるウェブサイトの識別を信頼する」にチェックを入れて「OK」を押してダイアログを閉じる。
- 右下の「OK」を押して一度「証明書マネージャー」を閉じる。
- 再度「証明書マネージャー」を開いて、自分の証明書が一覧に登録されていることを確認する。(発行時に設定してある組織名で表示される。)
- ローカル環境のサイトにSSLでアクセスして動作を確認する。
※ 証明書ストアから削除する場合は、「証明書マネージャー」で自分の証明書を選択、下部の「削除または信頼しない」をクリックして「OK」。
- MAMPでMacのローカル環境にSSL(https://localhost)を設定する方法
- コマンド openssl 暗号化・復号化・公開鍵などを扱うツール
- Chromeで使えるオレオレ証明書を作成する方法
- OpenSSLで自己署名証明書を作成する(複数ホスト名:SAN/Subject Alternative Name設定付き)
- What is the SSL Certificate Subject Alternative Name?
- SSL Certificates HOWTO
- CA 構築のための OpenSSL の設定
- OpenSSL で認証局 (CA) を構築する手順 (Windows)
- OpenSSL “ca” Error “lookup failed for ca::serial”
- Chrome58で、HTTPSの自己証明書が NET::ERR_CERT_COMMON_NAME_INVALID になる場合の対応
- 今度こそopensslコマンドを理解して使いたい (1) ルートCAをスクリプトで作成する
https://memo.ag2works.tokyo/post-3192/
OpenSSLで証明書を作成してMAMPのローカル環境にSSL設定。 | memo メモ [AG2WORKS]
<a href="https://memo.ag2works.tokyo/post-3192/" target="_blank" rel="noopener">OpenSSLで証明書を作成してMAMPのローカル環境にSSL設定。 | memo メモ [AG2WORKS]</a>
この記事へのコメント
コメントの書き込みはまだありません。