ZeroNet 在远程服务器

Posted by ryc111 on May 2, 2016

ZeroNet 在VPS上?

默认启动ZeroNet是只能本地通过127.0.0.1访问的。需要启用外网访问,官方文档写的很清楚,只需要使用--ui_ip "*"命令行flag就可以让外网访问了:

  • 在VPS上安装ZeroNet: 1, 安装依赖包, msgpack-pythonpython-gevent, 如果没有python需要先安装python 2, 下载程序 3, (如果有的话)拷贝本地的users.json 覆盖到服务器的 data/users.json 4, 运行程序

大致步骤如下:

sudo apt-get update
sudo apt-get install msgpack-python python-gevent
wget https://github.com/HelloZeroNet/ZeroNet/archive/master.tar.gz
tar xvpfz master.tar.gz
cd ZeroNet-master
python zeronet.py --ui_ip "*"

这样访问http://your_vps_ip:43110/ 就可以直接访问到了。

如何加密?

上面的步骤将端口开放给了所有的ip,对于一个追求隐私的程序来说这就相当于后门装了个防盗门然后把前门打开在那···显然是不可接受的。 首先,ZeroNet提供了多种访问的办法,官方文档里面对于远程访问的介绍也是直接的使用密码加密:

1, 将plugins/disabled-UiPassword目录重命名为plugins/UiPassword 2, 使用zeronet.py --ui_ip "*" --ui_password anypassword来启动程序 3, 访问http://your_vps_ip:43110/并输入密码,如下图 ZeroNet-password-login

但是,重来一句,对于一个追求隐私的程序来说,直接使用http来进行网络传输依然存在着被嗅探,被抓包,被人知道你访问的内容···Again,这显然是不能接受的。 所以,继续…

Nginx 配置 SSL 证书 + HTTPS + 反代ZeroNet网站

HTTPS?

根据维基百科的解释:

超文本传输安全协议(缩写:HTTPS,英语:Hypertext Transfer Protocol Secure)
是超文本传输协议和SSL/TLS的组合,用以提供加密通讯及对网络服务器身份的鉴定。
HTTPS连接经常被用于万维网上的交易支付和企业信息系统中敏感信息的传输。
HTTPS不应与在RFC 2660中定义的安全超文本传输协议(S-HTTP)相混。

所以,从注重隐私和安全的角度出发,防止第三方窃听,HTTPS加密是首选。

SSL证书

对于SSL证书,可以自行颁发不受浏览器信任的SSL证书,对于个人使用是完全没有任何问题的。这里顺带再加上Starssl:Startssl 是一家提供免费 SSL 证书的公司,我们可以用其搭建 https 网站,该网站签发的个人证书可以被主流浏览器所信任,过程简单记录如下:

首先, 使用openssl生成RSA密钥及证书:

openssl req -new -newkey rsa:2048 -sha256 -nodes -out ryc111_com.csr -keyout ryc111_com.key \
-subj "/C=US/ST=CA/L=Mountain View/O=OMG Inc./OU=Web Security/CN=ryc111.com"  

然后如果是自己签发的话:

openssl x509 -req -days 365 -in ryc111_com_.csr -signkey ryc111_com_.key -out ryc111-com.crt

如果是通过Starssl签发,那么就需要到starssl上注册并上传使用openssl生成的key,然后网站会将签名文件 __.crt 发回给你。

Nginx 设置

首先, 对于服务器上运行的ZeroNet,不再使用--ui_ip "*",而是通过nginx的反向代理来进行访问: 配置参考于zeronet内网

server
    {
        listen 80;
        server_name YourDomain.com;
        location / {
                 proxy_pass http://127.0.0.1:43110;
                 proxy_set_header Host $host;
                 }
        location /Websocket {
                 proxy_pass http://127.0.0.1:43110;
                 proxy_http_version 1.1;
                 proxy_set_header Upgrade $http_upgrade;
                 proxy_set_header Connection "upgrade";
                 }
        access_log off;
    }

接下来,就要给网页加上https加密了,先将生成的ssl key那三个文件拷贝到 /etc/ssl/private/ 下。 然后在上面配置里面加上以下三句话:

        ssl on;
        ssl_certificate /etc/ssl/private/ryc111_com.crt;
        ssl_certificate_key /etc/ssl/private/ryc111_com.key;

重启 nginx: nginx -t && nginx -s reload 访问https://YourDomain.com/,登登登登…这样你和远程服务器之间的连接就加密啦!

继续啰嗦加密

为什么继续啰嗦,是因为上面所说的办法默认使用的是 SHA-1,但是呢SHA-1的安全性如今被密码学家严重质疑;虽然至今尚未出现对SHA-2有效的攻击。所以,为了确保更强的安全性,我们可以采取迪菲-赫尔曼密钥交换: 很简单,首先在 /etc/ssl/certs目录下生成一个pem文件:

cd /etc/ssl/certs  
openssl dhparam -out ryc111_com.pem 2048

然后继续修改nginx配置,在配置后面加入:

        ssl_prefer_server_ciphers on;
        ssl_dhparam /etc/ssl/certs/dhparam.pem;
        ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
        ssl_ciphers "EECDH+ECDSA+AESGCM EECDH+aRSA+AESGCM EECDH+ECDSA+SHA384 EECDH+ECDSA+SHA256 EECDH+aRSA+SHA384 EECDH+aRSA+SHA256 EECDH+aRSA+RC4 EECDH EDH+aRSA !aNULL !eNULL !LOW !3DES !MD5 !EXP !PSK !SRP !DSS !RC4";

鉴于ZeroNet只需要https,所以可以把所有http的访问请求都用 301 跳转到https:

        if ($scheme = http) {
            return 301 https://$server_name$request_uri;
        }

总结

  • 安装ZeroNet, Nginx
  • 生成秘钥文件
  • 修改ZeroNet和Nginx的配置
  • 重启Nginx和启动ZeroNet

在Vps上为了保证程序一直在运行,可以使用nohup命令来保证程序在ssh session结束后继续运行:

nohup python zeronet.py --ui_password YourPassWord &> /tmp/zeronet.log &

完整的Nginx的配置:

server
    {
        listen 80;
        listen 443 ssl;
        server_name ExAmPlE.com;
        ssl on;
        ssl_certificate /etc/ssl/private/ryc111_com.crt;
        ssl_certificate_key /etc/ssl/private/ryc111_com.key;
        ssl_prefer_server_ciphers on;
        ssl_dhparam /etc/ssl/certs/dhparam.pem;
        ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
        ssl_ciphers "EECDH+ECDSA+AESGCM EECDH+aRSA+AESGCM EECDH+ECDSA+SHA384 EECDH+ECDSA+SHA256 EECDH+aRSA+SHA384 EECDH+aRSA+SHA256 EECDH+aRSA+RC4 EECDH EDH+aRSA !aNULL !eNULL !LOW !3DES !MD5 !EXP !PSK !SRP !DSS !RC4";
        keepalive_timeout 70;
        ssl_session_cache shared:SSL:10m;
        ssl_session_timeout 10m;
        location / {
                 proxy_pass http://127.0.0.1:43110;
                 proxy_set_header Host $host;
                 }
        location /Websocket {
                 proxy_pass http://127.0.0.1:43110;
                 proxy_http_version 1.1;
                 proxy_read_timeout 1h;
                 proxy_set_header Upgrade $http_upgrade;
                 proxy_set_header Connection "upgrade";
                 }
        access_log off;
        if ($scheme = http) {
            return 301 https://$server_name$request_uri;
        }
    }