yoshiislandblog.net
元営業の駆け出しアラサーSEが、休日にMACと戯れた際の殴り書きメモ。日々勉強。日々進歩。

この記事は3年以上前に書かれた記事で内容が古い可能性があります

AmazonLinuxのSSL化対応

2018-03-25

前回(WordPress(aws_bitnami)のssl対応)は、bitnamiのssl化だったが、今回は、Amazon LinuxのSSL化対応。手順はほとんど同じ。

以下の記事を参考にしました。
https://qiita.com/MashMorgan/items/56498f276c54406b1928

※flaskサーバであるので、nginx/apacheなどは動いていない。
参考:FlaskのAPIサーバから取得した情報をHTML/Javascriptで表示する

※証明書を更新した時、flaskも再起動しないと最新の証明書が参照されないので、注意
参考:備忘:ログアウトしてもバックグランドでコマンドを実行し続ける

Let’s Encryptのインストール

証明書はLet’s Encryptを使うので、Let’s Encryptをインストール

# sudo yum install libcurl4-gnutls-dev libexpat1-dev gettext
# sudo yum install git
# git clone https://github.com/letsencrypt/letsencrypt
# cd letsencrypt

証明書作成

証明書を作ろうとすると、エラーがでる。

# ./letsencrypt-auto certonly -a standalone -d <IP address>
FATAL: Amazon Linux support is very experimental at present...
if you would like to work on improving it, please ensure you have backups
and then run this script again with the --debug flag!
Alternatively, you can install OS dependencies yourself and run this script
again with --no-bootstrap.

言われるがまま、デバッグモードで実行。IPアドレスでは作れないとのこと。

# ./letsencrypt-auto certonly -a standalone -d <IP address> --debug

ConfigurationError: Requested name  is an IP address. The Let's Encrypt certificate authority will not issue certificates for a bare IP address.
Please see the logfile '/tmp/tmpPXKFB0' for more details.

仕方ないので、Route53でドメイン購入。
参考Route53でドメイン購入

再トライするが新たなエラー

# ./letsencrypt-auto certonly -a standalone -d <domain name>
Failed authorization procedure.  (http-01): urn:acme:error:connection :: The server could not connect to the client to verify the domain
...

   To fix these errors, please make sure that your domain name was
   entered correctly and the DNS A/AAAA record(s) for that domain
   contain(s) the right IP address. Additionally, please check that
   your computer has a publicly routable IP address and that no
   firewalls are preventing the server from communicating with the
   client. If you're using the webroot plugin, you should also verify
   that you are serving files from the webroot path you provided.

AWSセキュリティグループで、ポート「80」と「443」を許可してみると次は成功!

# ./letsencrypt-auto certonly -a standalone -d <domain name>
IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at:
...

# ls /etc/letsencrypt/live/www.yoshiislandserver.net/
README  cert.pem  chain.pem  fullchain.pem  privkey.pem

ssl化対応

mod24_sslをインストール

# cd ../
# yum install -y mod24_ssl

ファイルを編集

# cp /etc/httpd/conf.d/ssl.conf /etc/httpd/conf.d/ssl.conf.backup
# vim /etc/httpd/conf.d/ssl.conf

SSLCertificateFile /etc/letsencrypt/live/<domain name>/cert.pem
SSLCertificateKeyFile /etc/letsencrypt/live/<domain name>/privkey.pem
SSLCertificateChainFile /etc/letsencrypt/live/<domain name>/chain.pem

nohupで実行していたflaskサーバを切っておく

# ps -x
# kil <PID>

実行

実行。以下の様なエラーが出た場合はファイルパスが間違っているので要確認する。

# nohup python hogehoge.py
ssl.SSLError: [X509: KEY_VALUES_MISMATCH] key values mismatch (_ssl.c:2824)
api = Flask(__name__)
context = ssl.SSLContext(ssl.PROTOCOL_TLSv1_2)
context.load_cert_chain(/etc/letsencrypt/live/<domain name>/cert.pem, /etc/letsencrypt/live/<domain name>/privkey.pem)

マッチしているかどうかは以下コマンドで確認できるとのこと

# openssl rsa -in /etc/letsencrypt/live/<domain name>/privkey.pem -modulus -noout | openssl md5
# openssl x509 -in  /etc/letsencrypt/live/<domain name>/cert.pem -modulus -noout | openssl md5

参考:Nginxコンテナに、Let’s EncryptでSSL証明書を自動更新で当てたい場合