ゲームサーバーのSSL対応について

こんにちは

こないだ、ハバネロにHTTPS対応を入れましたが
そろそろSSLキーの更新日が近づいたので
SSL対応プロセスについてブログに記録しておきます。

(ハバネロサイトのSSLはGAEが提供しているので
ここで話すのはゲームサーバー側のSSL対応です。)

  • Let’s Encryptで無料SSL取得
  • 昔はブラウザーが信頼できるSSLを使用するため
    有料SSL発行サービスを利用したようですが、
    今はLet's Encryptで無料SSLが使えます。


    GCEインスタンスにSSLを対応するため
    certbotを設置します。

  • certbotを設置
  • 以下のサイトで設置方法が書かれています。


    僕の場合ゲームサーバーとの通信で利用しているので
    ウェブサーバーは無しを選び、インスタンスのOSは
    VMに設置されているDebian10を洗濯します。

    ちなみに、自分のOS種類を確認するコマンドは以下です。
    > cat /etc/issue
    Debian GNU/Linux 10 \n \l

    以下のコマンドでcertbotを設置します。
    > sudo apt-get install certbot

  • 認証書を発行
  • 僕はブラウザーとsocketとの通信のため
    必要な証明書を発行するのが目的なので
    standaloneオプションを使います。
    > sudo certbot certonly --standalone

    SSLを適用するドメインを入力します。
    Please enter in your domain name(s) (comma and/or space separated)
    (Enter 'c' to cancel): gameserver.habanero.jp

    GCEインスタンスの場合、基本的に
    apacheが起動されているので
    エラーが発生する時がありますが、
    その時はapacheを終了させで再実行します。
    > sudo service apache2 stop

    証明書の発行が成功すると、このメッセージが出ます。
    IMPORTANT NOTES:
     - Congratulations! Your certificate and chain have been saved at:
       /etc/letsencrypt/live/gameserver.habanero.jp/fullchain.pem
       Your key file has been saved at:
       /etc/letsencrypt/live/gameserver.habanero.jp/privkey.pem
       Your cert will expire on 2020-10-22. To obtain a new or tweaked
       version of this certificate in the future, simply run certbot
       again. To non-interactively renew *all* of your certificates, run
       "certbot 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

    これで2つの認証ファイルが生成されます。
    privkey.pem
    fullchain.pem

    socket.ioでこの認証書を使ってhttps接続に変えます。
        var fs = require("fs");
        var options = {
            key: fs.readFileSync("./config/privkey.pem"),
            cert: fs.readFileSync("./config/fullchain.pem")
        };
        var https = require("https").createServer(options, function (req, res) {
              res.writeHead(200, {'Content-Type': 'text/plain'});
              res.end('Openchat server (SSL)');
            });
        io = require('socket.io')(https);
        https.listen(port, function () {
            console.log('listening on ' + port + ' (SSL)');
        });  
    ...

    サイトでゲームを起動すると、httpsで接続しても
    通信が正常に行われます。

  • SSLの更新
  • 基本的にcerbotは自動更新が行われますが
    僕の場合SSLキーの格納場所が別にあるので
    configで設定を少し変えした。
    vi /etc/letsencrypt/renewal/gameserver.habanero.jp.conf

    # renew_before_expiry = 30 days
    archive_dir = /etc/letsencrypt/archive/gameserver.habanero.jp
    cert = /etc/letsencrypt/live/gameserver.habanero.jp/cert.pem // ここを変更
    privkey = /etc/letsencrypt/live/gameserver.habanero.jp/privkey.pem // ここを変更
    chain = /etc/letsencrypt/live/gameserver.habanero.jp/chain.pem // ここを変更
    fullchain = /etc/letsencrypt/live/gameserver.habanero.jp/fullchain.pem // ここを変更
    ...

    自動更新の動作確認は以下のコマンドで可能です。
    > sudo certbot renew --dry-run

    コメント