この記事は3年以上前に書かれた記事で内容が古い可能性があります
AmazonLinuxのSSL化対応
前回(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