加密代理APJP,讓GFW瞎了狗眼

from 加密代理APJP,让GFW瞎了狗眼.

 

最近斯巴达原因, Google的服务再次遭到惨无人道的封杀, 以前用的甚欢的GoAgent现在也步步维艰.
诅咒方校长菊花癌恶化(╮°-°)╮┳━┳ ( ╯°□°)╯︵ ┻━┻
粗 略看了一下GoAgent的加密传输, 发现证书用的是GAE的, 也就是说所有使用GoAgent的筒子, 证书都是一样的. 所以, 若GFW也装这个证书, 就能明文获取所有GoAgent通讯的内容, 甚至关键词重置链接. 当然这只是一个猜测, 毕竟每个人的AppID都不同, 除非GFW找到一种能直接判断某个AppID是GoAgent的方法, 否则只能用类似鸟枪法大海捞针, 但是中国相关部门不能用正常人思维去判断…
APJP是跟GoAgent最大的不同就是加密传输, 用自己设置的密钥生成一个证书, 用自己的证书跟远端APJP服务通讯. 具体实现没有仔细研究, 总之是加密传输, 在不知道自己密钥的情况下不能查看通讯内容.
瞎了GFW的狗眼 ( ̄皿 ̄)希涅!
不过正因为APJP的加密机制, 导致速度比GoAgent慢好多, 而且多AppID的管理似乎也不如GoAgent, 毕竟GoAgent专门针对GFW, 还引入的西厢计划. 但是稳定性高于GoAgent.

言归正传, 以GAE-Java为例, 部署APJP的方法, 虽然wiki已经很详细, 但是咱还是要罗嗦一下.
官方GAE搭建教程, 说的很详细了

先要有GAE账户, 新建appid, 例如xxx1, 则该app的地址是xxx1.appspot.com
下载GAE for Java的客户端, 似乎需要安装Jre.
以上GAE准备工作不详细说了, 网上攻略很多.

APJP的Google Code 主页, 下载最新Java版的程序: 下载列表
APJP_LOCAL_JAVA-1.0.1.zipAPJP_REMOTE_JAVA_APPENGINE-1.0.0.zip (目前最新 2012-11-23)
生成密钥的程序 APJP_KEY_JAVA-1.0.1.zip 可要可不要, 密钥可以自己随便写一个, 也可以用程序生成的, 或者官方GAE搭建wiki里可以在线生成密钥.
生成密钥后, 找个地方记住, 客户端和服务端都需要这个密钥. 即便以后在别的地方用客户端也需要用到. 这里假设密钥是 OOO

一. 服务端配置
1. 解压
解压APJP_REMOTE_JAVA_APPENGINE-1.0.0.zip
进入\war\WEB-INF\目录

2. 编辑APJP_REMOTE.properties
在开头添加或者修改一行

APJP_KEY=OOO

3. 编辑appengine-web.xml,
添入自己的APPID, 例如xxx1, 将

<application></application>

修改为

<application>xxx1</application>

如果有多个AppID, 只需修改这里上传就行了, 密钥部分不必修改.

4. 上传到GAE, 打开命令提示符(cmd)

你的GAE_for_Java_SDK路径\appengine-java-sdk-1.7.3\bin\appcfg.cmd update 你的服务端解压路径\war\

需要注意的是, 在网络封锁严重的时期, 如现在的斯巴达… 直接上传很可能失败. 请将IE代理设置成目前正在用的代理, 不要用批处理或者其他方式执行这条指令.
HTTP_PROXY 和 HTTPS_PROXY 两个参数似乎不适合Java上传.

二. 客户端配置
1. 解压
解压APJP_LOCAL_JAVA-1.0.1.zip

2. 编辑APJP_LOCAL.properties
具体请看官方教程, 这个文件的详细参数介绍 见此处
在此说一下我的看法, GAE的免费配额是一个App一天只能使用1G的流量, 以及10000PV. GoAgent对GAE的配额管理比较好, 可以同时指定多个AppID, 分布式管理.
APJP 其实也可以做到, 但是我翻了几个isslue觉得, 作者似乎不推荐这样做, 能不能做到配额平均使用不一定, 而且很可能会影响速度. 但是具体我没有测试过, 在这里我提供一个例子, 这个例子里注掉了一些另外的appid(当然是xxx), 如果去掉注释(#), 也可以用, 而且能全部使用. 我的建议是只用一个, 配额用完再换下一个. 当然还得看个人习惯~~

# EXAMPLE: APJP_KEY=1AJyx7s4Vs8afWY4
APJP_KEY=OOO

APJP_LOGGER_ID=APJP
APJP_LOGGER_LEVEL=2

# APJP_LOCAL_PROXY_SERVER

APJP_LOCAL_PROXY_SERVER_ADDRESS=127.0.0.1
APJP_LOCAL_PROXY_SERVER_PORT=10000
APJP_LOCAL_PROXY_SERVER_LOGGER_ID=APJP_LOCAL_PROXY_SERVER
APJP_LOCAL_PROXY_SERVER_LOGGER_LEVEL=2

# APJP_LOCAL_HTTP_PROXY_SERVER <-> APJP_LOCAL_HTTP_SERVER <-> (APJP_HTTP/HTTPS_PROXY_SERVER <->) APJP_REMOTE_HTTP_SERVER

# APJP_LOCAL_HTTP_PROXY_SERVER

APJP_LOCAL_HTTP_PROXY_SERVER_ADDRESS=127.0.0.1
APJP_LOCAL_HTTP_PROXY_SERVER_PORT=10100
APJP_LOCAL_HTTP_PROXY_SERVER_LOGGER_ID=APJP_LOCAL_HTTP_PROXY_SERVER
APJP_LOCAL_HTTP_PROXY_SERVER_LOGGER_LEVEL=2

# APJP_LOCAL_HTTP_SERVER

APJP_LOCAL_HTTP_SERVER_ADDRESS=127.0.0.1
APJP_LOCAL_HTTP_SERVER_PORT=10200
APJP_LOCAL_HTTP_SERVER_LOGGER_ID=APJP_LOCAL_HTTP_SERVER
APJP_LOCAL_HTTP_SERVER_LOGGER_LEVEL=2

# APJP_REMOTE_HTTP_SERVER

# EXAMPLE: APJP_REMOTE_HTTP_SERVER_1_REQUEST_URL=http://../HTTP.php
# EXAMPLE: APJP_REMOTE_HTTP_SERVER_1_REQUEST_URL=https://../HTTP.php
APJP_REMOTE_HTTP_SERVER_1_REQUEST_URL=https://173.194.38.129/HTTP
APJP_REMOTE_HTTP_SERVER_1_REQUEST_PROPERTY_1_KEY=Host
APJP_REMOTE_HTTP_SERVER_1_REQUEST_PROPERTY_1_VALUE=XXX01.appspot.com

#APJP_REMOTE_HTTP_SERVER_2_REQUEST_URL=https://173.194.38.128/HTTP
#APJP_REMOTE_HTTP_SERVER_2_REQUEST_PROPERTY_1_KEY=Host
#APJP_REMOTE_HTTP_SERVER_2_REQUEST_PROPERTY_1_VALUE=XXX02.appspot.com

#APJP_REMOTE_HTTP_SERVER_3_REQUEST_URL=https://173.194.38.136/HTTP
#APJP_REMOTE_HTTP_SERVER_3_REQUEST_PROPERTY_1_KEY=Host
#APJP_REMOTE_HTTP_SERVER_3_REQUEST_PROPERTY_1_VALUE=XXX03.appspot.com

#APJP_REMOTE_HTTP_SERVER_4_REQUEST_URL=https://173.194.38.135/HTTP
#APJP_REMOTE_HTTP_SERVER_4_REQUEST_PROPERTY_1_KEY=Host
#APJP_REMOTE_HTTP_SERVER_4_REQUEST_PROPERTY_1_VALUE=XXX04.appspot.com

#APJP_REMOTE_HTTP_SERVER_5_REQUEST_URL=https://173.194.38.142/HTTP
#APJP_REMOTE_HTTP_SERVER_5_REQUEST_PROPERTY_1_KEY=Host
#APJP_REMOTE_HTTP_SERVER_5_REQUEST_PROPERTY_1_VALUE=XXX05.appspot.com

# APJP_LOCAL_HTTPS_PROXY_SERVER <-> APJP_LOCAL_HTTPS_SERVER <-> (APJP_HTTP/HTTPS_PROXY_SERVER <->) APJP_REMOTE_HTTPS_SERVER

# APJP_LOCAL_HTTPS_PROXY_SERVER

APJP_LOCAL_HTTPS_PROXY_SERVER_ADDRESS=127.0.0.1
APJP_LOCAL_HTTPS_PROXY_SERVER_PORT=10300
APJP_LOCAL_HTTPS_PROXY_SERVER_LOGGER_ID=APJP_LOCAL_HTTPS_PROXY_SERVER
APJP_LOCAL_HTTPS_PROXY_SERVER_LOGGER_LEVEL=2

# APJP_LOCAL_HTTPS_SERVER

APJP_LOCAL_HTTPS_SERVER_ADDRESS=127.0.0.1
APJP_LOCAL_HTTPS_SERVER_PORT=10400
APJP_LOCAL_HTTPS_SERVER_LOGGER_ID=APJP_LOCAL_HTTPS_SERVER
APJP_LOCAL_HTTPS_SERVER_LOGGER_LEVEL=2

# APJP_REMOTE_HTTPS_SERVER

# EXAMPLE: APJP_REMOTE_HTTPS_SERVER_1_REQUEST_URL=http://../HTTPS.php
# EXAMPLE: APJP_REMOTE_HTTPS_SERVER_1_REQUEST_URL=https://../HTTPS.php
APJP_REMOTE_HTTPS_SERVER_1_REQUEST_URL=https://173.194.38.129/HTTPS
APJP_REMOTE_HTTPS_SERVER_1_REQUEST_PROPERTY_1_KEY=Host
APJP_REMOTE_HTTPS_SERVER_1_REQUEST_PROPERTY_1_VALUE=XXX01.appspot.com

#APJP_REMOTE_HTTPS_SERVER_2_REQUEST_URL=https://173.194.38.128/HTTPS
#APJP_REMOTE_HTTPS_SERVER_2_REQUEST_PROPERTY_1_KEY=Host
#APJP_REMOTE_HTTPS_SERVER_2_REQUEST_PROPERTY_1_VALUE=XXX02.appspot.com

#APJP_REMOTE_HTTPS_SERVER_3_REQUEST_URL=https://173.194.38.136/HTTPS
#APJP_REMOTE_HTTPS_SERVER_3_REQUEST_PROPERTY_1_KEY=Host
#APJP_REMOTE_HTTPS_SERVER_3_REQUEST_PROPERTY_1_VALUE=XXX03.appspot.com

#APJP_REMOTE_HTTPS_SERVER_4_REQUEST_URL=https://173.194.38.135/HTTPS
#APJP_REMOTE_HTTPS_SERVER_4_REQUEST_PROPERTY_1_KEY=Host
#APJP_REMOTE_HTTPS_SERVER_4_REQUEST_PROPERTY_1_VALUE=XXX04.appspot.com

#APJP_REMOTE_HTTPS_SERVER_5_REQUEST_URL=https://173.194.38.142/HTTPS
#APJP_REMOTE_HTTPS_SERVER_5_REQUEST_PROPERTY_1_KEY=Host
#APJP_REMOTE_HTTPS_SERVER_5_REQUEST_PROPERTY_1_VALUE=XXX05.appspot.com

# APJP_HTTP_PROXY_SERVER

APJP_HTTP_PROXY_SERVER_ADDRESS=
APJP_HTTP_PROXY_SERVER_PORT=
APJP_HTTP_PROXY_SERVER_USERNAME=
APJP_HTTP_PROXY_SERVER_PASSWORD=

# APJP_HTTPS_PROXY_SERVER

APJP_HTTPS_PROXY_SERVER_ADDRESS=
APJP_HTTPS_PROXY_SERVER_PORT=
APJP_HTTPS_PROXY_SERVER_USERNAME=
APJP_HTTPS_PROXY_SERVER_PASSWORD=

OOO代表密钥,跟服务端的一样, xxx是你的Appid

3. 使用APJP
直接运行APJP_LOCAL.bat可以看到输出信息, 启动后如果看到5个OK, 代表启动成功了.
类似这样

......
APJP: START_PROXY_SERVER: OK
APJP: TEST_HTTP_REQUESTS
APJP: HTTP_REQUEST/GET_HTTP_RESPONSE_MESSAGE: REQUEST: HEAD / HTTP/1.0
APJP: HTTP_REQUEST/GET_HTTP_RESPONSE_MESSAGE: RESPONSE: HTTP/1.1 200 OK
APJP: TEST_HTTP_REQUESTS: OK
APJP: TEST_HTTPS_REQUESTS
APJP: HTTPS_REQUEST/GET_RESPONSE_MESSAGE: REQUEST: HEAD / HTTP/1.0
APJP: HTTPS_REQUEST/GET_RESPONSE_MESSAGE: RESPONSE: HTTP/1.1 200 OK
APJP: TEST_HTTPS_REQUESTS: OK

多个Appid的话, 如果有一个链接失败, 启动就失败.
批处理的CMD窗口可以显示链接的使用日志.
如果批处理模式启动成功, 建议使用UI启动, 比较直观, 还能隐藏. 直接双击APJP_LOCAL_UI.bat或者运行APJP_LOCAL_JAVA-1.0.1.jar (前提是你设置了java环境变量)
APJP 默认代理端口是10000, 例如用Chrome的Proxy SwitchySharp扩展, 设置代理IP: 127.0.0.1, 端口: 10000, 勾选对所有协议使用相同的代理服务器. 实际上只是HTTP/HTTPS协议, 也可以单独设置, 在客户端的配置文件里都有.

4. 导入证书
用Chrome浏览器或者其他浏览器, 浏览https的网站时, 会提示证书不安全, 不能继续浏览.
首次执行客户端成功后, 会在同一目录下生成APJP_LOCAL.jksAPJP_LOCAL.pem证书文件
Chrome使用的证书管理跟IE一样, 在设置–>高级设置里有"证书管理"
将APJP_LOCAL.pem导入"受信任的根证书颁发机构", 然后刷新网页就能浏览了.

至此APJP配置完毕~~ 虽然速度比GoAgent慢点, 但不丢连还是用的蛮舒服的. 似乎看U2B也不错.

發表迴響

在下方填入你的資料或按右方圖示以社群網站登入:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / 變更 )

Twitter picture

You are commenting using your Twitter account. Log Out / 變更 )

Facebook照片

You are commenting using your Facebook account. Log Out / 變更 )

Google+ photo

You are commenting using your Google+ account. Log Out / 變更 )

連結到 %s

%d 位部落客按了讚: