さくらVPSで kobalab.net を運用しているのですが、昨今はhttpsに対応していないと何かと不便です*1。SSL証明書の価格も安くなってきているのでSSLを有効にしました。
かつて mod_ssl の設定 - koba::blog、mod_sslのインストール - koba::blog の要領で「インチキ証明書」を作ってApacheのSSLを有効にしたことはあるのですが、今回はマジメにやります。
- mod_ssl のインストール
- 認証局の選択
- CSR の生成と申請
- 中間CA証明書の取得
- 認証ファイルのアップロード
- SSL証明書の取得
- Apache の設定
- ファイアウォールの設定
- Apacheの再起動
- (おまけ) 秘密鍵からパスフレーズを取り除く
mod_ssl のインストール
さくらVPSの CentOS 7 のデフォルトでは mod_ssl がインストールされないので、追加でインストールします。
$ sudo yum -y install mod_ssl
以下のファイルがインストールされました。
$ rpm -ql mod_ssl /etc/httpd/conf.d/ssl.conf /etc/httpd/conf.modules.d/00-ssl.conf /usr/lib64/httpd/modules/mod_ssl.so /usr/libexec/httpd-ssl-pass-dialog /var/cache/httpd/ssl
認証局の選択
商品・価格一覧 | さくらのSSL から認証局を選びます。個人で運用するなら一番安い JPRSのドメイン認証型 で充分です。
CSR の生成と申請
認証局にSSL証明書をもらうためには、自分の秘密鍵を作成し、その秘密鍵から CSR(Certificate Signing Request)を作成し、提出する必要があります。JPRSの場合は 設定マニュアル | JPRS に手順がありますのでこれに従います*2。
(1) 秘密鍵の生成
$ openssl genrsa -aes256 2048 > key.pem
昔は DES を使ったものですが、AES256 が指定されているので従います。パスフレーズの入力を求められるので、適当に入れておきましょう。
(2) CSR の生成
$ openssl req -new -key key.pem -out csr.pem -sha256
パスフレーズの入力を求められるので、先ほどのを入力します。
続いてサーバー識別名(DN)情報の入力を求められるので、適切に入力します。一番大切なのは Common Name です。これを間違えると意味がないので、対象となるサーバの FQDN を正しく入力しましょう。Email Address、A challenge password、An optional company name は入力してはいけません。
Country Name (2 letter code) [XX]:JP State or Province Name (full name) []:Tokyo Locality Name (eg, city) [Default City]:Hino-shi Organization Name (eg, company) [Default Company Ltd]:kobalab Organizational Unit Name (eg, section) []: Common Name (eg, your name or your server's hostname) []:kobalab.net Email Address []: Please enter the following 'extra' attributes to be sent with your certificate request A challenge password []: An optional company name []:
できあがった csr.pem を使って SSLサーバ証明書お申し込み|さくらインターネット から申請します。
中間CA証明書の取得
JPRSの証明書の場合、中間CA証明書もインストールしておかないと Firefox でエラーになります*3。ルート証明書・中間CA証明書について | JPRS からタイプ(DV/OV)と有効期間が適切なものを選んでダウンロードしておきましょう。
認証ファイルのアップロード
申請の際に本人確認(申請者がサイト管理者であることの確認)のために、認証ファイルのアップロードを要求されます。さくらからメールで通知が来るのでその手順に従い認証ファイルを取得し、サーバの所定の位置にアップロードします*4。認証局では指定したファイルが指定した場所に置かれていることで本人確認するようです。
SSL証明書の取得
認証ファイルが確認され認証局での作業が完了すると、さくらからメールで通知がきますので、それに従いSSL証明書をダウンロードします*5。
Apache の設定
必要なファイルはそろったので、Apacheに設定します。ファイルは以下に配置しました*6。
秘密鍵 | /etc/httpd/ssl/key.pem |
---|---|
中間CA証明書 | /etc/httpd/ssl/chain.pem |
SSL証明書 | /etc/httpd/ssl/cert.pem |
(1) mod_ssl を有効にする
mod_ssl インストールの際に /etc/httpd/conf.modules.d/00-ssl.conf で設定済みです。
(2) mod_ssl の設定
mod_ssl インストールの際に /etc/httpd/conf.d/ssl.conf が設置されるので、これを修正します。
=================================================================== RCS file: ssl.conf,v retrieving revision 1.1 diff -u -r1.1 ssl.conf --- ssl.conf 2020/08/16 09:32:06 1.1 +++ ssl.conf 2020/08/16 16:01:58 @@ -57,7 +57,7 @@ # General setup for the virtual host, inherited from global configuration #DocumentRoot "/var/www/html" -#ServerName www.example.com:443 +ServerName kobalab.net:443 # Use separate log files for the SSL virtual host; note that LogLevel # is not inherited from httpd.conf. @@ -97,14 +97,14 @@ # the certificate is encrypted, then you will be prompted for a # pass phrase. Note that a kill -HUP will prompt again. A new # certificate can be generated using the genkey(1) command. -SSLCertificateFile /etc/pki/tls/certs/localhost.crt +SSLCertificateFile /etc/httpd/ssl/cert.pem # Server Private Key: # If the key is not combined with the certificate, use this # directive to point at the key file. Keep in mind that if # you've both a RSA and a DSA private key you can configure # both in parallel (to also allow the use of DSA ciphers, etc.) -SSLCertificateKeyFile /etc/pki/tls/private/localhost.key +SSLCertificateKeyFile /etc/httpd/ssl/key.pem # Server Certificate Chain: # Point SSLCertificateChainFile at a file containing the @@ -113,7 +113,7 @@ # the referenced file can be the same as SSLCertificateFile # when the CA certificates are directly appended to the server # certificate for convinience. -#SSLCertificateChainFile /etc/pki/tls/certs/server-chain.crt +SSLCertificateChainFile /etc/httpd/ssl/chain.pem # Certificate Authority (CA): # Set the CA certificate verification path where to find CA @@ -215,3 +215,8 @@ </VirtualHost> +<IfModule mod_rewrite.c> +RewriteEngine On +RewriteCond %{HTTPS} off +RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L] +</IfModule>
ServerName
に FQDN を設定- 各種ファイルの場所を指定
mod_rewrite
で非httpsへのアクセスを強制的にhttpsへリダイレクト
の3つを設定しています。
ファイアウォールの設定
デフォルトではSSLのポート(443)は公開されていないので、以下のコマンドで公開します。
$ sudo firewall-cmd --permanent --add-service=https $ sudo firewall-cmd --reload
Apacheの再起動
Apacheを再起動します。
$ sudo systemctl restart httpd.service
秘密鍵のパスフレーズを求められるので入力しましょう。
(おまけ) 秘密鍵からパスフレーズを取り除く
Apache 起動の際にパスフレーズが必要だとサーバ再起動の際などに不便です。以下のコマンドでパスフレーズを取り除くことができます。
$ sudo openssl rsa -in key.pem -out key.pem
*1:httpsなページからは非httpsなサイトの画像やCSSやJavaScriptのプログラムを利用できない。このために 牌画入力ツール の牌画像の配置にGitHubページを使わざるを得ませんでした
*2:素人くさい umask の設定は無視
*3:これに気づかずに時間を浪費した...
*4:つまり申請時には少なくとも非SSLなWebサーバが稼働している必要があります
*5:メールでは「サーバ証明書」となっています
*6:Apache 2.4.8 以降は秘密鍵と中間CA証明書は1つのファイルに格納する必要あり。サーバーのSSL証明書がエラーになる場合(特にFirefoxだけエラーになる場合)→解決 - Resilient Mind 参照