MojoliciousにTLS1.3を導入
投稿:2025-08-23
珠に面白半分でSSLのテストをやってもらい結果を眺めています。 以前は評価A+を貰ってた気がしますけれどいつの間にかA-になってました。 詳細を見て、どうやらTLS1.3に対応していない点が引っかかるようです。 さあ、TLS1.3サポートだ(どうやるんだろう?)。 みんな大好きSSLのテストサイト→ SSL Server Test (Powered by Qualys SSL Labs) サーバのホスト名(www.lemorin.jp)を入力するとテスト結果を報告してくれます。
VPSのOpenSSLはバージョンが古く、TLS1.3には使えません。 最新版を入手して使えるようにします。 VPSに元から入ってるOpenSSLを更新するのは悪手のようでChatGPTに「絶対やめれ!」と言われてしまった。 かなりの警告をしてくるのは珍しいです。 そんな訳でMojoliciousの運転と同様、一般アカウントの中に展開、作成しました。
# システムのopensslを実行 $ openssl version OpenSSL 1.0.2k-fips 26 Jan 2017 $ # 最新のライブラリを指定 $ export LD_LIBRARY_PATH=/home/?????/openssl/lib64 $ ./openssl/bin/openssl version OpenSSL 3.5.2 5 Aug 2025 (Library: OpenSSL 3.5.2 5 Aug 2025) $
Mojoliciousの実行環境は主に3つあります。 開発版のmorbo、単一プロセスのdeamon、コントローラ/ワーカ構成のhypnotode、これら3つのTLSの指定方法が別々になっています。 それぞれにベタに書いて実行できます。 あるあるなのが、同じ指定じゃなく「開発版では上手く行くのに?」みたいなチョンボ。 そこで、1ヶ所に記述した内容を3つの実行環境で参照することにしました。
3つとも起動前にexport LD_LIBRARY_PATHを実行するシェルスクリプトを呼び出します。
#!/bin/bash
# オプションなし
if [ 0 -eq $# ]; then
# opensslのパスを設定
export LD_LIBRARY_PATH=/home/?????/openssl/lib64
fi
morboは環境変数MOJO_LISTENに指定します。
https://*:1234?~
といった形式で~の所がTLSの指定場所です。
deamonは起動時の--listenパラメタに指定します。
hypnotodeはmyapp.conf(JSONの設定ファイル)を読み出します。
myapp.confを手書きしているのでこれをプログラムで変更しません。
他の2つをmyapp.confから参照する方法にします。
JSONを読み出すのがなぜか上手いこと行かず、頭から1行ずつ読み出してそれっぽい行からパラメタを抽出しました。
指定内容は次の通りです。こんなに長いのを3ヶ所同じに書こうと言うほうが無理。
cert=?????.cert&key=?????.key&ca=?????.cert&version=SSLv23:!SSLv2:!SSLv3:!TLSv1:!TLSv1_1&ciphers=EECDH+HIGH:EDH+HIGH:HIGH:MEDIUM:+3DES:!ADH:!RC4:!MD5:!aNULL:!eNULL:!SSLv3:!SSLv2:!LOW:!RSA:!EXP:!PSK:!SRP:!DSS:!KRB5:!TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384:!TLS_ECDHE_RSA_WITH_CAMELLIA_256_CBC_SHA384:!TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256:!TLS_ECDHE_RSA_WITH_CAMELLIA_128_CBC_SHA256:!TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA:!TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA:!TLS_DHE_RSA_WITH_AES_256_CBC_SHA256:!TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA256:!TLS_DHE_RSA_WITH_AES_128_CBC_SHA256:!TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA256
読み出しスクリプト(なんでJSONを上手いこと読み出せないのだろう)
#!/usr/bin/env perl
use v5.30;
use utf8;
use strict;
use warnings;
use Data::Dumper;
use Encode::Locale;
use JSON;
use open IO => ":utf8";
binmode STDIN, ":encoding(console_in)";
binmode STDOUT, ":encoding(console_out)";
$| = 1;
if (open my $conf, "<", "myapp.conf") {
my $text;
while (<$conf>) {
chomp;
if ($_ =~ /https/) {
$text = $_;
last;
}
}
close $conf;
$text =~ s/.*\?//;
$text =~ s/',$//;
print $text;
} else {
die "設定ファイルを読めません\n";
}
シェルスクリプトからの呼び出しはこんな感じ
# morboの場合 # TLSのパラメタを拾って設定 tls_param=$(perl tls_setup.pl) MOJO_LISTEN="https://*:1234?$tls_param"
script/myappの場合はこんな感じ。
my $tls_param = `perl tls_setup.pl`; push @ARGV, "--listen", "http://*:$port_http", "--listen", "https://*:$port_tls?$tls_param";
前述の通りhypnotodeはmyapp.confを読み出します。
FireFoxでサイトのトップページを開き、 メニュー「ツール|ブラウザツール|ウェブ開発ツール」を選択、 ウェブ開発ツールの「再読み込み」をクリック、 読み込んだURLの先頭(トップページ)をクリック、 画面右の表示から「暗号化」タブを選択すると、TLSのバージョンが表示されます。

きっかけとなったSSLのテストをもう一度、よしバッチリ♪
