💇♂️
cloudflared の https 接続でユルめの cipher に対応する
はじめに
cloudflared の HTTPS がサポートする Cipher suites ですが 2025 年 11 月時点では下記になっています。

Go TLS library
which relies on the Go TLS library for its TLS implementation.
この記載のように Go とおなじのようです。

これらの cipher に対応していないレガシーな HTTPS サーバーには接続ができません。
方法の一つに TLS proxy を入れることが考えられるので試してみます。
cipher ミスマッチで繋がらない
cloudflared から HTTPS サーバーに直接接続し、繋がらないケースをシミュレーションします。
- HTTPS サーバー
port 44443 で待機し、AES256-SHA256 のみサポートHTTPS サーバーsudo openssl s_server -accept 44443 -cert cert.pem -key key.pem -tls1_2 -cipher 'AES256-SHA256' -www - cloudflared
パブリックホスト名を port 44443 に接続(HTTPS)

- 結果
クライアントには 502 が返ってます。HTTPS サーバーでは cipher ミスマッチを観測し、Handshake Failure Alert が見れます。クライアント 502curl https://tls.tun.oymk.work/ -sv : < HTTP/2 502 : error code: 502%HTTPS サーバー(log)no shared cipher40B7DBB51B7C0000:error:0A0000C1:SSL routines:tls_post_process_client_hello:no shared cipher:../ssl/statem/statem_srvr.c:2220:HTTPS サーバー(pcap)Handshake FailureTransport Layer Security TLSv1.2 Record Layer: Alert (Level: Fatal, Description: Handshake Failure) Content Type: Alert (21) Version: TLS 1.2 (0x0303) Length: 2 Alert Message Level: Fatal (2) Description: Handshake Failure (40)
TLS proxy 経由で繋ぐ
TLS proxy を噛ませ、サポートする Cipher suites のギャップを吸収し、接続を可能にします。
- cloudflared
パブリックホスト名を port 4443 に接続(HTTPS)

- 結果
クライアントは 200 を得ています。HTTPS サーバーも Server hello で応答しています。クライアント 200curl https://tls.tun.oymk.work/ -sv : < HTTP/2 200 : <HTML><BODY BGCOLOR="#ffffff"> :HTTPS サーバー(pcap)server helloTransport Layer Security TLSv1.2 Record Layer: Handshake Protocol: Server Hello Content Type: Handshake (22) Version: TLS 1.2 (0x0303) Length: 89 Handshake Protocol: Server Hello Handshake Type: Server Hello (2) :
TLS proxy の設定例
特に比較検討せず、手っ取り早そうな stunnel を使いました。
Web サーバー(Nginxの例)やロードバランサーなども利用できると思います。
環境
ubuntu 22.04
stunnel 5.63
OpenSSL 3.0.2
stunnel status
sudo systemctl status stunnel
● stunnel.service - Stunnel TLS Bridge
Loaded: loaded (/etc/systemd/system/stunnel.service; enabled; vendor preset: enabled)
:
CGroup: /system.slice/stunnel.service
└─1142426 /usr/bin/stunnel4 /etc/stunnel/tls-bridge.conf
環境に応じて Backend の connect 先を変更します。
この例では同一ホストに HTTPS サーバーを立てています。
stunnel config
cat /etc/stunnel/tls-bridge.conf
##########################################
# Global stunnel settings
##########################################
pid = /var/run/stunnel4/stunnel.pid
setuid = stunnel4
setgid = stunnel4
foreground = yes
debug = notice
output = /var/log/stunnel4/stunnel.log
# 各パラメータはあくまで試験環境向け
socket = l:TCP_NODELAY=1
socket = r:TCP_NODELAY=1
sessionCacheSize = 1024
sessionCacheTimeout = 3600
sessionResume = yes
TIMEOUTbusy = 600
TIMEOUTclose = 10
TIMEOUTconnect = 30
TIMEOUTidle = 300
##########################################
# Frontend: accept modern TLS from clients
##########################################
[tls_front]
accept = 0.0.0.0:4443
connect = 127.0.0.1:8443
cert = /etc/stunnel/server.pem
key = /etc/stunnel/server-key.pem
sslVersion = TLSv1.3
ciphersuites = TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256
verifyChain = no
##########################################
# Backend: connect to legacy TLS server
##########################################
[tls_back]
accept = 127.0.0.1:8443
connect = 127.0.0.1:44443
client = yes
sslVersion = TLSv1.2
ciphers = AES256-SHA256
verifyChain = no
sni = tls.tun.oymk.work
stunnel.log debug = debug
# frontend
2025.11.04 11:39:33 LOG5[0]: Service [tls_front] accepted connection from 127.0.0.1:38486
:
2025.11.04 11:39:33 LOG6[0]: TLSv1.3 ciphersuite: TLS_AES_256_GCM_SHA384 (256-bit encryption)
:
# backend
2025.11.04 11:39:33 LOG5[1]: Service [tls_back] connected remote server from 127.0.0.1:59620
:
2025.11.04 11:39:33 LOG6[1]: TLSv1.2 ciphersuite: AES256-SHA256 (256-bit encryption)
実際にはこうなってます。
Disclaimer
- stunnel の設定は深く追っておらず、見逃しなどあるかもしれません
- 設定はあくまで試験環境のもので本番想定ではありません
- 単一接続だけでテストしたので、複数接続や負荷状況などで何か出てくるかもしれません
- cloudflared と同じサーバーに入れると cloudflared を replica で拡張する場合は TLS proxy も同様に増やすことはできそう
Discussion