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

letsencryptというアプリケーション名称はcertbotになっています。
やっていること自体は同じでLet's Encryptで証明書を作成というものです。

以下は過去の遺物なので、暇があれば直しておきますか。

とりあえずざっくりメモ

certbotのサブコマンドは結構あるけど基本的に使うのはcertonlyとrevokeとdeleteくらいかなぁと。 
certbot -h subcommandsを打つと色々出てくるので、興味のある方はどうぞ。

インストール系サブコマンド

runは--apacheや--nginxと併用することで自動的にドメイン情報とか拾って証明書の取得から設定までやってくれるらしい
certonlyは手動で証明書を取得するのにつかわれるらしい
renewは既存の証明書に対して更新をするらしい
enhanceは既存のApacheやNginxの設定ファイルに対してセキュリティ強化の修正(HTTPからHTTPSへのリダイレクトやHSTSの設定など)をしてくれるらしい

基本的にdnfでcertbotを入れるとrenewはtimerで管理してくれるので、certonlyで証明書を取得して手動で設定するのが良いかなと。

証明書管理系サブコマンド

certificatesは現在取得している証明書の内容を表示してくれるらしい
revokeは--cert-nameか--cert-pathで指定された証明書を取り消すらしい(サーバ上のファイルは変更なし)
deleteは--cert-nameで指定された証明書のサーバ上の関連するファイルを削除するらしい
なので、先にdeleteをしちゃうと証明書は取り消されないままなので、悪用される可能性もあるということかな?
reconfigureはApache/Nginxのコンフィグに対して再設定を行うための物らしい

アカウント管理系サブコマンド

registerはその名の通りACMEアカウントを作成するらしい
unregisterもその名の通りACMEアカウントから削除するらしい
update_accountもACMEアカウント情報を更新するらしい
show_accountはACMEアカウント情報を表示するらしい
関連して--agree-tosを入れると規約に自動で同意したということになるらしい

certonlyでやる場合はドメイン名を指定する-d example.comが必要で1つの証明書に複数のドメインを入れたい場合は-d example.com -d www.example.com -d ftp.example.com -d mail.example.comの様にすればよいらしい

認証方式を指定する場合HTTP-01の場合は--webroot -w /path/to/docrootが必要らしい
TLS-SLPN-01の場合は特にオプションの指定は不要とのことらしい
DNS-01の場合は対応するDNSプラグインをインストールしたうえで指定する必要があるらしい

また、ワイルドカード証明書を作成する場合はHTTP-01を除いて完全自動化ができるらしい
HTTP-01の場合はACMEからのレスポンス内の文字列を手動でドキュメントルート配下の所定のファイルへ書き込む必要があるとのこと。

DNS-01についてはDNSサーバの種類によってプラグインが存在するのでそれを利用することで完全自動化が実現できるとのこと。

なので、うちではかなり2015年ごろからぐだぐだ各サブドメインごとに証明書を作ってきたのをある程度まとめようかなと。www. ftp. mail.とかあるけど example.com と *.example.com だけでいいかな。

ということでちょっとだけコマンドのメモ

certbotとnamedで共通して使う鍵を作る

# ddns-confgen -k letsencrypt -a hmac-sha512

表示された中でkey "letsencrypt" { 中略 };の4行を/etc/pki/dnssec-keys/letsencrypt.keyなどに書き込みましょう。
その際ファイルのパーミッションは640でオーナーグループはnamedに設定しておきましょう。

んで次に/etc/named.confにinclude "/etc/pki/dnssec-keys/letsencrypt.key";入れましょう。

次に内向きviewのゾーンに_acme-challenge.example.com用の物を作成してupdate-policyにこのドメインのTXTレコード書き換えていいよって行を追加しましょう grant certbot-key. name _acme-challenge.example.com. txt;

外向きのviewのゾーンにも同様の物を作りますが、これは内向きで使ってたやつをin-viewで参照するだけでよさそうね。

後はゾーンの設定ファイルに_acme-challenge.example.com用のNSレコードだけ入ったものを作っておしまい。

そしたら次に/etc/letsencryptの中に任意のディレクトリを作成してその中にdns-rfc2136-certbot.iniとか作りましょう。

dns_rfc2136_server = ローカルのDNSサーバのIPアドレス
dns_rfc2136_port = DNSのポート(通常は53)
dns_rfc2136_name = 最初に作ったキー(ここだとletsencrypt)
dns_rfc2136_secret = 最初に作ったシークレット(ここだとsecretに記載してあるところで最初と最後の""は不要)
dns_rfc2136_algorithm = 最初に作ったアルゴリズム(ここだとhmac-sha512)

そしたら作ったディレクトリとiniファイルの権限をchmodで400にしましょう

後は以下コマンドをたたけば完了ですね。

certbot certonly \
 --dns-rfc2136 \
 --dns-rfc2136-credentials /etc/letsencrypt/sec/rfc2136-certbot.ini \
 --server https://acme-v02.api.letsencrypt.org/directory \
 --agree-tos \
 --key-type ecdsa \
 --dns-rfc2136-propagation-seconds 10 \
 -m webmaster@example.com \
 -d example.com \
 -d *.example.com

これでワイルドカード証明書がいちいち手作業でやらなくても済むようになったらしい

続いてはcertbot-renew.timerとcertbot-renew.serviceの有効化と起動ですね。

んで最後に、証明書更新後にウェブサーバー再起動させる仕組みの実装ですかね。

/etc/letsencrypt/renewal-hooks/deployの中に実行形式のシェルとかおいてsystemctl restart httpdとかで再起動すれば完璧ですな。
pre/postは起動時の最初と最後にしか動かず、deployは各処理の最後に毎回動くらしいので、複数証明書を管理している場合は$RENEWED_LINEAGE(/etc/letsencrypt/live/example.com)か$RENEWED_DOMAINS複数設定している場合はカンマ区切り(example.com,www.example.com)のどちらでもいいと思いますがやりたいことによって変えるのがいいですね。

とこんな感じでいったんがーっと書いて後で整形しますか。

パブリックベータが終わり正式版になったようですね。
バージョンは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 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へリダイレクトさせる Header set Strict-Transport-Security "max-age=31536000; env=HTTPS" RewriteEngine on RewriteCond %{HTTPS} off RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=302,L] 多分これでOKなので、httpd再起動してhttps://www.ssllabs.com/ssltest/で確認してA+が取れれば完了でござる。

以下編集中

コメントを追加

制限付き HTML

  • 使用できるHTMLタグ: <a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 行と段落は自動的に折り返されます。
  • ウェブページのアドレスとメールアドレスは自動的にリンクに変換されます。
CAPTCHA
半角で
この質問はあなたが人間の訪問者であるかどうかをテストし、自動化されたスパム送信を防ぐためのものです。
ももーい に投稿