这几天挺忙的,大部分时间都浪费在折腾代理上了。因为客户的工作环境对信息安全特别看重,所有的办公机器默认都是不能上网的,如果要上,则要申请一个账号,然后配置一个代理。就是这个代理把我搞得半死。
代理有很多种使用方式,通常是为了让浏览器能够访问网站,而我现在的主要需求不是浏览器,而是所有其他非浏览器的使用,例如在Linux系统下安装配置软件、编译打包代码等等。这个代理是需要验证的,实际使用中碰到了各种麻烦,浪费了我不少时间。
其中之一就是通过apt或者yum等工具安装软件包,这个其实很好解决,只要配置http-proxy
和https-proxy
两个环境变量就可以了,这两个环境变量一旦配置,Linux下很多程序都会默认使用,例如curl、wget,这是个非常不错的惯例,而且这两个变量还支持用户名和密码身份认证。如果有些ip或者域名不需要代理,可以设置no-proxy
环境变量。除了wget这些工具,所有ruby、python等的包安装工具或者库都基本上会尊重系统代理设置。
但是这两个变量还没有解决所有问题。https协议的处理是一个麻烦的地方。如果代理服务器没有对https证书进行良好处理,那么你会发现很多https协议的资源你都没法正常访问,因为证书得不到验证,通常如果是本地证书验证失败,很多工具提供了不验证证书的选项,例如curl和wget都可以选择不进行证书验证(例如curl的--insecure
),但是如果是代理服务端的证书验证失败,那么基本上你是没办法了。注意apt-get的一些源需要gpg证书,而这些证书往往都放在https资源上。
有一些工具是不太尊重Linux惯例的,java大概就属于其中一个。所有的java工具,如果要设置代理,大概都要通过jvm属性来设置,具体说就是通过-Dhttp.proxyHost
、-Dhttp.proxyPort
、-Dhttp.proxyUser
、-Dhttp.proxyPass
一系列属性来设置代理信息,比如我在使用sbt的时候,就需要把这些参数附给sbt命令行工具;在使用maven的时候,则要在~/.m2/settings.xml
里用maven的配置语法来设置代理信息。很遗憾的是当代理需要身份验证的时候,java的user和pass参数有时候会不工作,尤其是当代理是采用NTLM方式验证的时候。maven的文档里就明确指出NTLM代理身份验证可能是在maven下不工作的,这个时候我们就要想想别的办法。
我的解决办法就是在本地机器上在架设一个不需要验证的代理,将需要身份验证的代理作为这个代理的父级代理。这个代理是本身是支持采用身份认证方式去连接父级代理的,特别是如果有必要的话必须支持NTLM。目前很多代理工具都可以实现这一点,我选择cntlm�和polipo,这两个代理非常轻便,配置也很方便。其中cntlm还提供功能用来检测代理服务器是否采用ntlm协议,可以作为windows代理服务器和Linux代理服务器的桥梁。
总之,封闭的世界不仅闭塞了知识的流动,而且也极大的降低了工作效率,如果你不幸也在这样的环境中,希望这些经验对你有点用。