1. 概要
発生は、2025年9月9日です。
2. 状況
「cron」に仕込んである「certbot」が、こけております。
Traceback (most recent call last):
File "/usr/local/bin/certbot", line 5, in <module>
from certbot.main import main
File "/usr/local/lib/python3.11/site-packages/certbot/main.py", line 6, in <module>
from certbot._internal import main as internal_main
File "/usr/local/lib/python3.11/site-packages/certbot/_internal/main.py", line 20, in <module>
from cryptography import x509
File "/usr/local/lib/python3.11/site-packages/cryptography/x509/__init__.py", line 7, in <module>
from cryptography.x509 import certificate_transparency, verification
File "/usr/local/lib/python3.11/site-packages/cryptography/x509/certificate_transparency.py", line 8, in <module>
from cryptography.hazmat.bindings._rust import x509 as rust_x509
RuntimeError: OpenSSL 3.0's legacy provider failed to load. This is a fatal error by default, but cryptography supports running without legacy algorithms by setting the environment variable CRYPTOGRAPHY_OPENSSL_NO_LEGACY. If you did not expect this error, you have likely made a mistake with your OpenSSL configuration.
「ChatGPT」くんに言われるがまま、下記のコマンドを実行します。
$ pkg info | grep openssl
openssl-3.0.17,1 TLSv1.3 capable SSL and crypto library
py311-openssl-25.0.0_1,1 Python interface to the OpenSSL library
その結果。
FreeBSD 13.4 の base は OpenSSL 1.1.1 ですが、あなたの環境には
・openssl-3.0.17,1 (ports/pkg 版 OpenSSL 3.0)
・py311-openssl
が入っており、cryptography も OpenSSL 3 にリンクしている状態です。
つまり OpenSSL 3 が使われているのに、legacy provider が無効 なのでエラーになっています。
なんですと。
解消方法として。
・OpenSSL 3 の legacy provider を有効化
・legacy provider を使わずに動かす
・cryptography を再ビルド
1番目の「OpenSSL 3」の「legacy provider」を有効化ちゅうのは。
/usr/local/etc/ssl/openssl.cnf
に、下記を記述するらしい。
openssl_conf = openssl_init
[openssl_init]
providers = provider_sect
[provider_sect]
default = default_sect
legacy = legacy_sect
[default_sect]
activate = 1
[legacy_sect]
activate = 1
しかし、これは、やってみていないですが、面倒。
3番目の「cryptography」を再ビルドちゅうのは(これが推奨らしい)。
/etc/make.conf
に。
DEFAULT_VERSIONS+= ssl=openssl30
を記述して。
/usr/ports/security/py-cryptography
をビルドしなおす。
ちゅうんですが、言われるとおりに、やろうとしたら。
make config
でエラーになるのでやめました。
2番目のを採用します。
3. 対策
「certbot」をシェルスクリプトで起動しているのですが。
冒頭に。
#!/bin/sh
export CRYPTOGRAPHY_OPENSSL_NO_LEGACY=1
と記述します。
これで、うまく動作しました。
気になったのは。
2行目が、このまま書いて、「#」でコメントアウトされていたのですな。
どうも、つけたり外したりしている風がある。
なんかの影響で、有効にしたり、無効にしたりしているような気がする。
安定してほしいなぁ。
4. 参考サイト
本ページは、「ChatGPT」くんを参考にさせていただきました。