Let's Encrypt

サーバー運用がかなり厳しいので寄付をしてくれる人がいたらこちら
メインPCもボロボロになってきたので、ついにほしいものリスト公開

Let's EncryptでSSL

パブリックベータになりクローズドベータとは
やり方が異なるので、まとめてみます。

パブリックベータが終わり正式版になったようですね。
バージョンは2016年4月19日現在0.5.0のようです。

また、Fedora23以降はrpmに対応しているので、dnf -y install letsencryptでさくっとインストールできます。

gitが入ってれば後は勝手にやってくれそうですが、
足りなければ随時dnf等で必要なパッケージをインストールしてください

インストール

今のところは至って簡単です。

cd /usr/local/src/
git clone https://github.com/letsencrypt/letsencrypt
以上

事前準備

後述の手順のために秘密鍵を作っておきます。

/usr/bin/openssl genrsa -aes128 2048 > /etc/pki/tls/private/examplekey.pem

発行してみる

これもコマンド1つ叩くだけでイイそうです。
とりあえず以下の条件で作成します

・Fedora23
・Apache 2.4.20 が立ち上がっている状態
・ドメイン www.example.com
・DocumentRoot /var/www/example.com
cd /usr/local/src/letsencrypt
./letsencrypt-auto certonly --webroot -w /var/www/example.com -d www.example.com
rpm(dnf)でインストールした場合は-autoがなくなります
これで自動的に/var/www/example.com/.well-known/acme-challengeにごにょごにょして
終わったら/etc/letsencrypt/live/www.example.comにcert.pemとchain.pemと
fullchain.pemとprivkey.pemのシンボリックリンクが作成されます。
これはコマンド実行ごとに/etc/letsencrypt/archive/www.example.comにcert1.pem、cert2.pemと
番号が振られて、それにリンクするようになっているためのようです。

ただし、パブリックベータ期間中だからなのかわかりませんが
多数のサブドメイン(www.example.com, mail.example.com, hoge.example.com等)持っていて
それぞれでコマンドを叩くと以下の様なエラーで弾かれます
追記:netvolante.jpのDDNSでも利用できたので正式版ではこの制限がなくなってるかもしれません!

An unexpected error occurred:
There were too many requests of a given type :: Error creating new cert :: Too many certificates already issued for: example.com
Please see the logfiles in /var/log/letsencrypt for more details.
なので、次の手順で1つの証明書にドメインをまとめるのが良いです。
cd /usr/local/src/letsencrypt
./letsencrypt-auto certonly --webroot -w /var/www/example.com -d www.example.com \
-w /var/www2/example.com -d www2.example.com \
-w /var/hoge/example.com -d hoge.example.com
もしくは事前にCSR(DER形式)を作成してそれを使うのも手ですが、
今のところ?HTTPDが立ち上がってると動かせないようなので、止めてからやります。
systemctl stop httpd
cd /usr/local/src/letsencrypt
cat << EOF > example.com.cnf
[req]
distinguished_name = dn
[dn]
[ SAN ]
subjectAltName=DNS:example.com,DNS:www.example.com,DNS:mail.example.com
EOF
 
openssl req -new -key /etc/pki/tls/private/examplekey.pem -nodes -sha512 -subj "/CN=example.com" -reqexts SAN -out example.com.csr.der -outform der -config example.com.cnf
 
./letsencrypt-auto -t --csr example.com.csr.der
これでそこのディレクトリに0000_cert.pemと0000_chain.pemができるのでそれを適宜移動させて
examplekey.pemを含めた3つをApacheに設定してあげれば使えるようになると思います。

Apache設定

とりあえずパッケージで入れた状態での説明なので、適宜置換えて見てください

/etc/httpd/conf.d/ssl.conf

とりあえず設定している部分のみ抜き出してます

Listen 443 https
# SNIの設定を行うことでhttpsでもバーチャルホストを使えるようにする
# もう無いと思うけどAndroid 2.3.7、XPのIE6/8、Java 6u45はSNI非対応
SSLStrictSNIVHostCheck off
SSLPassPhraseDialog exec:/usr/libexec/httpd-ssl-pass-dialog
SSLSessionCache         shmcb:/run/httpd/sslcache(512000)
SSLSessionCacheTimeout  300
SSLRandomSeed startup file:/dev/urandom  256
SSLRandomSeed connect builtin
SSLCryptoDevice builtin
SSLProtocol all -SSLv2 -SSLv3
SSLCipherSuite "EECDH+ECDSA+AESGCM EECDH+aRSA+AESGCM \
                EECDH+ECDSA+SHA384 EECDH+ECDSA+SHA256 \
                EECDH+aRSA+SHA384 EECDH+aRSA+SHA256 \
                EECDH EDH+aRSA \
                !aNULL !eNULL !LOW !3DES !MD5 !EXP !PSK !SRP !DSS !RC4"
SSLUseStapling on
SSLStaplingCache shmcb:/run/httpd/stapling_cache(128000)
SSLHonorCipherOrder on
 
<VirtualHost *:443>
    Serveradmin     webmaster@example.com
    DocumentRoot    /var/www/vhost/www.example.com/public_html
    ServerName      www.example.com
    CustomLog       logs/vhosts/www.example.com/ssl_access_log combined
    ErrorLog        logs/vhosts/www.example.com/ssl_error_log
    # HTTP/2にこそりと対応させてみる
    Protocols       h2 http/1.1
 
    SSLEngine on
    SSLCertificateFile      "/etc/letsencrypt/live/www.example.com/cert.pem"
    SSLCertificateKeyFile   "/etc/letsencrypt/live/www.example.com/privkey.pem"
    SSLCertificateChainFile "/etc/letsencrypt/live/www.example.com/chain.pem"
    SSLCACertificatePath    "/etc/pki/CA"
    SSLCACertificateFile    "/etc/pki/CA/cacert.pem"
 
    # httpへの通信がきたらhttpsへリダイレクトさせる
    <IfModule mod_headers.c>
        Header set Strict-Transport-Security "max-age=31536000; env=HTTPS"
    </IfModule>
    <IfModule mod_rewrite.c>
        RewriteEngine on
        RewriteCond %{HTTPS} off
        RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=302,L]
    </IfModule>
</VirtualHost>
多分これでOKなので、httpd再起動してhttps://www.ssllabs.com/ssltest/で確認してA+が取れれば完了でござる。

以下編集中