💇‍♂️

cloudflared の https 接続でユルめの cipher に対応する

に公開

はじめに

cloudflaredHTTPS がサポートする 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 が返ってます。
    クライアント 502
    curl https://tls.tun.oymk.work/ -sv
    :
    < HTTP/2 502
    :
    error code: 502%
    
    HTTPS サーバーでは cipher ミスマッチを観測し、Handshake Failure Alert が見れます。
    HTTPS サーバー(log)no shared cipher
    40B7DBB51B7C0000:error:0A0000C1:SSL routines:tls_post_process_client_hello:no shared cipher:../ssl/statem/statem_srvr.c:2220:
    
    HTTPS サーバー(pcap)Handshake Failure
    Transport 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 を得ています。
    クライアント 200
    curl https://tls.tun.oymk.work/ -sv
    :
    < HTTP/2 200
    :
    <HTML><BODY BGCOLOR="#ffffff">
    :
    
    HTTPS サーバーも Server hello で応答しています。
    HTTPS サーバー(pcap)server hello
    Transport 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