ルモーリン

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のテストをもう一度、よしバッチリ♪