和代理服務器搏斗

這幾天挺忙的,大部分時間都浪費在折騰代理上了。因為客戶的工作環(huán)境對信息安全特別看重,所有的辦公機器默認都是不能上網(wǎng)的,如果要上,則要申請一個賬號,然后配置一個代理。就是這個代理把我搞得半死。

代理有很多種使用方式,通常是為了讓瀏覽器能夠訪問網(wǎng)站,而我現(xiàn)在的主要需求不是瀏覽器,而是所有其他非瀏覽器的使用,例如在Linux系統(tǒng)下安裝配置軟件、編譯打包代碼等等。這個代理是需要驗證的,實際使用中碰到了各種麻煩,浪費了我不少時間。

其中之一就是通過apt或者yum等工具安裝軟件包,這個其實很好解決,只要配置http-proxyhttps-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)驗對你有點用。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • Spring Cloud為開發(fā)人員提供了快速構建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 134,923評論 18 139
  • Spring Boot 參考指南 介紹 轉載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 46,954評論 6 342
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 173,287評論 25 708
  • 創(chuàng)建項目 參考 SAPUI5: UI Development Toolkit for HTML5新建SAP UI5...
    LiuliuZhang閱讀 1,159評論 0 0
  • 我并不是一個拾荒大叔或者屯物怪,不過我卻有著你們沒有的勇氣和一些奇奇怪怪的想法,那是因為不久前我搬家了,房子的...
    沒深度閱讀 190評論 0 0