和代理服务器搏斗

这几天挺忙的,大部分时间都浪费在折腾代理上了。因为客户的工作环境对信息安全特别看重,所有的办公机器默认都是不能上网的,如果要上,则要申请一个账号,然后配置一个代理。就是这个代理把我搞得半死。

代理有很多种使用方式,通常是为了让浏览器能够访问网站,而我现在的主要需求不是浏览器,而是所有其他非浏览器的使用,例如在Linux系统下安装配置软件、编译打包代码等等。这个代理是需要验证的,实际使用中碰到了各种麻烦,浪费了我不少时间。

其中之一就是通过apt或者yum等工具安装软件包,这个其实很好解决,只要配置http-proxyhttps-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代理服务器的桥梁。

总之,封闭的世界不仅闭塞了知识的流动,而且也极大的降低了工作效率,如果你不幸也在这样的环境中,希望这些经验对你有点用。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,234评论 19 139
  • Spring Boot 参考指南 介绍 转载自:https://www.gitbook.com/book/qbgb...
    毛宇鹏阅读 46,997评论 6 342
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 174,297评论 25 709
  • 创建项目 参考 SAPUI5: UI Development Toolkit for HTML5新建SAP UI5...
    LiuliuZhang阅读 1,168评论 0 0
  • 我并不是一个拾荒大叔或者屯物怪,不过我却有着你们没有的勇气和一些奇奇怪怪的想法,那是因为不久前我搬家了,房子的...
    没深度阅读 197评论 0 0