ノウハウ
[初心者向け]

SSLの話 その3~ Plesk12拡張 Let’s Encryptはどう動く~

ノウハウ
テクニカルサポート
7月の最終金曜日はSystem Administrator Appreciation Day、システム管理者さん、社内ITのプロフェッショナルの皆さんに感謝する日、だそうです。サーバ管理者の皆様、いつもお疲れ様です!
7月の最終金曜日はSystem Administrator Appreciation Day、システム管理者さん、社内ITのプロフェッショナルの皆さんに感謝する日、だそうです。サーバ管理者の皆様、いつもお疲れ様です!

2016年 EX-CLOUDでは Plesk12.5 を搭載した新VPSをリリースしました。

Pleskには「拡張」という機能があります。Plesk8時代には「モジュール」とよばれた機能です。
Plesk12は、当サービスではPlesk11.0.9搭載プラン以来の新バージョンになりますが、インストール可能な「拡張」のメニューも多くなっていました。サーバプランを決める際、標準搭載する拡張機能はどれにしようと考え、選抜されたものの1つが Let’s Encrypt です。

※Let’s Encryptは厳密にいうと 無料のSSL証明書を発行する認証局の名称ですが、この記事ではPlesk12の拡張機能のSSL自動実装のための機能名として扱います。

Pleskの拡張機能はどんなものがインストールされていますか【Plesk12】

Plesk12拡張のLet’s Encryptではウェブサイト用の無料のSSLサーバ証明書を取得することができます。
無料なのに、著名なウェブブラウザ上であっても忌まわしき警告画面が出ない、
そして何よりも自動更新を実現しているので管理の手間も要りません。
システム管理者さん、サーバ管理者さんにはほんとうにありがたい機能といっていいでしょう。

以下のガイドが手順です。
Let’s Encrypt【Plesk12】

上記のガイドの手続き、つまり「ボタン ポチ、ポチ」の簡単作業のみで

  1. Let’s Encryptの認証局(Certification Authority,CA) への申請
  2. 審査手続きのための指定ファイル設置、
  3. CA発行の証明書受領とウェブサーバ設定の更新と再起動
  4. 審査手続きのためのファイルを削除

という手続きを一度に行うことができます。

SSL発行のための認証方式について

SSL証明書は第三者機関である認証局に、証明書取得を申請し、認証局が一定の審査を行った後、認証局より発行されるものです。

Let’s EncryptのSSLサーバ証明書は、ジオトラストのクイックSSLプレミアムなどと同様の、ドメイン認証です。
ドメイン認証とは、「ドメインの特定情報をコントロールできることを示すことでドメインを所有している」と証明する方法で
Domain Validation、略称DV、と呼ばれるものです。
ドメイン認証 – 用語集(た)

Plesk12搭載VPSプランの拡張「Let’s Encrypt」を利用する場合、「ドメイン移行準備中」のDNS切り替え前の段階でLet’s Encrypt の証明書を発行することはできません。

https://取得したいコモンネーム名/***** で外部からも接続でき、そのアクセスがご契約のPlesk12搭載のVPSサーバへたどり着くことが必須となります。
ウェブサービスについても、ドキュメントルートのトップから、アクセス制限をかけたりすることのないようご注意ください。

ドメイン認証の手続きいろいろ

少し話は逸れますが、SSL証明書以外にも、ドメインと深くかかわるサービスを提供しているサービスの場合、なんらかの方法でドメイン所有の審査のための、ドメイン認証手続きを行っています。具体的な手続き例としては以下のようなものがあります。

  1. ドメイン管理者メールアドレスを通じて一定の手続きを行う例)ジオトラストSSLのメール認証手続き
    SSLサーバ証明書取得手続き<ジオトラスト編>- EX-CLOUDガイド)ウェブサイトに手を入れられない場合や、外部にウェブを公開できない事情がある場合については、メールによる認証手続きに利点があります。
  2. DNSゾーンに指定されたレコードを追加する例)SSLではありませんがGoogle Apps のドメイン所有権の確認
    「ドメインの設定にレコードを追加する」手順など
  3. HTTP(HTTPS)経由で閲覧できるエリアに指定の条件のファイルを設置する例)Plesk12搭載VPSプランの拡張「Let’s Encrypt」の手続き、
    SSLではありませんがGoogle Apps のドメイン所有権の確認
    「ウェブサイトに HTML ファイルをアップロードする」
    「ウェブサイトに <meta> タグを追加する」など

Plesk12搭載VPSプランの拡張「Let’s Encrypt」においては「3」の手続きになるのですが、
Pleskで操作している限りでは、この手続きを意識することはありません。

さらに「証明書の更新」についても自動化されているため、初回の証明書インストール作業、同じサーバを引っ越さずに使い続けていれば、煩わされることはありません。

Let’s Encryptで瞬時に行われるファイルによるドメイン認証の実際

Plesk12の拡張「Let’s Encrypt」を設定したり、証明書更新のタイミングでは実際にどんな手続きが行われているのか、まとめてみました。

※以下の操作を自動で行っている形になります。

後述する、証明書更新の手続きの際にも、同様の処理が自動で行われます。

  1. 【ご契約サーバ内】秘密鍵、CSRを作成し、Let’s Encrypt認証局へ申請を開始
  2. 【認証局】申請を受領し、ファイル認証のためのファイルを発行
  3. 【ご契約サーバ内】ドキュメントルートディレクトリ配下に
    「.well-known/acme-challenge」というディレクトリを作成
  4. 【ご契約サーバ内】3.の直下に、Rewriteを無効にするような.htaccessを作成
    (以下のような内容です)

    Satisfy any
    <IfModule mod_rewrite.c>
        RewriteEngine off
    </IfModule>
    
  5. 【ご契約サーバ内】3.の直下に、Let’s Encrypt認証局指定のファイルを設置
  6. 【認証局】5.のファイルをhttps経由で確認し証明書を発行
  7. 【ご契約サーバ内】認証局からサーバ証明書を受信し、Apache設定ファイルを更新し、サーバの再起動
  8. 【ご契約サーバ内】3. 4. 5. のファイル、ディレクトリを削除

上記はPlesk12の場合に限定した具体的な流れですが、Let’s EncryptのSSL証明書発行・サーバへ適用のメカニズムについては以下のリンクに英語での解説があります。

Let’s Encryptは、HTTPSを介してドメイン認証の自動化管理を行うための仕組みである
ACME(Automated Certificate Management Environment:自動証明書管理環境)プロトコルと、ACME の仕様を理解する nginx/ Apacheなどのウェブサーバが仲立ちとなって、SSLの自動更新を実現している、ということが説明されています。

How It Works – Let’s Encrypt (英語)

Let’s Encrypt のSSL証明書の有効期限は90日

90日?! 短いけど何かの間違いではないか?と思われるかもしれませんが、以下のような認証局側の考えのもと、意図してこの期間が設定されています。

  1. 短い有効期限によって 機密の漏洩や、誤った証明書発行による損害を最小限にすることができる
  2. SSLサイトの自動化を促進のため
    もしすべてのウェブがHTTPSに移行するとしたら、すべての管理者が手動で証明書を更新する作業については期待できなくなる。自動化が有効になれば有効期限が短いことは苦にならなくなる。

Why ninety-day lifetimes for certificates? – Let’s Encrypt (英語)

Plesk12搭載のVPSプランでは月に1度、rootのcrontabにてスクリプトが起動して、証明書の更新を行っています。(※毎月何日になっているか、についてはランダムでサーバごとに異なります。)
有効期限は3ヶ月期間ですが、crontabで月に一度更新しているので、証明書が知らない内に有効期限切れになることはありません。
以下、rootのcrontab関連箇所抜粋です。

●       ●       ●      *       *       /usr/local/psa/admin/bin/php -dauto_prepend_file=sdk.php '/usr/local/psa/admin/plib/modules/letsencrypt/scripts/renew-certificates.php'

Plesk側のその他、関連資料

Plesk上でSSLサーバ証明書を更新するときと同様ですが、Let’s Encryptを設定すると、Pleskのpsaデータベース、サーバ内のファイル(証明書ファイル、Apache設定ファイル、Let’s Encryptの設定ファイルやログ)などが更新されます。

ログファイルの場所

/usr/local/psa/var/modules/letsencrypt/logs/letsencrypt.logに格納されます

2017年2月加筆:実際のトラブルシュートの実例

Let’s Encryptをインストールされ、初回はすんなりインストールできたのに更新できない、とかいうことがあったらログファイルを確認してみてください。
ただ、直近の1回分の更新のログしか格納されておらず、ログに記載されている時刻は日本に滞在する私たちにとっては9時間の時差があるようなこともありますが、大変有用です。
PleskのLet’s Encrypt設定にはには「www.**を代替ドメイン名として含めるかどうか」という項目があります。
もしそれにチェックを入れていると、たとえば subdom.example.org と www.subdom.example.orgも 名前解決できるように準備しておく必要があります。「www.subdom.example.orgは名前解決できてない」という場合のログ出力の例は以下のようなイメージです。
(改行はこちらで適宜入れていますが実際には横に1行がながい状態です)

DEBUG:certbot.main:Arguments: ['--non-interactive', '--renew-by-default', 
'--no-redirect', '--agree-tos', '--text', '--config-dir', '/usr/local/psa/var/modules/letsencrypt/etc',
 '--work-dir', '/usr/local/psa/var/modules/letsencrypt/lib',
 '--logs-dir', '/usr/local/psa/var/modules/letsencrypt/logs', 
'--authenticator', 'letsencrypt-plesk:plesk', 
'--installer', 'letsencrypt-plesk:plesk', 
'--email', 'taro@example.org ', '-d', 'subdom.example.org', '-d', 'www.subdom.example.org']

:

FailedChallenges: Failed authorization procedure. www.subdom.example.org (http-01): 
urn:acme:error:connection :: The server could not connect to the client to verify the domain :: 
DNS problem: NXDOMAIN looking up A for www.subdom.example.org

証明書ファイルのパス

Let’s Encryptに限らず、PleskからSSL証明書を入れるときの仕様で
/usr/local/psa/var/certificates/以下に格納されます

関連するpsaテーブル

以下、Let’s Encrypt以外のSSLのことも含むPleskデータベース側のメモです。

psa.certificates

Let’s Enctyptに限らず Pleskの証明書全般が書かれているテーブルです。

(サンプル)
# plesk db
mysql> select id,name,ca_file,cert_file from certificates ;
+----+----------------------------------+-------------+-------------+
| id | name                             | ca_file     | cert_file   |
+----+----------------------------------+-------------+-------------+
|  1 | default certificate              |             |             |
|  2 |                                  |             |             |
| 19 | XXXXXXX_ssl_name                 | cert-XXXXXX | cert-YYYYYY |
| 24 | Lets Encrypt dummy.domainname.A  | cert-XXXXXB | cert-YYYYYA |
| 25 | Lets Encrypt dummy.domainname.B  | cert-XXXXXB | cert-YYYYYB |
+----+----------------------------------+-------------+-------------+
5 rows in set (0.00 sec)

上記の例では id=19 については手動でインストールしたSSL証明書の設定が保存されており、
id=24 および 25については Let’s Encrypt の証明書であると確認できます。
dummy.domainname の部分は実際に Let’s Encrypt証明書を適用したドメイン名が入ります。
ca_file cert_file については ランダムで名前が割り当てられます。
/usr/local/psa/var/certificates/ 以下のファイル名となります。

psa.IP_Addresses

このテーブルでは、IPアドレスの情報が保存されます。IPアドレスに対して証明書を割り当てている場合はssl_certificate_idに0以外の番号が記載されます。

(サンプル)
mysql> select ip_address,ssl_certificate_id from IP_Addresses;
+-----------------+--------------------+
| ip_address      | ssl_certificate_id |
+-----------------+--------------------+
| nnn.nnn.nnn.nnn |                  1 |
+-----------------+--------------------+
1 row in set (0.00 sec)

上記の例では2つのドメイン両方とも証明書が割り当てられています。

psa.hosting

このテーブルでは、ドメインのホスティング設定が保存されます。そのドメインに対して証明書を割り当てている場合はcertificate_idに0以外の番号が記載されます。

(サンプル)
mysql> select dom_id,www_root,certificate_id from  hosting ;
+--------+---------------------------------------------+----------------+
| dom_id | www_root                                    | certificate_id |
+--------+---------------------------------------------+----------------+
|      1 | /var/www/vhosts/dummy.domainname.A/httpdocs |             24 |
|     14 | /var/www/vhosts/dummy.domainname.B/httpdocs |             25 |
+--------+---------------------------------------------+----------------+
2 rows in set (0.00 sec)

上記の例では2つのドメイン両方とも証明書が割り当てられています。

psa.domains

このテーブルではhostingのテーブルに記載されているドメイン名などが確認できます。

(サンプル)
mysql> select id,name from domains  ;
+----+--------------------+
| id | name               |
+----+--------------------+
|  1 | dummy.domainname.A |
| 14 | dummy.domainname.B |
+----+--------------------+
2 rows in set (0.00 sec)

psa.Module

Let’s Encryptの拡張機能がインストールされた際(初期出荷時)、module_idを割り当てているテーブルです。module_id番号確認の際参照します。

(サンプル)
mysql> select id,name from Modules where name like 'letsencrypt' ;
+----+-------------+
| id | name        |
+----+-------------+
|  5 | letsencrypt |
+----+-------------+
1 row in set (0.00 sec)

psa.ModuleSettings

Let’s Encryptで、wwwつきのドメインについてもSSLを有効化しようとしたか、については確認できます。
このテーブルの仕様の全容について把握できてはおりませんが、Let’s Encryptを未設定のサーバですと、「renew_certificates」1行しか表示されていません。
一度Let’s Enctyptの設定を追加している場合は、email-数字、www-数字 1ペアずつ行が追加され、secret-keyの行が1行追加されます。
Let’s EncryptをPleskのフルホスト名で設定しようとして、かつ「この証明書を使用してPleskへの接続セキュリティを保護します」にチェックを入れた場合には、secure-pleskの行も出現します。

(サンプル) 上述のModuleで確認したid(以下の例では5)を指定して表示
mysql> select * from ModuleSettings   where module_id = 5;
+-----------+--------------------+--------------------------------------+
| module_id | name               | value                                |
+-----------+--------------------+--------------------------------------+
|         5 | email-1            | taro@example.org                     |
|         5 | email-14           | taro@example.org                     |
|         5 | email-2            | taro@example.org                     |
|         5 | email-3            | taro@example.org                     |
|         5 | renew_certificates | 0xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx   |
|         5 | secret-key         | xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx |
|         5 | secure-plesk       | 1                                    |
|         5 | www-1              | 1                                    |
|         5 | www-14             | 0                                    |
|         5 | www-2              | 0                                    |
|         5 | www-3              | 0                                    |
+-----------+--------------------+--------------------------------------+

駆け足でPlesk12の拡張機能である、Let’s Encryptのことをお話しましたが、設定が簡単、更新手続き不要なので、ぜひ活用していただければと思います。

この記事を書いた人

テクニカルサポート

テクニカルサポートを得意とするエクスクラウドのサポートスタッフ。

この記事のタグ

オススメの記事

ページトップへ