Squid編譯過程中關於SSLv2出错的問題

最近需要在Ubuntu 12.04 LST上編譯安裝Squid 2.7,編譯參數中需要使用“–enable-ssl”來打開https_port功能,原本在debian上很順利的過程卻在Ubuntu上一直提示沒有sslv2的庫。

原來debian 6.0中使用的openssl是0.98,而ubuntu 12.04使用的是1.01,在1.01版本的openssl中已經直接禁用了有安全隱患的sslv2,使得squid無法完成編譯。想修改squid的源代碼來禁用sslv2,卻一直沒有成功,無奈,只能曲線救國,直接安裝debain下0.98版的openssl庫。

先刪除ubuntu安裝的1.01版本:

aptitude purge libssl libssl-dev libssl-doc

然後下載debian的deb包:

wget http://ftp.us.debian.org/debian/pool/main/o/openssl/libssl-dev_0.9.8o-4squeeze14_i386.deb
wget http://ftp.us.debian.org/debian/pool/main/o/openssl/libssl0.9.8_0.9.8o-4squeeze14_i386.deb

接著dpkg安裝即可:

dpkg -i libssl0.9.8_0.9.8o-4squeeze13_i386.deb
dpkg -i libssl-dev_0.9.8o-4squeeze13_i386.deb

因為依賴關係,先安裝libssl再安裝libssl-dev

然後編譯就一切順利啦!

當然,別忘了在squid的配置文件中禁用sslv2,畢竟有安全隱患:

options=NO_SSLv2

更新1:

最近更新了Debian 7 64位的系統,amd64位的兩個包的地址有所變更,如下:

wget http://ftp.us.debian.org/debian/pool/main/o/openssl/libssl-dev_0.9.8o-4squeeze14_amd64.deb
wget http://ftp.us.debian.org/debian/pool/main/o/openssl/libssl0.9.8_0.9.8o-4squeeze14_amd64.deb

 

從源代碼編譯Squid使之支持https代理

Debian系統下用aptitude安裝的預編譯的squid軟件包並不支持https代理,如需要使用SSL加密的https代理則需要通過stunnel來實現。其實squid很早就開始支持https加密代理了,只是一般預編譯的軟件包都沒有加入–enable-ssl這個參數。我們可以自己從源代碼編譯安裝squid,使之實現這一功能,這樣就不需要通過stunnel來中轉了。

1 編譯安裝squid

1.1 準備編譯環境

sudo aptitude install build-essential zlib1g-dev libssl-dev

因為編譯打開的選項比較多,可能還需要很多其他的依賴包,用這個命令一次搞定這些依賴包:

sudo aptitude build-dep squid

1.2 開始編譯

下載源代碼,squid3目前性能一般,我們還是編譯squid 2.7的穩定版:

cd /usr/src
wget http://www.squid-cache.org/Versions/v2/2.7/squid-2.7.STABLE9.tar.gz
tar zxvf squid-2.7.STABLE9.tar.gz
cd squid-2.7.STABLE9

root環境下,開始編譯源代碼:

./configure --prefix=/usr --exec_prefix=/usr --bindir=/usr/sbin --sbindir=/usr/sbin --libexecdir=/usr/lib/squid --sysconfdir=/etc/squid --localstatedir=/var/spool/squid --datadir=/usr/share/squid --enable-async-io --with-pthreads --enable-storeio=ufs,aufs,coss,diskd,null --enable-linux-netfilter --enable-arp-acl --enable-epoll --enable-removal-policies=lru,heap --enable-snmp --enable-delay-pools --enable-htcp --enable-cache-digests --enable-referer-log --enable-useragent-log --enable-auth=basic,digest,ntlm,negotiate --enable-negotiate-auth-helpers=squid_kerb_auth --enable-carp --enable-follow-x-forwarded-for --with-large-files --with-maxfd=65536 --enable-ssl --with-openssl

其中“–with-openssl=/usr/include/openssl”是openssl的安裝位置,根據實際情況作調整。另外,本次編譯所打開的選項與安裝位置跟debian官方源中的squid包一致,只是增加了SSL加密的功能,因此編譯安裝後的目錄與操作跟從官方源安裝的squid一樣。

如果沒有報錯,編譯後安裝即可:

make
make install

使用SSL加密代理,squid的配置文件中这么设置:

https_port 443 cert=/etc/squid/ssl.crt key=/etc/squid/ssl.key

“cert=”, “key=”的位置填入證書的實際位置即可。其他配置可以參看這篇日誌:Squid的配置說明

1.3 编译ncsa_auth

如需要使用squid的ncsa_auth認證功能,還需要編譯ncsa_auth程序

cd helpers/basic_auth/NCSA
make
cp ncsa_auth /usr/lib/squid

具體認證方式可以參看這篇日誌:設置squid的訪問密碼

2 Squid的自動啟動腳本

從源代碼編譯的squid在系統重新啓動後不會自動啓動,我們需要編輯一個自動啟動腳本,同樣是root環境下:

vim /etc/init.d/squid

插入以下配置:

#! /bin/sh
#
# squid		Startup script for the SQUID HTTP proxy-cache.
#
#
### BEGIN INIT INFO
# Provides:          squid
# Required-Start:    $network $remote_fs $syslog
# Required-Stop:     $network $remote_fs $syslog
# Should-Start:      $named
# Should-Stop:       $named
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Squid HTTP Proxy
### END INIT INFO

NAME=squid
DAEMON=/usr/sbin/squid
LIB=/usr/lib/squid
PIDFILE=/var/run/$NAME.pid
SQUID_ARGS="-D -YC"

[ ! -f /etc/default/squid ] || . /etc/default/squid

. /lib/lsb/init-functions

PATH=/bin:/usr/bin:/sbin:/usr/sbin

[ -x $DAEMON ] || exit 0

grepconf () {
	w=" 	" # space tab
	sq=/etc/squid/squid.conf
	# sed is cool.
	res=`sed -ne '
		s/^'$1'['"$w"']\+\([^'"$w"']\+\).*$/\1/p;
		t end;
		d;
		:end q' < $sq`
	[ -n "$res" ] || res=$2
	echo "$res"
}

grepconf2 () {
	w=" 	" # space tab
	sq=/etc/squid/$NAME.conf
	# sed is cool.
	res=`sed -ne '
		s/^'$1'['"$w"']\+[^'"$w"']\+['"$w"']\+\([^'"$w"']\+\).*$/\1/p;
		t end;
		d;
		:end q' < $sq`
	[ -n "$res" ] || res=$2
	echo "$res"
}

#
#	Try to increase the # of filedescriptors we can open.
#
maxfds () {
	[ -n "$SQUID_MAXFD" ] || return
	[ -f /proc/sys/fs/file-max ] || return 0
	global_file_max=`cat /proc/sys/fs/file-max`
	minimal_file_max=$(($SQUID_MAXFD + 4096))
	if [ "$global_file_max" -lt $minimal_file_max ]
	then
		echo $minimal_file_max > /proc/sys/fs/file-max
	fi
	ulimit -n $SQUID_MAXFD
}

start () {
	cdr=`grepconf2 cache_dir /var/spool/$NAME`
	ctp=`grepconf cache_dir ufs`

	case "$cdr" in
		[0-9]*)
			log_failure_msg "squid: squid.conf contains 2.2.5 syntax - not starting!"
			log_end_msg 1
			exit 1
			;;
	esac

	#
    # Create spool dirs if they don't exist.
    #
	if [ -d "$cdr" -a ! -d "$cdr/00" ] || [ "$ctp" = "coss" -a ! -w "$cdr" ]
	then
		log_warning_msg "Creating squid cache structure"
		$DAEMON $SQUID_ARGS -z
	fi

	if [ "$CHUID" = "" ]; then
		CHUID=root
	fi

	maxfds
	umask 027
	start-stop-daemon --quiet --start \
		--pidfile $PIDFILE \
		--chuid $CHUID \
		--exec $DAEMON -- $SQUID_ARGS < /dev/null
	return $?
}

stop () {
	PID=`cat $PIDFILE 2>/dev/null`
	start-stop-daemon --stop --quiet --pidfile $PIDFILE --name squid
	#
	#	Now we have to wait until squid has _really_ stopped.
	#
	sleep 2
	if test -n "$PID" && kill -0 $PID 2>/dev/null
	then
		log_action_begin_msg " Waiting"
		cnt=0
		while kill -0 $PID 2>/dev/null
		do
			cnt=`expr $cnt + 1`
			if [ $cnt -gt 24 ]
			then
				log_action_end_msg 1
				return 1
			fi
			sleep 5
			log_action_cont_msg ""
		done
		log_action_end_msg 0
		return 0
	else
		return 0
	fi
}

case "$1" in
    start)
	log_daemon_msg "Starting Squid HTTP proxy" "squid"
	if start ; then
		log_end_msg $?
	else
		log_end_msg $?
	fi
	;;
    stop)
	log_daemon_msg "Stopping Squid HTTP proxy" "squid"
	if stop ; then
		log_end_msg $?
	else
		log_end_msg $?
	fi
	;;
    reload|force-reload)
	log_action_msg "Reloading Squid configuration files"
	$DAEMON -k reconfigure
	log_action_end_msg 0
	;;
    restart)
	log_daemon_msg "Restarting Squid HTTP proxy" "squid"
	stop
	if start ; then
		log_end_msg $?
	else
		log_end_msg $?
	fi
	;;
    status)
	status_of_proc -p "$PIDFILE" "$DAEMON" squid && exit 0 || exit $?
	;;
    *)
	echo "Usage: /etc/init.d/$NAME {start|stop|reload|force-reload|restart|status}"
	exit 3
	;;
esac

exit 0

更改權限,加入系統自動啟動服務:

chmod 755 /etc/init.d/squid
insserv -v -d /etc/init.d/squid

更新:

1、如果是在ubuntu 12.04等openssl版本為1.0以上的系統中編譯會出錯,因為openssl 1.0開始已經不支持SSLv2,可以手動安裝0.98版本的libssl-dev和libssl包,詳情看這篇日誌:「Squid編譯過程中關於SSLv2出错的問題

本文參考了以下網頁:

[1] squid-cache.org. Squid configuration directive https_port. http://www.squid-cache.org/Doc/config/https_port/
[2] squid-cache wiki. Compiling Squid. http://wiki.squid-cache.org/SquidFaq/CompilingSquid