Help us understand the problem. What is going on with this article?

Ubuntu 16.04 + nginx + Postfix + Dovecot 環境で SSL 通信を有効化

More than 1 year has passed since last update.

Google さんが常時 SSL 化を推奨しているので、移転後の Ruby on Rails 用に HTTPS を開きたい(現行の WordPress は非 SSL のままにする)。
構築したてのメールサーバも平文通信になっているので、こちらも SSL 化してみよう。

環境

  • OS : Ubuntu 16.04.4 LTS
  • Web サーバ : nginx/1.12.2
  • SMTP サーバ : Postfix 3.1.0
  • IMAP/POP3 サーバ : Dovecot 2.2.22

SSL 証明書の取得

無料で SSL 証明書を発行してくれる Let's Encrypt を使用。
以下のサイトを参考にした。

Let's Encrypt クライアントのインストール

console
$ sudo apt-get install letsencrypt

SSL 証明書の発行

Let's Encrypt クライアントが80番ポートを使うので Web サーバを一旦停止する必要があるらしい。

console
$ sudo systemctl stop nginx
$ sudo letsencrypt certonly --standalone -d example.com -m root@example.com --agree-tos -n

IMPORTANT NOTES:
 - If you lose your account credentials, you can recover through
  e-mails sent to root@example.com.
 - Congratulations! Your certificate and chain have been saved at
  /etc/letsencrypt/live/example.com/fullchain.pem. Your cert will
  expire on 2018-06-13. To obtain a new version of the certificate in
  the future, simply run Let's Encrypt again.
 - Your account credentials have been saved in your Let's Encrypt
  configuration directory at /etc/letsencrypt. You should make a
  secure backup of this folder now. This configuration directory will
  also contain certificates and private keys obtained by Let's
  Encrypt so making regular backups of this folder is ideal.
 - If you like Let's Encrypt, please consider supporting our work by:

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

$ sudo systemctl start nginx

SSL 証明書の自動更新設定

rootユーザで cron の設定。
有効期限が90日なので、2ヶ月に1回更新。

crontab
00 05 15 1,3,5,7,9,11 * systemctl stop nginx && letsencrypt renew --force-renewal && systemctl start nginx

/dev/nullへリダイレクトしていないので、SSL 証明書の自動更新時にroot@localhost宛にメールが送られるはず。

Web サーバの設定

nginx の設定

/etc/nginx/conf.d/default.confに以下の内容を追記。
HTTPS を開くがとりあえず全部弾かせる。Rails を立ち上げた後に設定し直す予定。

/etc/nginx/conf.d/default.conf
server {
  listen 443 ssl;
  server_name example.com;
  root /usr/share/nginx/html;
  ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
  ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;

  location / {
    deny all;
  }
}

設定ファイルをテストして再起動。

console
$ sudo service nginx configtest
$ sudo systemctl restart nginx

動作確認

443番ポートが開いていることを確認。

console
$ netstat -an --tcp | grep 443
tcp        0      0 0.0.0.0:443             0.0.0.0:*               LISTEN

Web ブラウザからhttps://example.comにアクセス。ドメイン横に鍵マークが付き、nginxが403 Forbiddenを表示。想定通り。

メールサーバの設定

SSL 対応前のメールサーバの構築は以下のサイトを参考にしている。

SSL 対応は主に以下のサイトを参考にした。

Postfix の設定

/etc/postfix/master.cfを編集。
SMTP を無効にし、SMTPS と Submission を有効にする。

/etc/postfix/master.cf
#smtp inet n - y - - smtpd

submission inet n - y - - smtpd
  -o smtpd_sasl_auth_enable=yes

smtps inet n - y - - smtpd
  -o smtpd_tls_wrappermode=yes

設定ファイルのリロード。

console
$ sudo postfix reload

Dovecot の設定

/etc/dovecot/conf.d/10-master.confを編集。
IMAP、POP3 を無効にし、IMAPS、POP3S を有効にする。

/etc/dovecot/conf.d/10-master.conf
service imap-login {
  inet_listener imap {
    port = 0
  }
  inet_listener imaps {
    port = 993
    ssl = yes
  }
}

service pop3-login {
  inet_listener pop3 {
    port = 0
  }
  inet_listener pop3s {
    port = 995
    ssl = yes
  }
}

port = 0を明示的に指定しないと、無効とならない点に注意。
僕は POP3 を使用しないので、inet_listener pop3sport0に指定している。

/etc/dovecot/conf.d/10-ssl.confを編集し、SSL 証明書を指定。

/etc/dovecot/conf.d/10-ssl.conf
ssl = yes

ssl_cert = </etc/letsencrypt/live/example.com/fullchain.pem
ssl_key = </etc/letsencrypt/live/example.com/privkey.pem

設定ファイルのリロード。

console
$ sudo dovecot reload

動作確認

25番、110番、143番が閉じており、465番、587番、993番、995番が開いていることを確認。

console
$ netstat -an --tcp | grep LISTEN
tcp        0      0 0.0.0.0:443             0.0.0.0:*               LISTEN     
tcp        0      0 0.0.0.0:993             0.0.0.0:*               LISTEN     
tcp        0      0 127.0.0.1:3306          0.0.0.0:*               LISTEN     
tcp        0      0 0.0.0.0:587             0.0.0.0:*               LISTEN     
tcp        0      0 0.0.0.0:2222            0.0.0.0:*               LISTEN     
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN     
tcp        0      0 0.0.0.0:465             0.0.0.0:*               LISTEN     
tcp6       0      0 :::2222                 :::*                    LISTEN 

上記結果では995番が表示されていないが、これは POP3S を無効にしているため。10-master.confpop3sポートを995に指定していれば表示されるはず。

あとはメールクライアントでメールの設定をし、送受信ができることを確認。

renny1398
7月よりインターネットメディア会社で勤務中。最近職場ではCodeIgniter3やMySQL、jQuery、Bootstrapなどを触っています。プライベートではC++、Python、Ruby(主にon Rails)なども。GoやRustにも興味あり。
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした