ネットワークこんにちは!週末プログラミングでNodejsのWebサービスを作っているのですが、なんだかんだとなかなか時間が取れないコロナ禍の週末プログラマー、しずかなかずしです。NodejsでHTTPSサーバーを立てませんか?独自にNodejsのサーバー構築をせずとも、herokuなどのJavascriptのホスティングサービスを使えば独自のサービスを開始できます。昔を知っているものとしてはいい時代になったものだと思います。私のようにちょっと特殊な用途のサービスを立ち上げようとすると、こういう便利機能を使って達成することができないようです。私の週末プログラミングで立ち上げたのはこちらのサービスです。EncryptのSSL証明書の自動更新が失敗していることに気づきました。EncryptのHow-toを記事にしてみました。Encryptは無料のHTTPSの証明書発行サービスです。サーバーのドメイン名はお金を払って取得する必要がありますが、サーバーをセキュアなHTTPSのサーバーにするの為のお金は節約できます。以前のしずかなかずしブログの記事で、certbotというコマンドラインプログラムを使ってSSL証明書の取得をしました。SSL証明書を自動で取得しLinuxシステム上の適切な位置に保存してくれる、という便利なツールです。以下のリンクの記事では、Nodejsサーバーで使う際のかんたんなサンプルプログラムもご紹介していますので、あわせてご覧ください。上でご紹介した記事はcertbotのオプションでstandaloneを指定する方法でした。この方法では不便なケースがあります。いうのも、standaloneはSSL証明書の取得のために自分自身でサーバーマシンのHTTPプロトコルのポート(80番)にサーバーを立てます。言い換えると、他のプログラムが80番を使っていない事を前提にしています。サービスが稼働中のマシンがHTTPプロトコルを使ってサービスをしている場合は、SSL証明書の取得の際に停止させる必要があります。EncryptのSSL証明書は3ヶ月で切れるので、そのたびに停止が必要ということになってしまいます。certbotで一度運用を開始したサーバーは、まずは、Certbotのstandaloneの仕組みからご説明します。certbotはSSL証明書を設置したいマシンで実行します。Encryptのサーバーから、certbotを実行したマシンの80番のポートに対してアクセスが来ます。standaloneオプションつきでcertbotを実行する場合、このリクエストを受けるためにcertbot自身がHTTPサーバーを起動して待ち受けます。このコミュニケーションがうまくいけば、certbotが正しく証明書をマシンに設定してくれる、という流れです。このプロトコルはHTTP-01チャレンジと呼ばれています。HTTP-01チャレンジは80番ポートであることが必須になっています。セキュリティを担保するための仕様だそうです。プロトコルの詳細は以下の記事をみるとわかります。...https://letsencrypt.org/ja/docs/challenge-types/さて、自分のサーバーでセキュアなHTTPSのサーバーを立てるとなるとプロトコルのデフォルトポートは443番です。443番のポートでは自分のサービスをhttps://example.comのように準備します。Encryptの定期的な証明書の更新のために80番ポートを使わない状態にしておけば良いでしょう。renewでも新しい証明書の取得は可能です。このマシンで運用されるサービスのユーザーにとってよりありがたいのは、HTTPでアクセスしても、HTTPSへredirectしてくれることではないでしょうか。standaloneのために空けておくことはできません。証明書更新の度に運営中のサービスを停止させる必要が出てきてしまいます。私の週末プログラミングのサービスのSSL証明書の自動取得が失敗していた理由もまさにこれ。standaloneの自動更新の仕組みをすっかり失念して、HTTP→HTTPSのリダイレクトを実装していたのでした。幸いな事に、cerbotのオプションで、下記のように更新時のSSL証明書取得の前と後で実行するプログラムを指定することができます。start’が実行される)。start"ですので、更新のタイミングで必要なコマンドは上記のように実行できるので、更新プロセスをcronにより完全自動化できる訳です。certbotのmanualオプションを試すもう少し踏み込むと、standaloneというオプションではなく、manualというオプションがあるではないですか。これは、certbotのオプションでmanualしていすると、チャレンジ・レスポンスの過程を横取りする方法です。これをすることで、certbotのサーバーではなく、自分が普段立ち上げているサーバー上でSSL証明書取得の過程を担うことができます。要は、HTTP-01チャレンジの一部を実装する、というイメージです。Expressだと自分で実装する必要があります。「実装する」といっても大した話ではありません。certbotプログラムに指定されたファイルをHTTPサーバー上で提供すればよいだけです。サーバーのドメイン名が、example.comだとすると、以下のようなstaticファイルの置き場を作ります。(express-generator)でサーバープログラムを生成すると、以下のようなコードが生成され、’public’ディレクトリが、staticファイル置き場になります。'public')));ですので、publicディレクトリ以下に、.well-knownというディレクトリを作成し、その中にさらにacme-challengeというディレクトリを作っておきます。express.staticがドットから始まるディレクトリもサーブするようにする為に、上記のコードをちょっと書き換えておきます。'allow'}));これで、サーバーのファイルシステム上でacme-challengeディレクトリにxxxxxxというファイルを作って、ブラウザからhttp://example.com/.well-known/acme-challenge/xxxxxxにアクセスすると、Expressのサーバーはxxxxxxファイルの中身を返す状態になりました。オプション付きでcertbotを実行してみます。--manual以下のようなメッセージが出ます。cancel):ここでHTTPSで立ち上げるサーバーのドメイン名を入れます。上記の例だとexample.comのように入力してEnterキーを押します。YIPアドレスがログに取られますけどいいですか?と言われ、仕方なくYを実行します。すると、以下のように特定の文字列だけが入ったファイルを用意せよ、と言われます。URL:http://example.com/.well-known/acme-challenge/XXX-YYY-ZZZAAA-BBB-CCCやXXX-YYY-ZZZはその都度異なりますので、指定の文字列を使う必要があります。別のターミナルで先程作った、public/.well-known/acme-challengeディレクトリに移動します。XXX-YYY-ZZZのように実行し、次の行にAAA-BBB-CCCをペーストしてCtrl-Dを押しします。すると、XXX-YYY-ZZZファイルの中にAAA-BBB-CCCが保存された状態でファイルができます。中身を念の為確認してみましょう。’>’なしで以下を実行してAAA-BBB-CCCが表示されればOK。XXX-YYY-ZZZAAA-BBB-CCCここまでできたら、certbotを実行したターミナルに戻り、Enterを押します。https://eff.org/donate-leCongratulations!が表示されればうまく行きました。いつ期限切れになるか(YYYY-MM-DDの部分)に加えて、寄付してみてね、というメッセージがURLとともに表示されます。Expressのプログラムで読み込めばOK。ここまで書いて何なのですが...サービスを止めずに証明書を更新できても、証明書をExpressのプログラムが再読込するには立ち上げ直しが必要ですね。自動化の仕組みを考えてみます。itLinkedInB!HatenaPocketLINELINERSSFeedlyCopyObnizの使い方。NodejsでObnizに天気予報(日本語)を表示NextソニーWH-1000XM4のマイクだけじゃないテレワークに最強の機能とは!?Prevあなたへのおすすめ関連記事サーバー上のファイルを直接編集する方法。週末にプログラミングと料理を楽しむ、しずかなかずしです。studioでAVDエミュレータを動かす。KVMのCPU仮想化はBIOS設定が必要だった!こんにちは!しずかなかずしです。...ブラザーのインクジェット複合機。10版を遅延なく使う接続方法。して声が遅れるの?自宅のネットワークでIPアドレスを固定する方法。しくみを基礎から理解しよう20年近く使っているGE冷蔵庫が復活した!これはまだまだ使えるぞ〜自宅サーバのルーター設定はUPnPでポート開放。「家」アナロジーで解説!TP-LinkルータのDMZで自宅サーバーのポート開放!セキュリティーに注意して使い分け最新のAirScreenで画面をキャスト。ネットワーク上の機器を探す!あきれるほど便利なネットワーク解析アプリAndroidスマホからAirScreenへのキャストする方法。特急ロマンスカーで箱根へ。stickでAirScreenを使う。free".ホームメニューSNS上へ。