[tags: macos letsencrypt certbot apache SSL Certificates 443 HTTPS 自宅サーバー 証明書]

自宅 web サーバー(BSD + Apache + Perl + PostgreSQL = B.A.P.P.)をそろそろ https に対応せねば。 https にしておかないと Holy Google から冷たくされる。

無料の証明局を簡単に利用できるようになってきてるし。startssl とか letsencrypt とか。

self-signed certificates(オレオレ証明書)といったわけのわからないことをしなくて済むように、環境が熟してます。

https://letsencrypt.org/

ダイナミック DNS でも大丈夫?

大丈夫です。DynDNS PRO で確認済みです。ほかのサービスは知りませんが、原理的には大丈夫です。SSL 認証はサーバー名に対してなされます。IP アドレスに対してではありません。なので SSL 認証をダイナミックDNSと組み合わせて問題はありません。

Let's Encrypt!
証明書取得のためのクライアント Certbot を 入れる。

Using the EFF’s Certbot to enable HTTPS on your webserver.

Mac OS X 10.11 El Capitan
2017-02-28
MacPorts でオッケーです

% sudo port selfupdate
% sudo port upgrade outdated
% sudo port install certbot
...
--->  Attempting to fetch certbot-0.11.1.tar.gz from github.com/certbot/certbot/tarball/v0.11.1
--->  Verifying checksums for certbot                                           
--->  Extracting certbot
--->  Configuring certbot
--->  Building certbot
--->  Staging certbot into destroot
--->  Installing certbot @0.11.1_0
--->  Activating certbot @0.11.1_0
--->  Cleaning certbot
--->  Updating database of binaries
--->  Scanning binaries for linking errors               
--->  No broken files found.                             
--->  Some of the ports you installed have notes:
  python27 has the following notes:
    To make this the default Python or Python 2 (i.e., the version run by the
    'python' or 'python2' commands), run one or both of:
    
        sudo port select --set python python27
        sudo port select --set python2 python27
    
    ##############################################################
    # IF YOU ARE USING PYTHON FROM THE TERMINAL, PLEASE INSTALL:
    #   py27-readline
    # TO AVOID A LIBEDIT / PYTHON INTERACTION ISSUE.
    # REF: trac.macports.org/ticket/48807
    ##############################################################

https://letsencrypt.jp/docs/using.html#system-requirements

Certbot クライアントは、電子フロンティア財団(EFF)が提供している証明書取得・管理ソフトウェアです。 Certbot クライアントは、Python 2.6 または 2.7 がインストールされている Unix 系の OS のみで動作します。将来的には、Python 3.x もサポートされる予定です。 Certbot クライアントは、下記の目的で root 権限を要求します。 /etc/letsencrypt /var/log/letsencrypt /var/lib/letsencrypt に書き込むため。 Standalone プラグイン 使用時に、Port 80 と Port 443 をバインドするため。 Apache プラグイン もしくは Nginx プラグイン の使用時に、ウェブサーバの設定を読み込み、書き換えるため。 上記のいずれにも該当しない場合には、理論上は Certbot クライアントを root 権限無しに動作させることが可能です。 しかしながら、root 権限無しで ACME クライアントを使用したい場合には、Certbot クライアントではなく、letsencrypt-nosudo や simp_le を使用した方が良いケースが多いでしょう。 Apache プラグイン の動作には、Augeas Version 1.0 を搭載している OS が必要です。 Debian・Fedora・SUSE・Gentoo・Darwin をベースにしているモダン OS が 対応 しています。

Certbot クライアントのテスト実行

% /opt/local/bin/certbot
The following error was encountered:
[Errno 13] Permission denied: '/opt/local/etc/letsencrypt'
If running as non-root, 
set --config-dir, --work-dir, and --logs-dir to writeable paths.

% sudo /opt/local/bin/certbot
Password:
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Certbot doesn't know how to automatically configure the web server on this system. 
However, it can still get a certificate for you. 
Please run "certbot certonly" to do so. 
You'll need to manually configure your web server to use the resulting certificate.

Certbot クライアントの実行 (SSL/TLS サーバ証明書の取得)

Webサーバを停止しておきます。

Certbot クライアントは、ドメイン所有者であることの認証に TCP Port 80 と TCP Port 443 を使用しているため、 SSL/TLS サーバ証明書を取得プロセスを完了させるためには、 Webサーバを一時的に終了させる必要があります。
% sudo apachectrl stop
% sudo certbot certonly --standalone -d artrec.homeunix.com
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Obtaining a new certificate
Performing the following challenges:
tls-sni-01 challenge for artrec.homeunix.com
/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/OpenSSL/rand.py:58: UserWarning: implicit cast from 'char *' to a different pointer type: will be forbidden in the future (check that the types are as you expect; use an explicit ffi.cast() if they are correct)
  result_code = _lib.RAND_bytes(result_buffer, num_bytes)
Waiting for verification...
Cleaning up challenges
Generating key (2048 bits): /opt/local/etc/letsencrypt/keys/0000_key-certbot.pem
Creating CSR: /opt/local/etc/letsencrypt/csr/0000_csr-certbot.pem

IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at
   /opt/local/etc/letsencrypt/live/artrec.homeunix.com/fullchain.pem.
   Your cert will expire on 2017-05-31. To obtain a new or tweaked
   version of this certificate in the future, simply run certbot
   again. To non-interactively renew *all* of your certificates, run
   "certbot renew"
 - If you like Certbot, please consider supporting our work by:

   Donating to ISRG / Let's Encrypt:   letsencrypt.org/donate
   Donating to EFF:                    eff.org/donate-le
https://letsencrypt.jp/usage/#TestExec

秘密鍵・公開鍵・署名リクエスト(CSR)を手動で生成する必要はありません。これらの作業は、Certbot クライアントが自動的に行います。

Let's Encrypt のサーバから、入力したドメイン名を正引き(DNSのAレコードの参照)したIPアドレスの TCP Port 80 と TCP Port 443 に接続することで、ドメイン所有者であることの認証が行われます。

そのため、Certbot クライアントは、インターネットから当該ドメイン名にアクセスした際に接続されるサーバ(DNSのAレコードで指定されたIPアドレスのサーバ)で実行する必要があります。また、ルータやファイアウォールで TCP Port 80 や TCP Port 443 をブロックしている場合、予めインターネットからの接続(インバウンド)を許可する設定に変更する必要があります。

証明書の置き場所 /opt/local/etc/letsencrypt/

MacPorts で入れた certbot なので、 取得した証明書は /etc/letsencrypt/ ではなく /opt/local/etc/letsencrypt/ に置かれます。 root権限のみで読めるようにアクセス権と所有権を変更します。 chmod 400 です。 (httpd を apache ユーザーで起動しているなら chown apache です。)

証明書の本体

サーバ証明書(公開鍵)
archive/ドメイン名/certN.pem
※ SSL/TLS サーバ証明書(公開鍵を含む)です。中間証明書や秘密鍵は含まれていません。
※ Apache 2.4.8 未満 において、SSLCertificateFile ディレクティブで指定します。
※ Apache 2.4.8 以上 では、このファイルを使用しません。

中間証明書
archive/ドメイン名/chainN.pem
※ Webサイトへのアクセス時にブラウザに提供する中間証明書です。
※ Apache 2.4.8 未満 において SSLCertificateChainFile ディレクティブで指定します。
※ Apache 2.4.8 以上 では、このファイルを使用しません。

サーバ証明書と中間証明書が結合されたファイル
archive/ドメイン名/fullchainN.pem
※ certN.pem と chainN.pem の内容が結合されたファイル。
※ Apache 2.4.8 以上 において SSLCertificateFile ディレクティブで指定します。
※ Apache 2.4.8 未満 では、このファイルを使用しません。

秘密鍵
archive/ドメイン名/privkeyN.pem
※ ファイル名の N には、取得した証明書等の番号(発行順で連番)が入ります。
※ Apache 全バージョン において SSLCertificateKeyFile ディレクティブで指定します。

証明書へのシンボリックリンクが自動的に生成される

証明書が更新されるとシンボリックリンクも更新されますので、 Apache の設定で証明書をシンボリックリンクで指定しておくと、 証明書の更新時に Apache の設定ファイルを書き換えなくて済みます。

証明書のリンク

サーバ証明書(公開鍵)
live/ドメイン名/cert.pem

中間証明書
live/ドメイン名/chain.pem

サーバ証明書と中間証明書が結合されたファイル
live/ドメイン名/fullchain.pem

秘密鍵
live/ドメイン名/privkey.pem

ディレクティブに指定するシンボリックリンクのまとめ

Apache 2.4.8 未満
SSLCertificateFile      -> cert.pem
SSLCertificateChainFile -> chain.pem
SSLCertificateKeyFile   -> privkey.pem

Apache 2.4.8 以降
SSLCertificateFile      -> fullchain.pem
SSLCertificateKeyFile   -> privkey.pem

apache の設定

apache の設定ファイルの場所や名前は運用によります。 以下は MacOS のふつうの場合です。

/private/etc/apache2/httpd.conf

# Secure (SSL/TLS) connections
Include /private/etc/apache2/extra/httpd-ssl.conf

/private/etc/apache2/extra/httpd-ssl.conf

ディレクティブに証明書のシンボリックリンク (live/ドメイン名/*.pem) を指定するだけです。

ディレクティブで指定するリンクは

Apache 2.4.8 未満
SSLCertificateFile      -> cert.pem
SSLCertificateChainFile -> chain.pem
SSLCertificateKeyFile   -> privkey.pem

Apache 2.4.8 以降
SSLCertificateFile      -> fullchain.pem
SSLCertificateKeyFile   -> privkey.pem

ふつう virtual host は使っているでしょうから

Listen 443
<VirtualHost _default_:443>
SSLCertificateFile      "/opt/local/etc/letsencrypt/live/artrec.homeunix.com/cert.pem"
SSLCertificateKeyFile   "/opt/local/etc/letsencrypt/live/artrec.homeunix.com/privkey.pem"
SSLCertificateChainFile "/opt/local/etc/letsencrypt/live/artrec.homeunix.com/chain.pem"
</VirtualHost>

てなかんじになるでしょう。 Listen 443 を忘れずに。

Let's Encrypt FTW!

classiclog は常時 SSL 化できました \^o^/

Let's Encrypt 認証局が発行する SSL/TLS サーバ証明書の有効期間は、短期間(90日間)です。 少なくとも、3か月に一回は、証明書を更新する必要があります。 Let's Encrypt 認証局は、証明書の有効期限が近くなっても証明書が更新されていない場合に、通知の Email を送信します。 Certbot クライアントは、有効期限が近付いている証明書をチェックして、新しい証明書に更新するサブコマンド renew をサポートしています。
% sudo certbot renew

todo: 証明書の期限が 3ヶ月なので certbot の起動を crontab かなにかで自動的に行う必要があります。 新しく取得した証明書へシンボリックリンクが更新されるので apache の設定は直す必要がありません。 過去に取得した証明書の実体が、上書きされたり削除されたりすることはありません。

crontab の設定

% sudo su
# cd ~
# mkdir bin
# chmod 700 bin
# cd bin
# vi monthly
# chmod 700 monthly
# crontab -l
# crontab -e

bin/monthly ファイルの内容

# /bin/sh
# monthly job
/opt/local/bin/certbot renew

The time and date fields are:

field         allowed values
-----         --------------
minute        0-59
hour          0-23
day of month  1-31
month         1-12 (or names, see below)
day of week   0-7 (0 or 7 is Sun, or use names)

EXAMPLE CRON FILE

5 0 * * *       $HOME/bin/daily
5 4 * * sun     $HOME/bin/weekly
15 14 1 * *     $HOME/bin/monthly
# use /bin/sh to run commands, overriding the default set by cron
SHELL=/bin/sh
# mail any output to `paul', no matter whose crontab this is
MAILTO=paul
# run five minutes after midnight, every day
5 0 * * *       $HOME/bin/daily.job >> $HOME/tmp/out 2>&1
# run at 2:15pm on the first of every month -- output mailed to paul
15 14 1 * *     $HOME/bin/monthly
# run at 10 pm on weekdays, annoy Joe
0 22 * * 1-5    mail -s "It's 10pm" joe%Joe,%%Where are your kids?%
23 0-23/2 * * * echo "run 23 minutes after midn, 2am, 4am ..., everyday"
5 4 * * sun     echo "run at 5 after 4 every sunday"
% man crontab
% man 5 crontab

For Google

Google に https サイトだと認めてもらう(https サイトとしてインデックスされる)には、 同一ホスト上の HTTP ページヘのリンクが含まれていないことが必要になってくるので、 これがやっかいなのよ。

http://googlewebmastercentral.blogspot.jp/2014/08/https-as-ranking-signal.html

HTTPS ウェブサイトのセキュリティレベルと環境をテストする。

TLS やパフォーマンスのこと。

ウェブマスターヘルプフォーラムで質問する。

We hope to see more websites using HTTPS in the future.
Let’s all make the web more secure!

常時 SSL 化すればプッシュ通知が可能になる

https://pushnate.com/

See Also

https://www.google.com/search?q=無料のSSL証明書

topic: macosx
first posted: 2017-02-27 15:25:28
last modified: 2017-03-05 13:33:52