目次
はじめに
Apacheで構築したWebサーバーのHTTPS化について紹介します。
サーバー証明書には、プライベート認証局で署名した証明書、または自己署名した証明書を使っています。
環境はUbuntuですが、Apacheのインストール手順 (aptの利用) を除けば、他の環境でも有効だと考えられます。
サーバー証明書の作成
HTTPS化に必要なサーバー証明書は、次のいずれかの方法で作成します。
- プライベート認証局による証明書の作成 (オレオレ認証局)
- 自己署名による証明書の作成 (オレオレ証明書)
方法1: プライベート認証局による証明書の作成
次の記事に従ってプライベート認証局の構築からサーバー証明書の作成と署名までを行なってください。

上記が完了したらscpを使って認証局から秘密鍵と署名済み証明書を、Webサーバー上で受け取ります。<user>, <ca-server>は適宜置き換えてください。
scp <user>@<ca-server>:~/web-server/web-server.crt ~/web-server.crt
scp <user>@<ca-server>:~/web-server/web-server.key ~/web-server.key
方法2: 自己署名による証明書の作成 (オレオレ証明書)
opensslを使って自己署名による証明書を作成します。(oepnsslはインストール済みとします) 下記の説明は、この作業をWebサーバー上で行うものと想定しています。
まず秘密鍵 (web-server.key) と署名リクエスト (web-server.csr) を作成します。秘密鍵は暗号化せずに作成しています。暗号化していると、Apacheを起動するサービス中でPass Phraseの入力を求められ、エラーとなるためです。
cd ~
openssl genpkey -out web-server.key -algorithm RSA -pkeyopt rsa_keygen_bits:2048
openssl req -new -key web-server.key -out web-server.csr
作成中、次のような質問が表示されるので、適宜指定してください。
Country Name (2 letter code) [AU]: JP
State or Province Name (full name) [Some-State]: Tokyo
Locality Name (e.g. city) []: Chiyoda
Organization Name (eg. company) [Internet Widgits Pty Ltd]: Hoge LLC
Organiztion Unit Name (eg. section) []: Home
Common Name (e.g. server FQDN or YOUR name) []: example.com
必須項目は、Country Name, Organization Name, Common Nameです。
Common Name (CN) は、Webブラウザに入力されたアドレスと比較されます。WebサーバーがFQDN (Fully Qualified Domain Name) を持っている場合は、それを指定します。IPアドレスしか持たない場合は、IPアドレスを指定します。
ブラウザによっては、CNではなく、SAN (Subject Alt Name) を参照するため、本来はSANの指定も必要です。ただそもそも自己署名証明書として例外を承認することで、SANは無視されるので、ここではSANの指定は省略しています。
次に証明書 (web-server.crt) を生成します。
openssl x509 -in web-server.csr -out web-server.crt -req -signkey web-server.key -days 365
正しく実行されると、Signature ok と表示されます。
Apacheのインストール
Apacheをインストールします。次の例ではUbuntuにaptを使ってインストールしています。他の環境ではそれぞれのインストール方法を確認してください。
参考資料: Install and Configure Apache
sudo apt update
sudo apt install apache2
ブラウザで、http://<サーバーアドレス> にアクセスすると、デフォルトのページが表示されます。
ApacheのHTTPS構成の設定
証明書と秘密鍵の保管
証明書と秘密鍵をディレクトリ (/etc/certificate) を作ってコピーします。
sudo mkdir /etc/certificate
sudo cp ~/web-server.crt /etc/certificate/web-server.crt
sudo cp ~/web-server.key /etc/certificate/web-server.key
Apache SSLパラメータの定義
Apacheの構成に組み込むSSLパラメータを定義します。
sudo vim /etc/apache2/sites-available/ssl-params.conf
次の内容をコピーします。
<IfModule mod_ssl.c>
<VirtualHost _default_:443>
ServerName example.com
SSLCertificateFile /etc/certificate/web-server.crt
SSLCertificateKeyFile /etc/certificate/web-server.key
SSLCipherSuite EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH
SSLProtocol All -SSLv2 -SSLv3 -TLSv1 -TLSv1.1
SSLHonorCipherOrder On
SSLCompression off
SSLSessionTickets Off
Header always set X-Frame-Options SAMEORIGIN
Header always set X-Content-Type-Options nosniff
</VirtualHost>
</IfModule>
- ServerName (要変更)
サーバーのFQDN (Fully Qualified Domain Name) またはIPアドレスを指定 (作成した証明書のCN (Common Name) と一致) - SSLCertificateFile
作成した証明書を指定 - SSLCertificateKeyFile
作成した秘密鍵を指定 - SSLCipherSuite
暗号化の方式を指定 (スイートの名前の通り、暗号化に関連する複数の要素を含む) - SSLProtocol
通信方式を指定 (Allで全て、そこから -SSLv2などで脆弱性のあるものを除外) - SSLHonorCipherOrder
暗号化方式として、クライアント (ブラウザ)、サーバーのどちらを優先するかを指定 (onでサーバー側) - SSLCompression
SSL通信でデータ圧縮を行うかどうかを指定 (圧縮しない方が安全とのこと) - SSLSessionTickets
前方秘匿性を保つためにオフに指定 (セッションキーの暗号化に使われる秘密鍵が漏洩した場合も安全とのこと) - X-Frame-Options
Webページが、<iframe>など他のページに読み込まれることを許可するかどうかを指定
SAMEORIGINで同一サーバーのページには読み込み可能に - X-Content-Type-Options
MIMEタイプをブラウザ側で推定 (sniff = 匂いを嗅ぐ) して変更しないように指定 (nosniffのみ指定可能)
2025/05/02
ssl-params.confのSSL関連定義を<VirtualHost>内に定義する様に変更しました。元は<VirtualHost>の指定のない、グローバルな定義としていましたが、デフォルトのdefault-ssl.conf内の定義が優先される、という現象が発生したからです (この結果プライベート認証局から発行した証明書でもブラウザの警告が消えない)。 調べみると<VirtualHost>の定義とグローバルな定義の重複は問題があるようです。この問題の影響を受けた読者には申し訳ありません。
補足: 前回2024/03の更新でssl-params.confでグローバルに定義する形式にしたのですが、その時にはこの問題は発生していませんでした (少なくとも筆者の検証環境では)。複数のサイト定義がサーバー側にある場合に、どのサイト定義を使うかはブラウザとサーバーのハンドシェイクで決まります (SNI (Server Name Identification))。ブラウザ側の強化でこのハンドシェイクの結果が変わった可能性がありそうです。
参考資料
Apache本家のSSL/TLSに関する解説
SSL構成を生成してくれるツール
上記のツールで生成されるSSL構成では、OCSP Staplingが有効になっています。しかし本記事のSSL構成定義では、OCSP Staplingを有効にしていません。
OCSP (Online Certificate Status Protocol)は、証明書の有効性をクライアント (Webブラウザ)から問い合わせるプロトコルです。OCSPサーバーを立てて問い合わせを処理する必要があります。Staplingは更にそのOCSPサーバーへの問い合わせをWebサーバー側で行うものです。本記事で紹介したオレオレ証明書やオレオレ認証局の場合は、OCSPサーバーを立てていないので、OCSP Staplingをサポートできません。
構成の適用
必要なモジュールを組み込みます。
sudo a2enmod ssl
sudo a2enmod headers
HTTPSアクセスを受け付けるサイトの定義を組み込みます。
sudo a2ensite default-ssl
sudo a2ensite ssl-params
構成をテストします。
sudo apache2ctl configtest
次のように出力されれば正しく構成されています。
Syntax OK
Apacheサーバーを再起動します。
sudo systemctl restart apache2
動作確認
Webブラウザで、https://<web-server> にアクセスします。
プライベート認証局で証明書を作成した場合は、アドレスバーに鍵マークが表示され、そのまま当該のページが表示されます。
自己署名証明書を作成した場合は、ブラウザに警告画面が表示されます。指示に従って警告を受け入れることで、当該のページが表示されます。
更新記録
日付 | 内容 |
2025/05/01 | ssl-params.confをconf-availableからsites-availableに移動 |
2025/04/30 | ssl-params.confに下記を追加 default-ssl.confの定義を上書きできていなかったため <IfModule mod_ssl.c> <VirtualHost _default_:443> </VirtualHost> </IfModule> (元からの問題か、環境が変わったため顕在化した問題か、不明) |
2024/03/28 | 証明書、秘密鍵の指定をssl-params.confに移動 ServerNameをssl-params.confに定義 上記に伴いdefault-ssl.conf, apache2.confの編集をキャンセル |
2023/05/14 | ServerNameについて記述を復活 (ただし必須ではないことも明記) |
2023/05/12 | apache2.confへのServerName設定についての記述を削除 (必須ではないため) |
2023/05/03 | 初版リリース |