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