【Lets Encrypt】マルチドメインのサーバ証明書導入(SSL)

  • このエントリーをはてなブックマークに追加

概要

jitaku-server.comをhttps化した話。

OS

CentOS6系

webサーバ

Apache

サーバ証明書

使用したサーバ証明書はLet’s Encryptです。無料で簡単に導入できます。

Let’s Encrypt

wikipediaより

Let’s Encryptは、すべてのWebサーバへの接続を暗号化することを目指したプロジェクトである[4]。支払い、サーバ設定、メールによる確認、証明書の更新といった作業を省略することで、TLS暗号化における設定や保守の複雑さを大幅に削減することを意図している[5]。LinuxのWebサーバーでは、HTTPSの暗号化の設定および証明書の入手・更新がわずか2つのコマンドによって可能である

Let’s Encrypt 日本語情報サイト

Let’s Encrypt 総合ポータル

日本語情報がとても充実しています

早速やってみた

1ドメインのSSL化

一つのドメインに一つのサーバ証明書を割り当てます。

基本的に下記サイトに全て手順が載っています
Let’s Encrypt 総合ポータル

準備

sudo yum install epel-release
wget https://dl.eff.org/certbot-auto
chmod a+x certbot-auto

実行

# ./certbot-auto
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Plugins selected: Authenticator apache, Installer apache

Which names would you like to activate HTTPS for?
-------------------------------------------------------------------------------
1: ドメイン
-------------------------------------------------------------------------------
Select the appropriate numbers separated by commas and/or spaces, or leave input
blank to select all options shown (Enter 'c' to cancel):

Please choose whether or not to redirect HTTP traffic to HTTPS, removing HTTP access.
-------------------------------------------------------------------------------
1: No redirect - Make no further changes to the webserver configuration.
2: Redirect - Make all requests redirect to secure HTTPS access. Choose this for
new sites, or if you're confident your site works on HTTPS. You can undo this
change by editing your web server's configuration.
-------------------------------------------------------------------------------

Select the appropriate number [1-2] then [enter] (press 'c' to cancel): 2
Redirecting vhost in /etc/httpd/conf.d/xxxxxx.conf to ssl vhost in /etc/httpd/conf.d/ドメイン-le-ssl.conf

-------------------------------------------------------------------------------
Congratulations! You have successfully enabled
https://ドメイン

You should test your configuration at:
https://www.ssllabs.com/ssltest/analyze.html?d=ドメイン
-------------------------------------------------------------------------------

な、なんてことでしょう~♫
瞬殺です!瞬獄殺です!
たったこれだけでApacheの再起動もなくSSL通信ができてしまいました!

リダイレクト設定

./certbot-autoで実行途中で質問されます。

1: No redirect - Make no further changes to the webserver configuration.
2: Redirect - Make all requests redirect to secure HTTPS access. Choose this for

httpからhttpsにリダイレクトしたければ、上記タイミングで2を押下すればリダイレクト設定をApacheの設定ファイルに自動で記入してくれます。

リダイレクト設定

RewriteEngine on
RewriteCond %{SERVER_NAME} =ドメイン
RewriteRule https://%{SERVER_NAME}%{REQUEST_URI} [L,NE,R=permanent]

設定の意味はこちら

ssl設定ファイル

これまた自動で/etc/httpd/conf.d/ドメイン-le-ssl.confが生成され、自動で証明書の設定をしてくれます。

<IfModule mod_ssl.c>
<VirtualHost *:443>
省略
・
・
SSLCertificateFile /etc/letsencrypt/live/ドメイン/cert.pem
SSLCertificateKeyFile /etc/letsencrypt/live/ドメイン/privkey.pem
Include /etc/letsencrypt/options-ssl-apache.conf
SSLCertificateChainFile /etc/letsencrypt/live/ドメイン/chain.pem

</VirtualHost>
</IfModule>

マルチドメインのSSL化

複数のホスト名(サブドメイン)に一つのサーバ証明書を割り当てます。私は自宅サーバに複数のドメインとサブドメインのサイトをホスティングしています。jitaku-server.comで一つのサーバ証明書Aを使用します。これは上記までの作業で完了です。もう一つのドメインBで一つの証明書Bを使用します。さらにBのサブドメインも証明書Bと用います。

ワイルドカード証明書

一つの証明書に複数のサブドメインを紐付けたい場合、実現する方法としてワイルドカード証明書が浮かぶと思います。
ワイルドカード SSLサーバ証明書とは?

ワイルドカードSSLサーバ証明書とは、コモンネームに.を付ける事で、.の同一階層部分を無制限に利用できるものです。ひとつの証明書で、指定されたドメイン名に属している同一階層全てのサブドメインが有効に機能します。

今回の様に複数のサブドメインで異なるサイトを運営していた場合、通常はサイト毎にサーバ証明書が必要になってしまいます。しかし、ワイルドカード証明書の場合同一ドメイン内であれば複数のコモンネームを1枚の証明書でSSL暗号化通信を実現することができます。

コモンネームとは

Common Name(コモンネーム)とは何ですか?

  • SSL暗号化通信を行うサイトのURLのこと
  • サーバ証明書に含まれている情報
  • SSL接続をする際に、ブラウザにアドレスとして指定するURLと一致している必要があります。

複数のホスト名に対応するサーバ証明書の作成

Let’s Encryptでもできます!無料で!!ただし、ワイルドカードはまだ準備段階のようで使用できません(2018/03/05現在)。
Let’s Encryptではサブジェクトの代替名(SAN : Subject Alternative Name)というワイルドカードに似た仕組みを使って複数のホスト名に対応するサーバ証明書を実現しています。

下記サイトでも同様の質問があります。
1枚で複数のドメイン名に対応する証明書は発行できますか?
その答え↓

はい。サブジェクトの代替名(SAN : Subject Alternative Name)という仕組みを使用することで、1枚の SSL/TLS サーバ証明書を、複数の異なるドメイン名・サブドメイン名で使用することが可能です。
Certbot クライアントの証明書取得コマンド実行時に、複数のドメイン名・サブドメイン名を指定することで、複数ドメイン名・サブドメイン名に対応した証明書を取得することができます。
Webブラウザは、Webサイトのドメイン名・サブドメイン名がサブジェクトの代替名(SAN : Subject Alternative Name)のリストに掲載されていれば、正当な証明書として受け付けます。

早速導入してみる

新規取得

下記を参考に進めます
複数のドメイン名に対応する1枚の証明書を取得する場合

certbot certonly --webroot -w /var/www/example/ -d www.example.com -d example.com -w /var/www/other -d other.example.net -d another.other.example.net

これで上手くいけば一つだけ証明書が発行されます。

設定ファイル

1ドメインのSSL化は設定ファイルも自動で作成されましたが、今回は証明書の発行だけで、ApacheへのSSL設定は自分で記述しないといけません。1ドメインのSSL化で設定された内容を今回の証明書、ドメイン情報の場合として自分で記述します。

ハマったこと

conf.d/ドメイン-le-ssl.conf の中で< IfModule mod_ssl.c >を使用している場合、conf.d/ssl.confより先にconf.d/ドメイン-le-ssl.confが読み込まれると、mod_sslがまだロードされていないので、SSL設定が上手く反映されなくなる。

解決策

conf/httpd.confで

Include conf/ssl.conf
Include conf.d/*.conf

conf.d/ssl.confをconf以下に移動させて、明示的にconf.dよりも前に読み込ませる。

既にあるサーバ証明書のSAN領域に異なるサブドメインを追加する

コマンドにexpandをつける

expand説明

–expand
リクエストされたドメイン名の集合の一部が、既に存在している SSL/TLS サーバ証明書に含まれている場合には、常に既存の証明書のサブジェクト代替名(サブジェクトの別名、SANs)を拡張します(ドメイン名>の集合の追加した証明書への置き換え)。

certbot certonly --expand --webroot -w /var/www/example/ -d 追加ドメイン -w /var/www/other -d 追加ドメイン 

たぶん、expandを付けなくてもcuiの対話で拡張しますか?と聞いてくれるのでオプションは付けなくても良いのかもしれません。私は付けて発行しました。

まとめ

ひとつだけのドメイン

コマンド実行するだけApacheの設定も自動で生成

複数ドメイン

certonly で証明書だけインストールしてapacheのssl設定は自分で記述する。その時のsslモジュールの順番には気をつける

%d人のブロガーが「いいね」をつけました。