今日の昼近くから、突然、LinuxのJoplin(デスクトップ版)が同期エラーになった。エラーメッセージは"certificate has expired"(サーバの(SSL)証明書が期限切れ)だった。いやいやいや、証明書はちゃんと定期更新されているし、ブラウザもカレンダーもAndroid版Joplinも問題ないのだが・・・
それで、試しにJoplinの設定で証明書エラーを無視するようにしたら ちゃんと同期するので、それで(何かわからないが、悪いところが)直るまでしのごうかと思ったが、気分が悪いので調べてみた。すると、思わぬところに原因があった。
Joplinのフォーラムでは、例によって「Joplinは証明書は使っているだけだから知らねーよ他が悪い」みたいな回答があったが、更に調べると、Joplinを動かしているElectronの問題で、他にも困っている人が多そうだった。Electronはメモリを食う(しかも、まず解放しない)から大嫌いなので原因までは調べなかったが、大方、証明書の格納領域が小さい(僕が使っているサーバの証明書は、Let's Encryptのものなので3段階になっている)とかなのだろうと想像している。
ただ、なぜ今になって急に出たのかは謎だ。もしかしたら、昨日Joplinを更新したのが関係あるのか(だったら、Joplinにも何か原因があるはずだ)。
それで、暫定対処方法が分かり、どうにか、上記の証明書エラーを無視する設定を解除してもエラーが出なくなった。こういう分かりにくいところが駄目になると探すのが大変で、まったく疲れる・・・
参考までに、関連するページを僕が参照した順に載せる(()内は投稿時期(JST))。
- Joplinのフォーラム
- Electronのフォーラム
- [Bug]: Let's Encrypt root CA isn't working properly #31212 (2021/10)
- ここに対処方法が いくつか示されている。
- [Bug]: Let's Encrypt root CA isn't working properly #31212 (2021/10)
対処のポイントは、上に書いたように、証明書が3段階になっているのが悪いから減らすことのようで、証明書を作成・更新する時に中間の(あるいは余分な)証明書を削ればいいようだ。※ 中間のものは必要だから入っているはずなのに、どうして削っても問題ないのか まで考えるつもりはないが、確かにちゃんと動いている。中間の(あるいは余分な)証明書を削っても、削ったものが最後(「最初」のほうが正しいかも)の証明書に含まれているようなので、それでいいのかも知れない。
※例えば、(僕は使っていないが、)certbotには以下のように指定する(webサーバにnginxを使っている場合)。太字部分の指定で中間の(あるいは余分な)証明書を削るようだ。
sudo certbot certonly --nginx -d <domain> --preferred-chain "ISRG Root X1"
他に、試してはいないが、webサーバの証明書ファイル(例: "fullchain.crt")の中の2番目のブロック("-----BEGIN CERTIFICATE-----"と"-----END CERTIFICATE-----"に挟まれた部分)を削ればいいのではないかと想像している。
(10/2 5:04 わずかに修正)