2017年10月28日土曜日

Windowsで簡単軽量SSL対応Webサーバーを手軽に立ててローカルでHTTPS運用する(スクリプトテスト用にCaddyで)(注1)

【2020年10月注記】この記事は Caddyバージョン0.10.xのもので Let's Encrypt にサーバー証明書を取りに行くプロトコルがサポートされなくなっています。というわけで現在このバージョンは使用できません。

javascriptファイルをローカルに置いて手直ししながら色々なサイトにロードしてテストしたいのだが、httpsサイトだとhttpサーバーに置いたスクリプトは混在アクティブコンテンツとしてブラウザに蹴られる。でWindowsでhttpsサーバーをローカル(127.0.0.1)運用することにした。

IISとかApacheとか大げさなサーバーはいらないしSSL証明書だの面倒なこともしたくない。何か簡単に立てられて軽量なサーバーはないかと探したらCaddyというのがあった。CaddyはサーバーやSSLの知識がほとんどなくても簡単にhttpsサーバーを立てられる。Caddyは一定の設定・手順で起動すれば自動で証明書を取得してくれる。

Caddyで取得した証明書

以下にCaddyによるローカルhttpsサーバー立ち上げの手順を失敗談を交えて紹介する。
  1. ドメイン名を用意する。ダイナミックDNSのドメイン名で構わない。以下 mydomain.com とする
  2. web サーバー Caddy をダウンロードする。zip なので適当なところに展開する。以下 c:\caddy に展開したものとする
  3. サーバーで公開するファイルを置くディレクトリを用意する。以下 c:\www とする
  4. Caddy の設定ファイル Caddyfile を作成して c:\www に置く。Caddyfile はテキストファイルで1行目に mydomain.com と書いておく
  5. mydomain.com
    

  6. ポート 80 と 443 を開放して外部から Caddy に接続できるようにする
  7. mydomain.com に Caddy に接続するための IP アドレスを設定する
  8. コマンドプロンプトを開く
  9. c:\www に移動する

  10. c:\users\foo>cd c:\www
    

  11. c:\caddy にパスを通す

  12. c:\www>path %path%;c:\caddy
    

  13. caddy を起動しSSLサーバー証明書を取得させる。 Caddy はポート80と443をリッスンしつつ Let's Encrypt のサービスに接続し証明書を取得する。 途中メールアドレスの入力を求められるが任意

  14. c:\www>caddy
    Activating privacy features...
    Your sites will be served over HTTPS automatically using Let's Encrypt.
    By continuing, you agree to the Let's Encrypt Subscriber Agreement at:
      https://acme-v01.api.letsencrypt.org/terms
    Please enter your email address so you can recover your account if needed.
    You can leave it blank, but you'll lose the ability to recover your account.
    Email address: メールアドレス(任意)
    2017/10/18 13:45:39 [コンピュータ名] failed to get certificate: acme: Error 400 - urn:acme:
    error:malformed - Error creating new authz :: DNS name does not have enough labels
    
    c:\www>
    

    最初よく分からずCaddyfileにドメイン名を書くべきところコンピュータ名を書いて上記のようなエラーで証明書の取得に失敗した。証明書を発行するため外部から接続してくるのでドメイン名である必要がある。
    さらにドメイン名は正しく書いたがポートを適切に開放できていなかったために失敗した。その時のメッセージを以下に示す。

    c:\www>caddy
    Activating privacy features...
    2017/10/18 15:35:16 [mydomain.com] failed to get certificate: acme: Error 400 - urn:acme:
    error:connection - Timeout
    Error Detail:
            Validation for mydomain.com:443
            Resolved to:
                    1**.\*\*.**.253
            Used: 1**.\*\*.**.253
    
    c:\www>
    

    下はようやく成功したときのメッセージ。最初の時のようにメールアドレスの入力を求めたりするメッセージは出なかった。一番最初失敗したときに入力したメールアドレスが有効なのかなと思ったりするが委細不明

    c:\www>caddy
    Activating privacy features... done.
    https://mydomain.com
    http://mydomain.com
    

    これで証明書の取得に成功してサーバーが稼働している。Ctrl+C で caddy を終了させる

  15. 証明書さえ取得すればローカルでの運用にはポートを開放しておく必要はないのでポート 80 と 443 を閉じる
  16. テキストエディタを管理者として実行し %windir%\system32\drivers\etc\hosts ファイルを開き次の1行を追加して保存する

  17.        127.0.0.1       mydomain.com
    

  18. 以上でローカルに SSL 対応 HTTPサーバーが出来た。必要な時に caddy を起動してブラウザでhttps://mydomain.com/anyscript.jsにアクセスすれば c:\www にある anyscript.js を読み込み実行できる

注1) gistで公開した記事だがmarkdownに馴染めないので今後こちらで保守する

0 件のコメント:

コメントを投稿