這幾天挺忙的,大部分時(shí)間都浪費(fèi)在折騰代理上了。因?yàn)榭蛻舻墓ぷ鳝h(huán)境對信息安全特別看重,所有的辦公機(jī)器默認(rèn)都是不能上網(wǎng)的,如果要上,則要申請一個(gè)賬號,然后配置一個(gè)代理。就是這個(gè)代理把我搞得半死。
代理有很多種使用方式,通常是為了讓瀏覽器能夠訪問網(wǎng)站,而我現(xiàn)在的主要需求不是瀏覽器,而是所有其他非瀏覽器的使用,例如在Linux系統(tǒng)下安裝配置軟件、編譯打包代碼等等。這個(gè)代理是需要驗(yàn)證的,實(shí)際使用中碰到了各種麻煩,浪費(fèi)了我不少時(shí)間。
其中之一就是通過apt或者yum等工具安裝軟件包,這個(gè)其實(shí)很好解決,只要配置http-proxy和https-proxy兩個(gè)環(huán)境變量就可以了,這兩個(gè)環(huán)境變量一旦配置,Linux下很多程序都會默認(rèn)使用,例如curl、wget,這是個(gè)非常不錯(cuò)的慣例,而且這兩個(gè)變量還支持用戶名和密碼身份認(rèn)證。如果有些ip或者域名不需要代理,可以設(shè)置no-proxy環(huán)境變量。除了wget這些工具,所有ruby、python等的包安裝工具或者庫都基本上會尊重系統(tǒng)代理設(shè)置。
但是這兩個(gè)變量還沒有解決所有問題。https協(xié)議的處理是一個(gè)麻煩的地方。如果代理服務(wù)器沒有對https證書進(jìn)行良好處理,那么你會發(fā)現(xiàn)很多https協(xié)議的資源你都沒法正常訪問,因?yàn)樽C書得不到驗(yàn)證,通常如果是本地證書驗(yàn)證失敗,很多工具提供了不驗(yàn)證證書的選項(xiàng),例如curl和wget都可以選擇不進(jìn)行證書驗(yàn)證(例如curl的--insecure),但是如果是代理服務(wù)端的證書驗(yàn)證失敗,那么基本上你是沒辦法了。注意apt-get的一些源需要gpg證書,而這些證書往往都放在https資源上。
有一些工具是不太尊重Linux慣例的,java大概就屬于其中一個(gè)。所有的java工具,如果要設(shè)置代理,大概都要通過jvm屬性來設(shè)置,具體說就是通過-Dhttp.proxyHost、-Dhttp.proxyPort、-Dhttp.proxyUser、-Dhttp.proxyPass一系列屬性來設(shè)置代理信息,比如我在使用sbt的時(shí)候,就需要把這些參數(shù)附給sbt命令行工具;在使用maven的時(shí)候,則要在~/.m2/settings.xml里用maven的配置語法來設(shè)置代理信息。很遺憾的是當(dāng)代理需要身份驗(yàn)證的時(shí)候,java的user和pass參數(shù)有時(shí)候會不工作,尤其是當(dāng)代理是采用NTLM方式驗(yàn)證的時(shí)候。maven的文檔里就明確指出NTLM代理身份驗(yàn)證可能是在maven下不工作的,這個(gè)時(shí)候我們就要想想別的辦法。
我的解決辦法就是在本地機(jī)器上在架設(shè)一個(gè)不需要驗(yàn)證的代理,將需要身份驗(yàn)證的代理作為這個(gè)代理的父級代理。這個(gè)代理是本身是支持采用身份認(rèn)證方式去連接父級代理的,特別是如果有必要的話必須支持NTLM。目前很多代理工具都可以實(shí)現(xiàn)這一點(diǎn),我選擇cntlm?和polipo,這兩個(gè)代理非常輕便,配置也很方便。其中cntlm還提供功能用來檢測代理服務(wù)器是否采用ntlm協(xié)議,可以作為windows代理服務(wù)器和Linux代理服務(wù)器的橋梁。
總之,封閉的世界不僅閉塞了知識的流動(dòng),而且也極大的降低了工作效率,如果你不幸也在這樣的環(huán)境中,希望這些經(jīng)驗(yàn)對你有點(diǎn)用。