SquidでSSL Bumpを設定する方法【プロキシ経由でhttps復号】

Winodws
この記事は約22分で読めます。

SSL Bump を設定しようとして、こんな壁にぶつかっていませんか?

  • OpenSSL の使い方が分からず先に進めない
  • SSL Bump を設定した後、https のサイトが開けない(Squid 経由でエラーになる)

本記事では、筆者が実際に検証し、”確実に動作した手順のみ”をまとめています。

OpenSSL での証明書作成、Squid.conf の記述、SSL Bump の有効化、そして動作確認まで順番に進めるだけで SSL Bump を再現できるよう構成しています。

本記事が読者のお役に立てることを願っています。

はじめに

本記事は、
「Squidの基本設定はできるが、SSL通信の仕組みや証明書周りに自信がない初~中級者」
を対象にしています。

  • OpenSSLの経験がほとんどない
  • 自作CAの仕組みが曖昧
  • SSL Bumpの設定で毎回つまずいてしまう

このような方が「確実にSSL Bumpを動かせるようになる」ことがゴールです。

SSL Bumpとは?

SSL Bumpは一言で言えばクライアント端末のweb通信を復号して中身を見る機能です。

通常、Squidは「クライアントとwebサーバー間」の通信は暗号化されているため、通信の中身を見ることはできません。

SSL通信の復号が必要な理由

いくつか理由はありますが、必要な理由(用途)として以下が考えられます。

  • ”どのサイトへアクセスしたまで”アクセスログを残したい
  • httpsのサイトに対してもsquidのブロックページを表示させたい

SSL Bumpの動作フロー

まずは以下イラストをご確認ください。

SSL Bumpは一言で言うと
クライアント端末とsquid間」、「squidとwebサーバー間」で2つTLSのセッションを張ります。

Squidはクライアント側がwebアクセスを試みた際に、偽のwebサーバーとしての振る舞いを行います。

そして実際に暗号化された通信を復号して、再度、squid側で暗号化した通信を本物のwebサーバーと行います。

今回の検証環境

ネットワーク構成図

簡単な構成図になりますが、今回は2台のPCを使い「SSl Bump」の検証を行っていきます。

使用ソフト(Squid / OpenSSL / OS)

SquidとOpenSSLのバージョンは以下の通りです。

ソフト名バージョン
OpenSSLOpenSSL 3.6.0 1 Oct 2025
(Library: OpenSSL 3.6.0 1 Oct 2025)
SquidVersion 4.14

使用したOSのバージョンは以下の通りです。

役割OSエディションバージョン
プロキシサーバーWindows Server 2022
Standard Evaluation
バージョン 21H2 (OS ビルド 20348.587)
プロキシクライアントWindows 11 Enterprise Evaluationバージョン 24H2 (OS ビルド 26100.7171)

SSL Bumpに必要な自己証明書の準備

Open SSLで秘密鍵の作成

  • step.1
    Squidフォルダー直下に「ssl_cert」フォルダーを新規で作成する
  • step.2
    OpenSSLにてCAの秘密鍵を作成する

    OpenSSLの以下コマンドを入力します

    openssl genrsa -out myCA.key 4096

    ファイルを作成する前にカレントディレクトリを分かりやすい場所に移しておくとファイルが生成されたことを確認しやすい

    以下はデスクトップへカレントディレクトリを移した例です

    C:\Users\Administrator>cd Desktop
    C:\Users\Administrator\Desktop>
  • step.3
    CAの秘密鍵が作成されていることを確認する

    実際に作成されたファイルは以下のようなアイコンをしています

  • step.4
    「ssl_cert」フォルダーにCAの秘密鍵を格納する

    本手順と同じようにデスクトップに作成している場合は、ドラッグ&ドロップで入れてください

Open SSLでCA証明書を作成

  • step.1
    OpenSSLでCA証明書を作成する
    openssl req -new -x509 -days 3650 -key myCA.key -out myCA.crt

    作成途中でいくつか質問があります。


    今回は検証になりますので仮で入力していきます。

    Country Name (2 letter code) [AU]:JP
    State or Province Name (full name) [Some-State]:Tokyo
    Locality Name (eg, city) []:Shinjuku
    Organization Name (eg, company) [Internet Widgits Pty Ltd]:Proxy-test
    Organizational Unit Name (eg, section) []:
    Common Name (e.g. server FQDN or YOUR name) []:Proxy-CA-Test
    Email Address []:
  • step.2
    CA証明書が生成されていることを確認する

    CA証明書の生成が問題なく行われると以下の通りファイルが作成されます。

  • step.3
    「ssl_cert」フォルダーにCA証明書を格納する

    先ほどの手順同様、ドラッグ&ドロップで入れてください

証明書DBの作成

  • step.1
    「ssl_db」フォルダーを作成する

    コマンドプロンプトで以下コマンドを入力する

    "C:\Squid\lib\squid\security_file_certgen.exe" -c -s "C:\Squid\ssl_db" -M 4MB

    コマンド入力が成功したポイントは「Done」と表示されるか否かになります

    Initialization SSL db...
    Done
    C:\Users\Administrator\Desktop>

    もし、以下の通りエラーが表示される場合は文末の「よくあるエラーと対処法」を確認してみてください。

  • step.2
    「ssl_db」フォルダーが作成されていることを確認する

    「ssl_db」フォルダー内にも以下の通りフォルダ、及びファイルが生成されています

    「cert」フォルダー内に動的に生成された証明書がストックされていきます

    ▼フォルダー作成直後

    ▼SSL Bumpで通信を何度か発生させた後

SquidでSSL Bumpを有効化する

  • step.1
  • step.2
    もともとのhttp_portを無効化する

    次手順で「SSL Bump」用のhttp_portを作成するためになります。
    「#」を先頭につけてコメントアウトします

    追記箇所は以下の通り(緑色でハイライトした箇所)

    #http_portの無効化
    # Squid normally listens to port 3128
    #http_port 3128
  • step.3
    SSL Bump用のhttp_portを新規で定義する

    コマンドは以下の通りになります

    # SSL Bump 用のポート定義
    
    http_port 3128 ssl-bump \
    	cert=C:\Squid\ssl_cert\myCA.crt \
    	key=C:\Squid\ssl_cert\myCA.key \
    	generate-host-certificates=on dynamic_cert_mem_cache_size=4MB

    コマンドの補足になりますが、

    • http_port 3128 ssl-bump
      プロキシ用のポートを新たに定義し、SSL Bumpの設定を有効化しています
    • cert=C:\Squid\ssl_cert\myCA.crt
      クライアント側に提示する自己証明書のフォルダーパスです
    • key=C:\Squid\ssl_cert\myCA.key
      Squidが動的な偽の証明書を作成するときに、この鍵で署名します
    • generate-host-certificates=on
      アクセスしたwebサイトごとの証明書を自動で作成する機能を有効化します
    • dynamic_cert_mem_cache_size=4MB
      生成した証明書をメモリ上にキャッシュする容量を指定しています(4MB)

    \」バックスラッシュで行継続できます

  • step.4
    証明書生成プログラムとDBを指定する

    コードは以下の通りです

    # 動的証明書生成プログラムとDBの指定
    
    sslcrtd_program C:\Squid\lib\squid\security_file_certgen.exe -s C:\Squid\ssl_db -M 4MB
    sslcrtd_children 5

    こちらも補足を入れます

    • sslcrtd_program C:\Squid\lib\squid\security_file_certgen.exe -s
      「ssl_db」フォルダーを作成するときに使用した「証明書生成ツール」です
    • C:\Squid\ssl_db
      証明書生成ツールが使うDBを指定
    • -M 4MB
      証明書生成ツールのプロセスのメモリ上限を指定
    • sslcrtd_children 5
      証明書生成ツールのプロセスを最大5個まで並列で動かす指定
      同時に複数サイトへアクセスしても詰まりにくくする役割です
  • step.5
    SSL Bump用のACLを定義

    コードは以下のとおりです

    acl step1 at_step SslBump1

    補足になります

    • acl step1 at_step SslBump1
  • step.6
    実際のSSL Bump動作指定

    コードは以下のとおりです

    ssl_bump peek step1
    ssl_bump bump all

    最後の補足になります

    • ssl_bump peek
      完全に暗号化を解除せずに、ClientHelloだけを除くモード
    • step1
      先ほど定義した「SslBump1のタイミング」
      どのSNI(どのサイトへ行きたいか)などの情報を読み取れるようになります
    • ssl_bump bump
      今回の目的の「SSLを復号して、中身を読めるようにする」モード
    • all
      対象サイトを指定(すべて)
  • step.7
    Squid Terminalで構文チェックをします

    構文チェックのコマンドは以下のとおりです

    squid -k parse

    追加したコマンドの行が「Processing」になっていればOKです

上記設定だけでは、まだSSL Bumpの設定は不十分になります。

この設定のままですとクライアント端末からwebサイトへアクセスした際に以下のようなエラーでアクセスできません。

理由は、squid側がアクセスしたときにexample.comから提示されたサーバー証明書を信頼していないからです。

そのため、squid側にWindowsの証明書ストアのように証明書ファイルを読み込ませる必要があります。

以下の通り手順を進めてください。

  • step.1
    https://curl.se/docs/caextract.htmlへアクセスします
    CA file revisions per date of appearance内の一番新しい日付をクリックします
  • step.2
    pemファイルがダウンロードされたことを確認します
  • step.3
    Squidフォルダー内に新規で「cert」フォルダーを作成します
  • step.4
    先ほどダウンロードしたpemファイルを「cert」へ移します
  • step.5
    ファイル名、およびファイル拡張子を「ca-bundle.crt」へ変更します

    警告文が出ますが「はい」を選択します

  • step.6
    アイコン、ファイル名の変化を確認します
  • step.7
    Squid.confを編集します
    SSL Bumpの設定箇所の一番下にコマンドを追加します

    追加コマンドは以下のとおりです

    #Squidがインターネット側のサーバー証明書を検証する際に使うCA
    tls_outgoing_options cafile=C:\Squid\cert\ca-bundle.crt
  • step.8
    Squid Terminalで構文チェックをします

    構文チェックのコマンドは以下のとおりです

    squid -k parse

    追加したコマンドの行が「Processing」になっていればOKです

squid.confの設定例

上記でご紹介した手順とコメントアウトの内容が異なりますが、squid.confの設定例になります。
今回投入しているコマンドは緑色でハイライトしました。

Squid.confの中身
#
# Recommended minimum configuration:
#

# Example rule allowing access from your local networks.
# Adapt to list your (internal) IP networks from where browsing
# should be allowed

acl localnet src 10.0.0.0/8	# RFC1918 possible internal network
acl localnet src 172.16.0.0/12	# RFC1918 possible internal network
acl localnet src 192.168.0.0/16	# RFC1918 possible internal network
acl localnet src fc00::/7       # RFC 4193 local private network range
acl localnet src fe80::/10      # RFC 4291 link-local (directly plugged) machines

acl SSL_ports port 443
acl Safe_ports port 80		# http
acl Safe_ports port 21		# ftp
acl Safe_ports port 443		# https
acl Safe_ports port 70		# gopher
acl Safe_ports port 210		# wais
acl Safe_ports port 1025-65535	# unregistered ports
acl Safe_ports port 280		# http-mgmt
acl Safe_ports port 488		# gss-http
acl Safe_ports port 591		# filemaker
acl Safe_ports port 777		# multiling http
acl CONNECT method CONNECT

#検証用のALC定義を追加
acl deny_mysite_test_1 dstdomain .kuwamakurano98.com


#
# Recommended minimum Access Permission configuration:
#

#検証用のALCを適用
http_access deny deny_mysite_test_1

# Only allow cachemgr access from localhost
http_access allow localhost manager
http_access deny manager

# Deny requests to certain unsafe ports
http_access deny !Safe_ports

# Deny CONNECT to other than secure SSL ports
http_access deny CONNECT !SSL_ports

# We strongly recommend the following be uncommented to protect innocent
# web applications running on the proxy server who think the only
# one who can access services on "localhost" is a local user
#http_access deny to_localhost

#
# INSERT YOUR OWN RULE(S) HERE TO ALLOW ACCESS FROM YOUR CLIENTS
#

# Example rule allowing access from your local networks.
# Adapt localnet in the ACL section to list your (internal) IP networks
# from where browsing should be allowed
http_access allow localnet
http_access allow localhost

# And finally deny all other access to this proxy
http_access deny all


# ==== ここから SSL Bump 関連設定 ====

# もともとの http_port 3128 をコメントアウト
# Squid normally listens to port 3128
#http_port 3128

# SSL Bump 用のポート定義

http_port 3128 ssl-bump \
	cert=C:/Squid/ssl_cert/myCA.crt \
	key=C:/Squid/ssl_cert/myCA.key \
	generate-host-certificates=on dynamic_cert_mem_cache_size=4MB

# 動的証明書生成プログラムと DB の指定
sslcrtd_program C:/Squid/lib/squid/security_file_certgen.exe -s C:/Squid/ssl_db -M 4MB
sslcrtd_children 5

# SSL Bump のステップ用 ACL
acl step1 at_step SslBump1

# 1段階目でClientHelloを覗く(peek)、その後はbump = 復号
ssl_bump peek step1
ssl_bump bump all

tls_outgoing_options cafile=C:/Squid/cert/ca-bundle.crt

# ==== SSL Bump 設定ここまで ==== 

# Uncomment the line below to enable disk caching - path format is /cygdrive/<full path to cache folder>, i.e.
#cache_dir aufs /cygdrive/d/squid/cache 3000 16 256


# Leave coredumps in the first cache dir
coredump_dir /var/cache/squid

# Add any of your own refresh_pattern entries above these.
refresh_pattern ^ftp:		1440	20%	10080
refresh_pattern ^gopher:	1440	0%	1440
refresh_pattern -i (/cgi-bin/|\?) 0	0%	0
refresh_pattern .		0	20%	4320

dns_nameservers 8.8.8.8 208.67.222.222

max_filedescriptors 3200


# ブロック時は Squid 標準ページを表示(リダイレクトしない)
deny_info ERR_ACCESS_DENIED deny_mysite_test_1

#日本語用のエラーページを表示
error_directory C:/Squid/usr/share/squid/errors/ja

手順通りやってもうまく動作しない場合に、コピペ用としてご活用ください

WindowsにCA証明書をインポートする手順

試しにインポート前にhttpsで以下サイトへアクセスしようとすると以下の通り警告文が表示されます。

https://example.com
警告文が表示されいている画像

Windowsの証明書ストアにOpenSSLで作成した自己証明書がインポートされていないことが原因になります。

以上を踏まえてWindowsクライアントに先ほどOpenSSLで発行した自己証明書をインポートしていきます。

  • step.1
    OpenSSLで作成したmyCA.crtをクライアント端末側にコピーします

    一時的に共有フォルダーを作成するのがラクです
    ※コピーが終わりましたら、共有は解除してください

  • step.2
    「開く」を選択します
  • step.3
    「証明書のインストール」をクリックします
  • step.4
    「ローカル コンピューター」をクリックします
  • step.5
    ユーザーアカウント制御が出るため、「はい」を選択します
  • step.6
    「証明書をすべて次のストアに配置する」を選択し、参照をクリックします
  • step.7
    「信頼されたルート証明機関」を選択し、「OK」をクリックします
  • step.8
    証明書ストアに先ほど選択した「信頼されたルート証明機関」が入力されていることを確認し、「次へ」をクリックします
  • step.9
    「完了」をクリックします
  • step.10
    「OK」をクリックします
  • step.11
    「OK」をクリックします

動作確認(httpsサイトを実際に中継)

実際にwindowsクライアント側からexample.comへアクセスを行いたいと思います。

確認項目は以下2点になります。

  • webブラウザーで自己証明書を確認する(警告がでないことも確認)
  • squid側でログを復号されたログが生成されていることを確認

ブラウザでの証明書検証

  • step.1
    windowsクライアント側からexample.comへアクセスする
  • step.2
    証明書ビュアーから自己証明書が使われていることを確認する

ログで復号できているか確認

クライアント側でexample.comへアクセスした後にsquid側のログを確認します。

以下がexample.comに関するログの抜粋になります。
※実際は大量のログが発生しますので、検索を使って抽出することをおすすめします。

2025/11/30 17:42:40 1764492160.251    125 10.0.2.20 TCP_MISS/200 799 GET https://example.com/ - HIER_DIRECT/23.220.75.232 text/html
2025/11/30 17:42:40 1764492160.468    159 10.0.2.20 TCP_MISS/404 1009 GET https://example.com/favicon.ico - HIER_DIRECT/23.220.75.232 text/html

補足になりますが、
SSL Bumpなしでブラウザでexample.comへアクセスした場合、
Squidは暗号化された通信を中継するだけ役割になるため、ログからは詳細が確認ができません

SSL Bumpなしでアクセスした場合のログ

google chromeを開きexample.comへアクセスしただけのログになります

2025/11/30 18:13:33 1764494013.867    379 10.0.2.20 TCP_TUNNEL/200 7319 CONNECT clientservices.googleapis.com:443 - HIER_DIRECT/216.58.220.99 -
2025/11/30 18:13:33 1764494013.868     71 10.0.2.20 TCP_TUNNEL/200 39 CONNECT ogads-pa.clients6.google.com:443 - HIER_DIRECT/142.250.206.202 -
2025/11/30 18:13:33 1764494013.869    374 10.0.2.20 TCP_TUNNEL/200 45355 CONNECT www.google.com:443 - HIER_DIRECT/142.250.76.36 -
2025/11/30 18:13:33 1764494013.869    284 10.0.2.20 TCP_TUNNEL/200 5893 CONNECT www.google.com:443 - HIER_DIRECT/142.250.76.36 -
2025/11/30 18:13:33 1764494013.902    407 10.0.2.20 TCP_TUNNEL/200 6520 CONNECT accounts.google.com:443 - HIER_DIRECT/173.194.174.84 -
2025/11/30 18:13:35 1764494015.396   1526 10.0.2.20 TCP_TUNNEL/200 11211 CONNECT ogads-pa.clients6.google.com:443 - HIER_DIRECT/142.250.206.202 -
2025/11/30 18:13:35 1764494015.396   1299 10.0.2.20 TCP_TUNNEL/200 11352 CONNECT ogads-pa.clients6.google.com:443 - HIER_DIRECT/142.250.206.202 -
2025/11/30 18:13:35 1764494015.396    591 10.0.2.20 TCP_TUNNEL/200 8794 CONNECT play.google.com:443 - HIER_DIRECT/172.217.31.142 -
2025/11/30 18:13:35 1764494015.399    848 10.0.2.20 TCP_TUNNEL/200 4858 CONNECT www.google.com:443 - HIER_DIRECT/142.250.76.36 -
2025/11/30 18:13:35 1764494015.399    389 10.0.2.20 TCP_TUNNEL/200 9034 CONNECT play.google.com:443 - HIER_DIRECT/172.217.31.142 -
2025/11/30 18:13:35 1764494015.413     59 10.0.2.20 TCP_TUNNEL_ABORTED/200 39 CONNECT update.googleapis.com:443 - HIER_DIRECT/142.250.196.99 -
2025/11/30 18:13:35 1764494015.432      0 10.0.2.20 TCP_DENIED/403 3709 CONNECT mtalk.google.com:5228 - HIER_NONE/- text/html
2025/11/30 18:13:35 1764494015.512     80 10.0.2.20 TCP_TUNNEL/200 39 CONNECT android.clients.google.com:443 - HIER_DIRECT/142.250.206.238 -
2025/11/30 18:13:35 1764494015.512    113 10.0.2.20 TCP_TUNNEL/200 39 CONNECT update.googleapis.com:443 - HIER_DIRECT/142.250.196.99 -
2025/11/30 18:13:43 1764494023.721     11 10.0.2.20 NONE/503 0 CONNECT inputsuggestions.msdxcdn.microsoft.com:443 - HIER_NONE/- -

コメント

タイトルとURLをコピーしました