Let's Encrypt でサイトを SSL 化する( Django 編)
2017-12-07 09:00
  • 以前、「Let's Encrypt でサイトを SSL 化する」というエントリーを書きましたが、
    Django などのフレームワークを使っている(厳密にはアプリケーション内でばりばりルーティングしている)サイトに
    対して Let's Encrypt のサーバー証明書を発行するときにちょっと躓いたのでメモを残しておきます。

    前提条件


    ・すでに Django サイトが動いている状態
    ・ Web サーバーに Apache を使っていること
    


    certbot-auto を使った証明書の発行の問題点

    このサイトの場合
    $ certbot-auto certonly --webroot -w /path/to/webroot -d 4to.pics --email=xxxx@4to.pics
    

    通常なら上記コマンドを叩けば然るべき場所に証明書などのファイルが生成されます。
    ただし、 Django の場合は --webroot -w /path/to/webroot が問題となります。(Django の場合は webfoot というよりも project root )

    これは certbot-auto コマンドが指定したドメイン直下にファイルを生成し、そこにアクセスを試みることでサイトの管理者を確認するという方法を取っているためです。

    html, css, jpg のような静的ファイルに対して、 {project root}/static/ のパスが割り当てられています。そしてその静的ファイルにアクセスするには https://4to.pics/static/{any_file} などにする必要がありますが、上記コマンドでアクセスがあるのは /.well-known/acme-challenge/{token} のような URL となりますので、 404 が返ってしまいます。

    $ certbot-auto certonly --webroot -w /path/to/webroot -d 4to.pics --email=xxxx@4to.pics
    ... (中略)
    IMPORTANT NOTES:
     - The following errors were reported by the server:
    
       Domain: 4to.pics
       Type:   unauthorized
       Detail: Invalid response from
       http://4to.pics/.well-known/acme-challenge/u40YX3ysycwdVJ1-ukQNI-eMVF__atkK1JzsAEqKJmA:
       "<!DOCTYPE html><html lang="en"><head><meta
       charset="utf-8"/><title>404 Page not
       Found</title></head><body><h1>404 Page not Found"
    
       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.
    
    
    

    このように、ドメイン直下とプロジェクトルートがイコールにならないので、一手間必要になります。
    ※なお、一定時間内に数回失敗すると1時間ほどロックされますのでご注意を。


    An unexpected error occurred:
    There were too many requests of a given type :: Error creating new authz :: Too many failed authorizations recently.


    【解決方法】Let's Encrypt 用の static path を用意する

    リダイレクトしてみたり、 webroot を static 以下にしてみたりいろいろ試しましたが、最終的には専用の静的パスを用意することで解決しました。

    settings.py

    # 以下追記
    CERT_ROOT = os.path.join(BASE_DIR, '.well-known')
    CERT_URL = '/.well-known/'
    

    urls.py
    # 以下追記
    urlpatterns += static.static(settings.CERT_URL, document_root=settings.CERT_ROOT)
    

    ssl.conf
    # 以下追記
    # プロジェクトルートのパスは -w オプションで指定したパスと同じ
    Alias /.well-known/ /path/to/project/root/.well-known/
    <Location /.well-known/>
        Options -Indexes
    </Location>
    

    動作確認

    上記の設定が済めば、サーバーを再起動して再度 certbot-auto コマンドを実行します。

    Apache の再起動


    $ sudo /etc/init.d/httpd graceful



    証明書の発行


    $ certbot-auto certonly --webroot -w /path/to/webroot -d 4to.pics --email=xxxx@4to.pics
    Requesting to rerun /usr/local/bin/certbot-auto with root privileges...
    ... (中略)
    Performing the following challenges:
    http-01 challenge for 4to.pics
    Using the webroot path /path/to/webroot for all unmatched domains.
    Waiting for verification...
    Cleaning up challenges

    IMPORTANT NOTES:
    - Congratulations! Your certificate and chain have been saved at:
    /etc/letsencrypt/live/4to.pics/fullchain.pem
    Your key file has been saved at:
    /etc/letsencrypt/live/4to.pics/privkey.pem
    Your cert will expire on 2018-03-07. To obtain a new or tweaked
    version of this certificate in the future, simply run certbot-auto
    again. To non-interactively renew *all* of your certificates, run
    "certbot-auto renew"
    - If you like Certbot, please consider supporting our work by:

    Donating to ISRG / Let's Encrypt: https://letsencrypt.org/donate
    Donating to EFF: https://eff.org/donate-le

    うまく生成できました。
    あとは証明書のパスを ssl.conf に書くだけです。以前紹介した工程と全く同じで大丈夫。

    参考
    Djnagoが動いているサーバをletsencryptでHTTPS化

    人気ブログランキングへ ブログランキング・にほんブログ村へ
    ↑応援よろしくお願いします!m(_ _)m

  • 2017-12-07 09:00
  • サーバー
  • Let's EncryptSSL証明書認証局CAHTTPSVPSさくらcerbot-autoDjangoフレームワーク
  • 新しい記事へ
    Hulu View Modifier を更新しました

    古い記事へ
    [WordPress] コアコントリビューターの証を手に入れた!

profile picture

自己紹介的な何か

@wkmettyでついったーやってます。時々。 普段はなんちゃってプログラマやってます。海外から帰任してからは現場に戻って最前線でコード書いてます。 週末は気の向くままにプログラミングしたり、写真撮りに出かけたり、家でhuluみながらまったりしたりしています。(*´ω`*)モキュ