squidを利用したssl終端/中継型(SSL Bump)のプロキシサーバを構築して動作検証します。
目次
環境
1.ネットワークセキュリティ設定
2.Squidインストール
3.自己署名証明書の作成
4.証明書キャッシュ作成
5.squid.conf設定
5.1 access.logの時刻可読化
5.2 localネットワーク設定のコメントアウト
5.3 ポート設定およびSSL Bump設定
5.4 ACL設定
5.5 squid.service再起動
6.クライアントのプロキシ接続設定
6.1 証明書インストール
6.2 IEプロキシ設定
6.3 winhttpプロキシ設定
7.Webアクセス確認
参考
環境
プロキシサーバ
OS:AlmaLinux 9.4
Proxy:squid-5.5-19.el9_6.1.x86_64
クライアント
OS:Windows Server 2022 Standard
1.ネットワークセキュリティ設定
今回は検証環境のため、ファイアウォール設定やSELinux設定を停止しておきます。
本番環境などについてはプロジェクトの方針に従って厳に設定してください。
### 設定して再起動 ###
# systemctl disable firewalld
# grubby --update-kernel ALL --args selinux=0
# shutdown -r now
### 再起動後の確認 ###
# systemctl status firewalld
○ firewalld.service - firewalld - dynamic firewall daemon
Loaded: loaded (/usr/lib/systemd/system/firewalld.service; disabled; preset: enabled)
Active: inactive (dead)
# getenforce
Disabled
2.Squidインストール
Squidをインストールして起動します。
# dnf -y install squid
(中略)
完了しました!
# systemctl enable squid
# systemctl start squid
# systemctl status squid
3.自己署名証明書の作成
オレオレ証明書を発行します。
# mkdir /etc/squid/ssl_cert
# cd /etc/squid/ssl_cert
# openssl genrsa -out PrxCA.key 4096
# openssl req -new -x509 -days 3650 -key PrxCA.key -out PrxCA.pem \
-subj "/C=JP/ST=Tokyo/L=Chiyoda/O=MyOffice/OU=MyDepartment/CN=MyProxy"
# openssl x509 -in PrxCA.pem -outform DER -out PrxCA.cer
| ファイル | 役割 | 配置先 | 形式 |
|---|---|---|---|
| PrxCA.key | 秘密鍵 | プロキシサーバ | RSA公開鍵暗号方式 |
| PrxCA.pem | 証明書、秘密鍵を含む | プロキシサーバ | X509形式 |
| PrxCA.cer | 証明書、公開鍵を含む | クライアント | DER形式 |
4.証明書キャッシュ作成
SquidがSSL Bumpを利用して中間者となる際に、Squidが動的に作成するクライアント向けの偽装サーバ証明書のキャッシュを作成します。
# /usr/lib64/squid/security_file_certgen -c -s /var/lib/ssl_db -M 20MB
# chown -R squid:squid /var/lib/ssl_db
偽装サーバ証明書を作成する理由としては、 「プロキシサーバから返却されたWebページ内容とサーバ証明書について、クライアント側で正しいと認識させるため」 です。
そのためにはWebページ単位で偽造サーバ証明書をSquidが作成しなければならず(動的作成)、都度作成の負荷を低減するためにキャッシュを作成しておきます。
5.squid.conf設定
Squidの設定を実施します。事前にバックアップを取得することを推奨します。
# cp -p /etc/squid/squid.conf /etc/squid/squid.conf_org
# ll /etc/squid/squid.conf*
5.1 access.logの時刻可読化
デフォルトのログ設定の場合、時刻表記がUNIX時刻となっているので、時刻フォーマットを設定して読めるようにします。
以下の内容をsquid.conf内に追記します。
logformat datefmt %{%Y/%m/%d %H:%M:%S}tl.%03tu %6tr %>a %Ss/%03>Hs %<st %rm %ru %[un %Sh/%<a %mt
access_log daemon:/var/log/squid/access.log datefmt
access.logは以下のように変わります。
before
1762905331.621 69 192.168.142.51 NONE_NONE/200 0 CONNECT www.google.com:443 - HIER_DIRECT/142.251.42.196 -
after
2025/11/12 09:00:54.768 77 192.168.142.51 NONE_NONE/200 0 CONNECT www.google.com:443 - HIER_DIRECT/142.251.42.132 -
5.2 localネットワーク設定のコメントアウト
localネットワーク関連のデフォルト設定(アクセス許可設定)をコメントアウトしておきます。
# 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
↓
# http_access allow localnet
# http_access allow localhost
5.3 ポート設定およびSSL Bump設定
SSL Bumpに関する設定を実施します。
合わせてデフォルトのプロキシ受付ポート(3128)から別ポート(8088)に設定しておきます。
# Squid normally listens to port 3128
http_port 3128
↓
# Squid normally listens to port 3128
# http_port 3128
http_port 8088 ssl-bump \
cert=/etc/squid/ssl_cert/PrxCA.pem \
key=/etc/squid/ssl_cert/PrxCA.key \
generate-host-certificates=on dynamic_cert_mem_cache_size=20MB
sslcrtd_program /usr/lib64/squid/security_file_certgen -s /var/lib/ssl_db -M 20MB
sslcrtd_children 10
acl step1 at_step SslBump1
ssl_bump peek step1
ssl_bump bump all
下部3行についてを解説します。
acl step1 at_step SslBump1
SSL Bumpのstep1(SslBump1)について、step1というACL名を付与します。
(SSL Bumpはstep1~step3の3段階のステップがあります)
ssl_bump peek step1
step1について、peek処理を行います。
(Step1:ClientHelloの受信時、peek:TLSハンドシェイク内のSNIを見る)
ssl_bump bump all
その他のステップ(step2と3)について、bump処理を行います。
(Step2:Webサーバ接続時およびStep3:Webサーバ証明確認時に、bump:プロキシサーバとWebサーバ間でのTLSセッションを作成する)
peek/bump以外にも、splice:中継するだけ、terminate:接続終了などの処理があります。
5.4 ACL設定
URLフィルタリング処理を行います。
SSL Bump利用の醍醐味といえる、URL(URI)フィルタリングを実施します。
なお、今回は以下の許可/拒否URLをターゲットに設定をします。
■許可URL
https://ja.wikipedia.org/wiki/100
■不許可
許可URL以外、例として下記
https://ja.wikipedia.org
https://ja.wikipedia.org/wiki/1000
https://ja.wikipedia.org/wiki/10000
### port
acl port_web port 80
acl port_web port 443
### method
acl CONNECT method CONNECT
acl GET method GET
### url
acl wikipedia url_regex ^https:\/\/ja\.wikipedia\.org\/wiki\/100$
### http_access
http_access allow CONNECT
http_access allow wikipedia port_web GET
http_access deny all
methodに関する記述について解説します。
クライアント/プロキシ/Webサーバ間では利用されるmethodが異なります。
[クライアント] - CONNECT -> [プロキシ] - GET -> [Webサーバ]
また、Squid/SSL Bumpにおいては各methodで以下を認識します。
・CONNECT:SNI(FQDN)・・・ja.wikipedia.org
・GET:URL(URI)・・・https://ja.wikipedia.org/wiki/100
もしmethodを意識しないでhttp_accessを記述してしまうと、CONNECTおよびGETの両methodに対して評価が走ります。 結果、URL形式でフィルタリングを掛けた場合、最初に発生する通信であるCONNECT methodはSNI認識だけをするため、CONNECT通信が遮断されます。
よって、CONNECT通信については全許可をするか、SNI(FQDN)形式でのhttp_access許可を与えておくことを推奨します。
5.5 squid.service再起動
サービス再起動を実施します。
# systemctl restart squid
http_access修正については、以下のコマンドで文法チェックおよび即時反映が可能です。
squid -k parse
squid -k reconfigure
また、念のためポート開放ができているかを確認します。
# ss -ltn
# ss -lt
ここまででプロキシサーバ側の準備が完了しました。
6.クライアントのプロキシ接続設定
クライアント側の設定をごく簡単に記載します。
6.1 証明書インストール
証明書ファイル(PrxCA.cer)をダブルクリックし、インストールウィザードに従ってインストールしてください。
証明書ストアの選択では、 「信頼されたルート証明機関」 を選択するようしてください。
6.2 IEプロキシ設定
Windows設定メニューを開き、以下の通り遷移します。
「ネットワークとインターネット」
ー「プロキシ」
ー「手動プロキシセットアップ」
プロキシサーバを使う:オン
アドレス:プロキシサーバのIPアドレス
ポート:プロキシサーバのプロキシポート
→「保存」
6.3 winhttpプロキシ設定
ブラウザ以外のアプリケーション/システム系が利用するプロキシ設定になります。
コマンドプロンプトまたはPowershellを管理者権限で起動します。
以下のコマンドを打鍵してwinhttpプロキシ設定を行います。
> netsh winhttp set proxy [IPアドレス]:[ポート]
以下のコマンドで設定内容確認ができます。
> netsh winhttp show proxy
7.Webアクセス確認
クライアントからWebアクセス確認をします。
■許可URL
https://ja.wikipedia.org/wiki/100
■不許可
許可URL以外、例として下記
https://ja.wikipedia.org
https://ja.wikipedia.org/wiki/1000
7.1 許可URLアクセス確認
アクセスログからもCONNECT/GET methodそれぞれが200 OKとなっていることが確認できました。
2025/11/13 00:32:11.631 153 192.168.142.51 NONE_NONE/200 0 CONNECT ja.wikipedia.org:443 - HIER_DIRECT/103.102.166.224 -
2025/11/13 00:32:11.895 263 192.168.142.51 TCP_MISS/200 54299 GET https://ja.wikipedia.org/wiki/100 - HIER_DIRECT/103.102.166.224 text/html
Webサーバ証明書について、プロキシサーバの自己署名証明の配下にwikipediaのサーバ証明書がネストされていることが確認されました。

7.2 不許可URLアクセス確認
https://ja.wikipedia.org について、アクセスNG/想定値となることが確認できました。
https://ja.wikipedia.org/wiki/1000 について、アクセスNG/想定値となることが確認できました。
なお、両ページともにWebサーバ証明書については取得できている状態でした。

参考





