v FreeBSDでLet's Encryptの証明書を使う

FreeBSDでLet's Encryptの証明書を使う

前提条件


Let's Encryptのインストール

FreeBSD 9.3の場合

ベースシステムのOpenSSLのバージョンが古すぎるのでOpenSSLをportsからインストールします。

# pkg install openssl

portsのOpenSSLを使用するようにします。

/etc/make.conf

+ DEFAULT_VERSIONS+=ssl=openssl

certbotをportsからインストールします。

# portinstall py-certbot
# pkg lock py27-cryptography

FreeBSD 10以降の場合

ベースシステムのOpenSSLをそのまま使用できるの pkgからcertbotをインストー ルします。

# pkg install py-certbot

証明書の取得

# certbot certonly -m webmaster@next-hop.net --agree-tos --webroot -w /usr/local/www/apache24/data -d www.next-hop.net

Application DocumentRoot が / の場合

Wordpress などのように Application DocumentRoot が / の場合は Alias を設定しておきます。

Alias /.well-known /usr/local/www/apache24/data/.well-known

証明書の更新

# certbot renew --webroot -w /usr/local/www/apache24/data

Apache + Tomcat


Sendmail

セキュリティを高めたいときはsendmail.mcに以下を追加します。 ただし、相手の SMTP サーバも同様に対応している必要があります。

LOCAL_CONFIG
O CipherList=HIGH:MEDIUM:-SSLv3:-SSLv2
O ServerSSLOptions=+SSL_OP_NO_SSLv2 +SSL_OP_NO_SSLv3 +SSL_OP_CIPHER_SERVER_PREFERENCE
O ClientSSLOptions=+SSL_OP_NO_SSLv2 +SSL_OP_NO_SSLv3

sendmail.cfを再構築します。

# cd /etc/mail
# make sendmail.cf
# make install

rootで次のスクリプトを実行します。

#!/bin/sh

LEDIR="/usr/local/etc/letsencrypt/live"
HOSTNAME="`uname -n`"
SUFFIX=""
HOSTDIR="$HOSTNAME$SUFFIX"
CERT="$LEDIR/$HOSTDIR/cert.pem"
KEY="$LEDIR/$HOSTDIR/privkey.pem"
CHAIN="$LEDIR/$HOSTDIR/chain.pem"
SENDMAILDIR="/etc/mail/certs"

if [ ! -f $CERT ]; then
    echo "file not found: $CERT"
    exit
fi
if [ ! -f $KEY ]; then
    echo "file not found: $KEY"
    exit
fi
if [ ! -f $CHAIN ]; then
    echo "file not found: $CHAIN"
    exit
fi
if [ ! -d $SENDMAILDIR ]; then
    mkdir $SENDMAILDIR
fi
cp -p $CERT $SENDMAILDIR/host.cert
cp -p $KEY $SENDMAILDIR/host.key
chmod 600 $SENDMAILDIR/host.key
cp -p $CHAIN $SENDMAILDIR/cacert.pem
cd $SENDMAILDIR
HASHFILE="`openssl x509 -hash -noout -in cacert.pem`.0"
if [ ! -f $HASHFILE ]; then
    ln -s cacert.pem $HASHFILE
fi
# for Cyrus imapd
cp -p $KEY $SENDMAILDIR/host.key2
chown cyrus:cyrus $SENDMAILDIR/host.key2
chmod 600 $SENDMAILDIR/host.key2

デーモンを再起動します。

# /etc/rc.d/sendmail restart

Cyrus IMAP

Sendmail用証明書から流用します。

/usr/local/etc/imapd.conf

tls_client_ca_file:     /etc/mail/certs/cacert.pem
tls_client_ca_dir:      /etc/mail/certs
tls_server_key:         /etc/mail/certs/host.key2
tls_server_cert:        /etc/mail/certs/host.cert
tls_ciphers:            HIGH:MEDIUM:-SSLv3:-SSLv2

デーモンを再起動します。

# /usr/local/etc/rc.d/imapd restart

OpenLDAP

/usr/local/etc/openldap/slapd.conf

TLSCACertificateFile    /usr/local/etc/openldap/certs/chain.pem
TLSCACertificatePath    /usr/local/etc/openldap/certs
TLSCertificateFile      /usr/local/etc/openldap/certs/host.cert
TLSCertificateKeyFile   /usr/local/etc/openldap/certs/host.key
TLSCipherSuite          HIGH:MEDIUM:-SSLv3:-SSLv2

/usr/local/etc/openldap/ldap.conf

TLS_CACERT      /usr/local/etc/openldap/certs/cacert.pem
TLS_CACERTDIR   /usr/local/etc/openldap/certs
TLS_CERT        /usr/local/etc/openldap/certs/host.cert
TLS_KEY         /usr/local/etc/openldap/certs/host.key
TLS_CIPHER_SUITE HIGH:MEDIUM:-SSLv3:-SSLv2

rootで次のスクリプトを実行します。

#!/bin/sh

LEDIR="/usr/local/etc/letsencrypt/live"
#HOSTNAME="`uname -n`"
HOSTNAME="ldap.next-hop.net"
#SUFFIX="-0001"
SUFFIX=""
HOSTDIR="$HOSTNAME$SUFFIX"
CACERT="/etc/ssl/cert.pem"
CHAIN="$LEDIR/$HOSTDIR/chain.pem"
CERT="$LEDIR/$HOSTDIR/cert.pem"
KEY="$LEDIR/$HOSTDIR/privkey.pem"
OPENLDAPDIR="/usr/local/etc/openldap/certs"

if [ ! -f $CACERT ]; then
    echo "file not found: $CACERT"
    exit
fi
if [ ! -f $CHAIN ]; then
    echo "file not found: $CHAIN"
    exit
fi
if [ ! -f $CERT ]; then
    echo "file not found: $CERT"
    exit
fi
if [ ! -f $KEY ]; then
    echo "file not found: $KEY"
    exit
fi
if [ ! -d $OPENLDAPDIR ]; then
    mkdir $OPENLDAPDIR
fi

cd $OPENLDAPDIR

if [ -f cacert.pem ]; then
    rm cacert.pem
fi
cp -p $CACERT cacert.pem
if [ -f chain.pem ]; then
    rm chain.pem
fi
cp -p $CHAIN chain.pem

HASHCA="`openssl x509 -hash -noout -in cacert.pem`.0"
HASHCHAIN="`openssl x509 -hash -noout -in chain.pem`.0"
if [ -h $HASHCA ]; then
    rm $HASHCA
fi
ln -s cacert.pem $HASHCA
if [ -h $HASHCHAIN ]; then
    rm $HASHCHAIN
fi
ln -s chain.pem $HASHCHAIN

cp -p $CERT host.cert
cp -p $KEY host.key
chown ldap:ldap host.key
chmod 600 host.key

slapd を再起動します。

# service slapd restart

pam_ldap

/usr/local/etc/ldap.conf

tls_cacertfile /usr/local/etc/openldap/certs/cacert.pem
tls_cacertdir  /usr/local/etc/openldap/certs
tls_cert /usr/local/etc/openldap/certs/host.cert
tls_key  /usr/local/etc/openldap/certs/host.key
tls_ciphers HIGH:MEDIUM:-SSLv3:-SSLv2

nss_ldap

/usr/local/etc/nss_ldap.conf

tls_cacertfile /usr/local/etc/openldap/certs/cacert.pem
tls_cacertdir  /usr/local/etc/openldap/certs
tls_cert /usr/local/etc/openldap/certs/host.cert
tls_key  /usr/local/etc/openldap/certs/host.key
tls_ciphers HIGH:MEDIUM:-SSLv3:-SSLv2

SoftEther VPN

rootで次のスクリプトを実行します。

#!/bin/sh

VPNCMD="/usr/local/sbin/vpncmd localhost:5555 /SERVER /PASSWORD:password /CMD"
LEDIR="/usr/local/etc/letsencrypt/live"
HOSTNAME="`uname -n`"
SUFFIX=""
HOSTDIR="$HOSTNAME$SUFFIX"
CERT="$LEDIR/$HOSTDIR/cert.pem"
KEY="$LEDIR/$HOSTDIR/privkey.pem"

if [ ! -f $CERT ]; then
    echo "file not found: $CERT"
    exit
fi
if [ ! -f $KEY ]; then
    echo "file not found: $KEY"
    exit
fi

$VPNCMD ServerCertSet /LOADCERT:$CERT /LOADKEY:$KEY

デーモンを再起動します。

# /usr/local/etc/rc.d/softether_server restart

Cipher Suiteの確認

# openssl ciphers -v HIGH:MEDIUM:-SSLv3:-SSLv2

参考