用 Nginx 搭建 Twitter API 反向代理

简单的说,就是伪造一个 api.twitter.com 出来,然后修改 hosts 文件,将 api.twitter.com 指到我们搭建的反向代理上。由于需要走 https 连接,还需要我们伪造一个 api.twitter.com 的证书。

1. 首先,伪造一个 api.twitter.com 的证书
1.1 创建 CA 的私钥

openssl genrsa -out ca.key 4096

1.2 创建 CA 证书

openssl req -new -x509 -days 3650 -key ca.key -out ca.crt

1.3 创建服务器私钥

openssl genrsa -out server.key 4096

1.4 创建服务器证书签名请求(注意 Common Name 填 api.twitter.com)

openssl req -new -key server.key -out server.csr

1.5 用 CA 证书签名

openssl x509 -req -days 3650 -in server.csr -CA ca.crt -CAkey ca.key -set_serial 01 -out server.crt

这样,一个伪造的证书就创建好了,下面把 server.crt 和 server.key 复制到 /etc/nginx/ssl 里面(或者其他的路径,只要跟配置文件里面一致就可以了)

2. 配置反向代理(注意 server_name 填 api.twitter.com)

    server {
        listen       443;
        server_name  api.twitter.com;
        charset utf-8;

        access_log  /var/log/nginx/t.anbutu.com.access.log  main;

        ssl on;
        ssl_certificate /etc/nginx/ssl/server.crt;
        ssl_certificate_key /etc/nginx/ssl/server.key;

        location / {
            proxy_pass https://api.twitter.com:443;
            proxy_set_header Host $host;
        }
    }

3. 修改 hosts 文件,将 api.twitter.com 指到我们代理的IP上

205.185.127.127 api.twitter.com

4. 导入 CA 证书
这时候直接访问 api.twitter.com 还是不行的,因为我们是伪造的证书,肯定会报证书错误的,还需要将我们的 CA 证书(ca.crt) 设为可信。其他平台就不说了,简单说一下 iphone 上如何导入证书。苹果官方有一个 iPhone Configuration Utility 的软件,可以用来导入证书。其实这里还有一个更简单的办法,把你的证书放在网上,然后用 iphone 上的 Safari 访问一下证书的 URL,就可以将这个证书导入了。证书导入以后,由这个 CA 签署的所有证书就都变为可信了。

关于自签证书,可以参考:http://log.dongsheng.org/2009/09/07/https-certificate/

8 thoughts on “用 Nginx 搭建 Twitter API 反向代理

  1. 弄了好久反向代理就是没弄成功,原來ssl證書還要僞造成twitter官方的啊= =||
    要是我想把twitter.com , oauth.twitter.com ,***.twitter.com都反向代理過去,是不是只要把server_name全寫上就行了?SSL證書怎麽辦?

  2. 我也曾经试图只给api.twitter.com做代理,但是只能登录,获取tweets的时候会出错,一直没找到原因。

Leave a Reply

Your email address will not be published. Required fields are marked *

*

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>