Let's encrypt SSL 証明書自動更新

Let's encrypt SSL 証明書自動更新

概要

Let’s encrypt SSL は開発環境で本番環境と同等に
https 通信プロトコルを利用したい為に利用しています。

バーチャルホストで複数ドメインを利用している場合等でも
マルチドメイン SSL 証明書が取得でき便利です。

オレオレ SSL 証明書ではブラウザによっては
「このページは保護されていません」
と表示されるケースがあり
非エンジニアの方によっては不信感が募ることもあります。

β 版

β 版時代の Let’s Encrypt SSL 証明書管理スクリプトです。
今回作成した SSL 自動更新スクリプトはこちらではありません。

SSL 自動更新スクリプト

今回作成した Let’s Encrypt 自動更新(Apache)スクリプトです。
更新判定し Slack 通知します。

有効期限が 30 日を切った場合に SSL 証明書を更新し httpd を再起動します。

cron 設定

  • 毎月第一土曜日 AM6:00 設定

開発環境なら土曜日に実行気づいて最低でも日曜日には治せる為。
現運用ではこれは功を奏してます。

1
00 6 1-7 * * 6 root /root/letsencrypt.sh/refresh_cert.sh

Slack 通知

強制更新したい場合

2016 年 5 月 07 日より certbot-auto に名称変更され
certbot-auto による自動更新を以下スクリプトになります。

本番環境以外でクライアント様への確認用等でなければ
こちらを利用しても良いかと思います。

--force-renewal をオプション指定することで強制的に更新します。

そもそも通知いらないという場合

こちらも certbot-auto

  • cron で直接コマンド設定
  • 毎月第一土曜日実行
  • 一応ログには残しておく
1
00 6 1-7 * * 6 root /root/certbot/certbot-auto renew --force-renewal && service httpd graceful > /root/certbot/renewal.log

以上です。

error RPC failed; curl 56 SSLRead() return on MacOS Sierra

概要

みんなのGo言語を購入しまして
ghq でGit管理してみよう!
と心動いた方は多いはず

昔から peco で Git Repository 移動コマンドはしてたけど、
ghq を利用したリポジトリ管理は便利ですね。

そんな折、
ghq コマンドで git repository をクローンしようとした際に
掲題のエラーが発生しましたので備忘録。

1
2
3
4
$ ghq get <git repository>
...
error: RPC failed; curl 56 SSLRead() return
...

利用している git が SSL 対応していないようです。

対応

  • git を openssl, curl 付きで再インストール
1
$ brew reinstall git --with-brewed-curl --with-brewed-openssl

再度実行

1
2
3
4
5
$ ghq get <git repository>
remote: Total 74442 (delta 145), reused 0 (delta 0), pack-reused 74160
Receiving objects: 100% (74442/74442), 701.45 MiB | 1.42 MiB/s, done.
Resolving deltas: 100% (50571/50571), done.
Checking out files: 100% (11350/11350), done.

無事できた♪

参照

Curl: (56) SSLRead() return error -9806 - Need Help please slight_smile

SSL証明書有効期限をチェックして結果をSlackに通知

SSL証明書有効期限をチェックして結果をSlackに通知

概要

1
SSL証明書の有効期限切れでサイトにアクセスができなくなってしまった。

なんてことが発生しない様にする為に実装しました。

Shell スクリプト

  • DOMAIN_LIST で設定した複数ドメインについて有効期限を確認します。

※実際には Jenins で実行しており
 ビルドパラメータでドメイン追加を簡単にしています。

  • 毎月第一月曜日に棚卸ししています。

Zabbix でも監視

Qiita に記事がありました。

Zabbix で SSL 証明書有効期限を監視する

1 週間を切ったら電話通知も設定できますし
対策は何にせよしておくと気持ちが落ち着きます。

以上です。

2016年5月現在、SSL評価Fを取らない為に

2016年5月現在、SSL評価Fを取らない為に

それは、ある日 QUALYS SSL LABS で SSL チェックしたとき

F になってる…

常に A+ を保っていたのに…

どうやら 2016/5/3 時点で新たに脆弱性が発見されたとのこと。

今回指摘されている CVE-2016-2107 :

AES-NI CBC MAC チェックで MITM 攻撃者がパディングオラクル攻撃可能なことがわかりました。この問題は、CVE-2013-0169(Lucky 13 パディング)の修正のために導入された箇所の不具合から発生しました。

上記対応策をまとめました。

対応策

  • OpenSSL version up

※試験 OS 環境: CentOS7

以下記事では 「OpenSSL のバージョンを 1.0.2h/1.0.1t にあげてください。」とありますが、

general-security-20160504

段階的に試した所
以下コマンドで openssl のバージョンアップをした所
エラーが消え B となりました。

事前に Nginx を 1.11.1 にアップデートした為でしょうか汗

1
2
3
4
# yum upgrade openssl -y

# openssl version
OpenSSL 1.0.1e-fips 11 Feb 2013
  • ssl_ciphers の設定変更

config generator で 生成される ssl_ciphers ディレクティブをそのまま設定すると評価が B 止まりでした。

https://ssl-config.mozilla.org/

諸々含めたくない暗号化法があるようです。

1
ssl_ciphers 'ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA:ECDHE-ECDSA-DES-CBC3-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:DES-CBC3-SHA:!DSS';

_以下最終的に設定した ssl_ciphers_ すると A+ に戻りました。

1
ssl_ciphers 'ECDH !aNULL !eNULL !SSLv2 !SSLv3';

OpenSSL の脆弱性はチェックし続けていかねば

補足

HTTP Strict Transport Security を 有効化 (常時 SSL) にしないと
A+ は取れません。

常時 SSL はパフォーマンスにも影響するので
せめて A まで取る、という指針を決めてから着手してください。

無料SSL証明書発行しセキュリティでA+を取る! 〜Apache編〜

概要

ベリトランスモジュールバージョンアップに際して
SHA256で発行したSSL証明書が必須となりました。

テスト環境でベリトランスモジュールバージョンアップ試験を行う際に
SSL証明書導入する必要が生じました。

本番環境と同じ有料SSLを導入するまでとはいかずとも
近しい状況を構築する必要があったので無料SSL証明書を発行し導入しました。

上記の手順をまとめましたので以下に記載します。

環境

AWS Marketplace: CentOS 6 (x86_64) - with Updates HVM を利用しています。

  • CentOS release 6.7 (Final)
  • Apache 2.4.12

手順

CSR生成

事前準備として、SSLインストール対象サーバで
CSRを生成しておきます。

SHA256 対応のCSR生成方法について以下ご参考ください。

StartComに登録

ヘッダーメニューの Sign-up クリック

StartSSL

必要事項登録し「send verification code」ボタンクリック

登録E-mail宛に verification codeが送付されます。

こんな感じのメールが来ます。

verfication codeを入力し登録完了

SSL発行手続き

無料版選択

SSLのWeb Server 用を選択

Domain Validation

SSLインストール対象サーバのドメイン入力

メール送信による認証

startSSL側で指定するメールアドレスで受信可能な状態にする必要があります。

ec2インスタンスのメール受信設定は以下記事が参考になりました。ありがとうございます。

AWS上のpostfixでメールを受信してみる

上記記事中の注意点として
インスタンス作成直後に yum update 分にはいいですが
時にAWSで yum update をするとkernel panicを起こすことがあります。
pythonをyumでなくソースから独自に入れ直したり、色々してたせいか…

原因は追い切れていませんが、経年運用したインスタンスについては yum update は控えたいと思います。

うまく受信設定できない場合
  • /var/log/maillog を 常に tailしてログ確認。

  • 受信可能なメールアドレスが既にあれば aliases で向け先変える。
    postmaster@(domain) → root@(domain)

  • メールボックスで Permission denied で
    受信メールを保存できない場合は以下強引にメールディレクトリを変更する。

1
2
3
4
/etc/postfix/main.cf

- home_mailbox = Maildir/
+ home_mailbox = ../home/ec2-user/Maildir/

SSL証明書 注文へ進む

メール受信による認証がクリア後、SSL証明書注文へ進みます。

認証情報作成

情報入力後、 (domain).zip がダウンロードされる。
※ 今回は WebServer が Apache なので ApacheServer を参照します。

解凍した zipファイルの ApacheServer 内の以下2ファイルを任意のディレクトリにアップしましょう。

  • 1_root_bundle.crt
  • 2_(domain).crt

今回アップ先ディレクトリは server.key 等のあるパス (/etc/httpd/conf/ssl.csr/) にします。

ssl.conf設定

SSL証明書のインストールとは
Apacheの設定ファイルとして指定ディレクティブで読み込ませる
ことです。

主な設定は以下です。

| Item | Value | Explain |
| ———————– | —————————————– |
| SSLCertificateChainFile | /etc/httpd/conf/ssl.csr/1_root_bundle.crt | 中間証明書 |
| SSLCertificateFile | /etc/httpd/conf/ssl.csr/2_(domain).crt | SSLサーバ証明書 |
| SSLCertificateKeyFile | /etc/httpd/conf/ssl.csr/server.key | SSLサーバ証明書とペアになる秘密鍵 |

以下URLで各WebServerとopensslバージョンにより最適な設定方法を示唆いただけます。

https://ssl-config.mozilla.org/

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
LoadModule ssl_module modules/mod_ssl.so

Listen 443

AddType application/x-x509-ca-cert .crt
AddType application/x-pkcs7-crl .crl

SSLPassPhraseDialog builtin


SSLSessionCache shmcb:/var/cache/mod_ssl/scache(512000)
SSLSessionCacheTimeout 300


#SSLMutex default
Mutex default ssl-cache

SSLRandomSeed startup file:/dev/urandom 256
SSLRandomSeed connect builtin
#SSLRandomSeed startup file:/dev/random 512
#SSLRandomSeed connect file:/dev/random 512
#SSLRandomSeed connect file:/dev/urandom 512

SSLCryptoDevice builtin

<VirtualHost _default_:443>

DocumentRoot "/var/www/html"
ServerName (domain):443

ErrorLog /var/log/ssl_error_log
TransferLog /var/log/ssl_access_log
LogLevel warn

SSLEngine on
SSLCertificateFile /etc/httpd/conf/ssl.csr/2_(domain).crt
SSLCertificateKeyFile /etc/httpd/conf/ssl.csr/server.key
SSLCertificateChainFile /etc/httpd/conf/ssl.csr/1_root_bundle.crt


<Files ~ "\.(cgi|shtml|phtml|php3?)$">
SSLOptions +StdEnvVars
</Files>
<Directory "/var/www/cgi-bin">
SSLOptions +StdEnvVars
</Directory>


SetEnvIf User-Agent ".*MSIE.*" \
nokeepalive ssl-unclean-shutdown \
downgrade-1.0 force-response-1.0

CustomLog logs/ssl_request_log \
"%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \"%r\" %b"

<Directory "/var/www/html">
AllowOverride All
Options -Indexes +FollowSymLinks +Includes +ExecCGI
Order allow,deny
Allow from all
</Directory>

</VirtualHost>

SSLProtocol all -SSLv2 -SSLv3

SSLCipherSuite ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA:ECDHE-ECDSA-DES-CBC3-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:DES-CBC3-SHA:!DSS

SSLHonorCipherOrder on

SSLCompression off
SSLSessionTickets off

パフォーマンスチューニングを一切していません。
あくまで SSL証明書インストールを対象としていますのでご注意ください。

設定ファイルの構文確認

1
2
3
4
5
// 構文チェック
# httpd -t

// 構文エラーがない場合は以下のように表示されます。
Syntax OK

構文エラーが発生している場合は対象箇所が表示されますのでチェックし直してください。
但し、構文エラーがないからと言ってApache再読み込み時にエラーが発生しないとは限らないので
万が一の為、即元に戻せるようなコマンドを作っておくと良いでしょう。

例えば
ssl.conf を ssl.conf.bk にリネームして Apacheの設定ファイルとして見ないようにさせるなど。

Apache 設定ファイル再読み込み

1
2
# service httpd reload
Reloading httpd: [ OK ]

ブラウザからアクセス

Chromeでアクセスしました。

  • 認証の詳細な情報

セキュリティチェック

以下サイトで診断できます。
QUALYS SSL LABS

「A」が取れました!

ちなみに
常に https通信で問題ないサイトであれば以下のように設定すると

1
2
3
4
5
<VirtualHost *:443>
...
Header always set Strict-Transport-Security "max-age=15768000"
...
</VirtualHost>

「A+」取得できました!

常時httpsはセキュアではありますがサイトの仕様次第なところもあるので状況によりけりです。

以上