メールソフトで POP3 over TLS を使う

POP3 でメールを受信するとき、通信内容を暗号化する設定について説明する。 以前はパスワードだけを保護する APOP が使われていたが、 APOP は本文やメールアドレスを平文で送るため、現在は使わない。 RFC 8314 は、メールソフトとサーバの間で POP3S(POP3 over TLS、TCP ポート 995) を使うことを推奨している。

1. メールソフトが TLS に対応している場合

Thunderbird などの現在のメールソフトは POP3S に対応している。 中継プログラムは不要で、次のように設定する。

受信プロトコル: POP3
サーバ名:       メールサーバのホスト名(例 mail.example.jp)
ポート番号:     995
接続の保護:     SSL/TLS
認証方式:       通常のパスワード

サーバがポート 110 と STARTTLS の組み合わせだけを提供している場合は、 ポート番号を 110、接続の保護を STARTTLS にする。

2. メールソフトが TLS に対応していない場合

古いメールソフトのように TLS に対応していない場合は、 stunnel を同じマシンで動かし、 平文の POP3 接続を TLS 接続に中継する。

  1. stunnel のインストール

    端末で次のコマンドを実行する。Solaris 11 では、まず標準リポジトリを検索する。

    pkg search -r stunnel
    

    標準リポジトリに無い場合は、OpenCSW から導入する。端末で次のコマンドを実行する。

    pkgadd -d http://get.opencsw.org/now
    /opt/csw/bin/pkgutil -U
    /opt/csw/bin/pkgutil -y -i stunnel
    
  2. 設定ファイルの作成

    /etc/stunnel/stunnel.conf を次の内容で作成する。 client = yes は、TLS クライアントとして動作させる指定である。

    client = yes
    
    [pop3s]
    accept  = 127.0.0.1:110
    connect = mail.example.jp:995
    verifyChain = yes
    CAfile = /etc/certs/ca-certificates.crt
    checkHost = mail.example.jp
    

    connect と checkHost には、実際のメールサーバのホスト名を書く。 CAfile のパスは、システムの CA 証明書の置き場所に合わせる。 verifyChain と checkHost を指定しないと サーバ証明書の検証が行われず、中間者攻撃を防げない。

  3. stunnel の起動

    端末で次のコマンドを実行する。

    /usr/sbin/stunnel /etc/stunnel/stunnel.conf
    

    OpenCSW から導入した場合は /opt/csw/bin/stunnel である。

  4. メールソフトの受信設定

    メールソフトで次のように設定する。

    受信プロトコル: POP3
    サーバ名:       localhost
    ポート番号:     110
    接続の保護:     なし
    

    localhost 宛の平文通信は stunnel が受け取り、 メールサーバとの間は TLS で通信する。

3. 起動時に stunnel を自動起動する

Solaris 10 以降のサービス管理は SMF である。 /etc/rc2.d に起動スクリプトを置く方法は Solaris 9 以前の形式で、 現在は互換機能として残されているだけなので使わない。

/lib/svc/manifest/site/stunnel.xml を次の内容で作成する。

<?xml version="1.0"?>
<!DOCTYPE service_bundle SYSTEM "/usr/share/lib/xml/dtd/service_bundle.dtd.1">
<service_bundle type="manifest" name="site:stunnel">
  <service name="site/stunnel" type="service" version="1">
    <single_instance/>
    <dependency name="net" grouping="require_all" restart_on="none" type="service">
      <service_fmri value="svc:/milestone/network:default"/>
    </dependency>
    <exec_method type="method" name="start"
      exec="/usr/sbin/stunnel /etc/stunnel/stunnel.conf" timeout_seconds="60"/>
    <exec_method type="method" name="stop"
      exec=":kill" timeout_seconds="60"/>
    <instance name="default" enabled="false"/>
  </service>
</service_bundle>

マニフェストを読み込ませて有効化する。端末で次のコマンドを実行する。

svccfg validate /lib/svc/manifest/site/stunnel.xml
svcadm restart manifest-import
svcadm enable site/stunnel

停止するときは、端末で次のコマンドを実行する。

svcadm disable site/stunnel

状態を確認するときは、端末で次のコマンドを実行する。

svcs -xv site/stunnel