kikumotoのメモ帳

インフラ・ミドル周りを中心に、興味をもったことを適当な感じで。twitter : @takakiku

TLS1.2が使えない環境のためのProxy (squid)設定

TL;DR

接続先がTLS1.1、TLS1.2 以降しか接続を許可しなくなるけど、環境そのもののアップデートができなくて、Proxy でとりあえず逃げたいという方向けです。

Squid を使った設定例を書いてます。(参考情報 - Intercept HTTPS CONNECT messages with SSL-Bump

目次

背景

PCI DSSというクレジット業界におけるグローバルセキュリティ基準があるらしく(詳しくないです)、これのv3.2が2016/04/28が公開されました。 それによると、PCI DSSを取得している業者は

  • 2016/06/30 までに TLS1.1 以上の通信をサポートしなければならない
  • 2018/06/30 までに SSL および TLS1.0 の通信を無効化しなければならない

ことになるようです。

参考記事

実際PayPal は 2017/06 には TLS1.2 のみの接続しかできなくなるようです。

まぁ普通はOpenSSLの1.0/1.1系の最新バージョンを使っていればなんの問題もないです。

しかし、世の中には様々な闇のような理由でSSL3ぐらいまでしかサポートしていない環境で運用している人もいるでしょう。

そこでProxyで頑張ってみる(臭いものに蓋をする)にはどうすればいいのかを調べてみました。

今回試す構成

client(CentOS5 + curl) <--> Proxy (CentOS7 + squid 3.5) <--> Web

というイメージです。

Squid

3.5インストール

Squid 3.5 を使います。

/etc/yum.repos.d/squid.conf を下記のように用意して

[squid]
name=Squid repo for CentOS Linux - $basearch
#IL mirror
baseurl=http://www1.ngtech.co.il/repo/centos/$releasever/$basearch/
failovermethod=priority
enabled=1
gpgcheck=0

epelも有効にしたうえで yum コマンドでインストール

yum install perl-Crypt-OpenSSL-X509 squid squid-helpers

自己署名証明書作成

クライアントから見るとTLSでのやりとりはProxyとなるので、Proxyに証明書が必要となります。 これを準備します。

cd /etc/squid
mkdir ssl_cert
chown squid:squid ssl_cert
chmod 700 ssl_cert
cd ssl_cert
openssl req -new -newkey rsa:2048 -sha256 -days 365 -nodes -x509 -keyout myCA.pem  -out myCA.pem

squid.conf

/etc/squid/squid.conf を以下のように記述。

visible_hostname は適当。

lan のアドレス帯は自分の環境にあわせて修正ですね。

visible_hostname my.example.com

acl CONNECT method CONNECT
acl lan src 192.168.2.0/255.255.254.0

http_access allow localhost
http_access allow lan
http_access deny all

http_port 3128 ssl-bump \
  cert=/etc/squid/ssl_cert/myCA.pem \
  generate-host-certificates=on dynamic_cert_mem_cache_size=4MB

acl step1 at_step SslBump1

ssl_bump peek step1
ssl_bump bump all

sslproxy_options NO_SSLv2,NO_SSLv3,NO_TLSv1,SINGLE_DH_USE

forwarded_for off
request_header_access Referer deny all
request_header_access X-Forwarded-For deny all
request_header_access Via deny all
request_header_access Cache-Control deny all

sslproxy_options ですが、TLS1.1 も制限したいなら NO_TLSv1_1 を加えます。(参考 - squid : sslproxy_options configuration directive

SSL certificates cache directory

/usr/lib64/squid/ssl_crtd -c -s /var/lib/ssl_db
chown squid:squid -R /var/lib/ssl_db

起動

systemctl start squid

結果

CentOS5 から TLS1.2 のみの環境に接続してみると(下記のコマンドの接続先は実在するものではないです)

$ curl https://hogehoge.xxxx.xxxx/
curl: (35) Unknown SSL protocol error in connection to hogehoge.xxxx.xxxx:443

となるが、proxy (ここでは 192.168.2.241 とします)を経由すると

$ curl -k --proxy 192.168.2.241:3128 https://hogehoge.xxxx.xxxx/
<!DOCTYPE html>
<html lang="en">
<head>
以下略

のように接続ができます。

Webサーバ側のログに接続に使われたSSL/TLSのバージョンを出力するようにしてあれば

xxx.xxx.xxx.xxx - - [03/Jun/2016:21:36:26 +0900] "GET / HTTP/1.1" TLSv1.2/ECDHE-RSA-AES128-GCM-SHA256 200 45838 "-" "curl/7.15.5 (i686-redhat-linux-gnu) libcurl/7.15.5 OpenSSL/0.9.8b zlib/1.2.3 libidn/0.6.5" "-" 

のように TLSv1.2 で繋がっていることが確認できます。

まとめ

clientがTLS1.1 TLS1.2 に対応できていなくても、Proxy 側でサーバとのTLSの接続をさせることで、なんとか接続する方法を書きました。

まぁ、普通はちゃんとclientの環境をバージョンアップしているのでこんなことはしなくてよいでしょう。臭いものに蓋をすると一生そこは闇になります。