在Debian用nginx幫Transmission的WebUI加密

上一篇文章中,我們講了如何自己編譯一套Transmission並調整他的設定。

但是你應該有發現,Transmission的遠端介面(RPC)是沒有加密的,在某些地方變成你完全不能使用遠端管理。像是台灣的教育單位就對P2P很過敏,既使你只是用BT抓個Debian或Raspberry Pi的映像檔,依然有被關注的風險,甚至到現在依然很多學校的公告是「禁止使用P2P軟體」而不是「禁止使用各種軟體取得未經授權之檔案」。

雖然在上一篇文章我們使用的Transmission Remote GUI有支援SSL,但是如果有試著在Pi或是其他Transmission-daemon伺服器上尋找設定要修改,沒錯:沒有這個設定、Transmission的RPC介面不支援SSL。

所以在這裡,我們需要一台反向代理伺服器(Reverse Proxy)。一般代理伺服器(http Proxy)是任何網站都可以透過他連線到目標伺服器的,而且客戶端知道他使用了代理。而反向代理則是針對特定網站用的,不需要再使用這電腦做設定。對使用者而言,反向代理不像代理反而像真的主機。使用者連過去後,反向代理伺服器再將http的請求(request)PASS到真正的伺服器。好處是可以隱藏真正的伺服器位置,而真正伺服器如果不支援加密,我們也可以透過反向代理的技術幫他加密,如下面的圖。而未加密的那一段通常是私人區段,除了你以外沒有人可以知道這裡發生了甚麼事。*1

了解以上的架構後,我們就可以開工拉(不了解為什麼要這樣,或是這樣做可以幹嘛的話,建議你可以停手了XD)。

  1. 安裝nginx還有製作證書的工具(SSL還是要有證書,就算沒有要驗證身分)
    這裡我們用Nginx當反向代理,安裝在Pi、其他Transmission主機或是同一個網段的電腦裡吧

    # apt-get install openssl nginx

  2. 製作一份自己做的證書(無法驗證身分、無公信力)

    # cd /etc/nginx/
    # mkdir ssl
    # openssl genrsa -des3 -out ssl/privkey.key 1024 //製作私鑰
    Generating RSA private key, 1024 bit long modulus
    ..++++++
    ………….++++++
    e is 65537 (0x10001)
    Enter pass phrase for privkey.key: //在這裡輸入你這份私鑰的使用密碼(不會顯示)
    Verifying – Enter pass phrase for privkey.key: //再輸入一次免得打錯

    # openssl req -new -key ssl/privkey.key -out ssl/cert.csr //製作證書的CSR
    Enter pass phrase for ssl/privkey.key: //輸入私鑰剛剛的密碼
    You are about to be asked to enter information that will be incorporated
    into your certificate request.
    What you are about to enter is what is called a Distinguished Name or a DN.
    There are quite a few fields but you can leave some blank
    For some fields there will be a default value,
    If you enter ‘.’, the field will be left blank.
    —–
    Country Name (2 letter code) [AU]:TW //輸入兩碼的國碼
    State or Province Name (full name) [Some-State]:Taiwan //輸入州、省的名稱
    Locality Name (eg, city) []:Taipei //輸入城市名稱
    Organization Name (eg, company) [Internet Widgits Pty Ltd]: //輸入公司名稱
    Organizational Unit Name (eg, section) []:Admin //輸入單位名稱
    Common Name (e.g. server FQDN or YOUR name) []:dd-han.tw //輸入網址
    Email Address []: //輸入e-mail

    Please enter the following ‘extra’ attributes //以下都是額外的選項,可以不輸入
    to be sent with your certificate request
    A challenge password []:
    An optional company name []:

    # openssl rsa -in ssl/privkey.key -out ssl/cert.key
    Enter pass phrase for ssl/privkey.key: //輸入你的私鑰使用密碼

    //製作一份自己簽證的CA證書
    # openssl x509 -req -days 365 -in ssl/cert.csr -signkey ssl/privkey_nopass.key -out ssl/cert.pem
    Signature ok
    subject=/C=TW/ST=Taiwan/L=Taipei/O=dd-han’s Company/OU=Admin/CN=dd-han.tw/emailAddress=
    Getting Private key

  3. 複製一份預設設定檔
    首先,我們先複製一份nginx預設的設定檔(裡面有很多設定可以參考)

    # cd /etc/nginx/
    # cp sites-available/default sites-available/transmission

  4. 把原本的預設伺服器關掉
    如果你沒有要用的話,當然是關掉搂(Pi的資源不多,不要浪費)

    # rm sites-enabled/default

  5. 設定一台https的伺服器

    # pico sites-available/transmission
    # You may add here your


    //把預設的http伺服器整個註解掉
    #server {
    #listen 80 ; ## listen for ipv4; this line is default and implied
    #…
    #…
    #location /doc/ {
    #alias /usr/share/doc/;
    #autoindex on;
    #allow 127.0.0.1;
    #allow ::1;
    #deny all;
    #} 註解區段結束*************/
    # another virtual host using mix of IP-, name-, and port-based configuration
    #


    # HTTPS server
    # 把以下的#號刪掉取消註解
    server {

    listen 443;
    server_name localhost;

    ## SSL log files 加入存取紀錄,免得被別人連線都沒紀錄查
    access_log /var/log/nginx/trans-ssl-access.log;
    error_log /var/log/nginx/trans-ssl-error.log;

    root /usr/share/nginx/www; //改掉這行預設的跟目錄資料夾,讓網站跟目錄出現welcome to nginx,不然會出現409 ERROR
    index index.html index.htm;

    ssl on;
    ssl_certificate ssl/cert.pem;   #改成我們剛剛做的CA證書
    ssl_certificate_key ssl/cert.key; #改成我們剛剛輸出的cert.key
    ssl_session_timeout 5m;

    # ssl_protocols SSLv3 TLSv1;   #這三行不用取消註解,讓他保持預設就好

    # ssl_prefer_server_ciphers on;

    location / {

    try_files $uri $uri/ =404;

    }

    location /transmission/ {   //這一段自己加入

    #把transmission這個資料夾Pass給RPC

    proxy_pass http://127.0.0.1:9091/transmission/;
    proxy_redirect    off;   #不要讓他轉址過去

    }

    }

  6. 啟用設定檔

    # ln -s /etc/nginx/sites-available/transmission sites-enabled/

  7. 重開nginx

    # /etc/init.d/nginx restart

  8. 測試一下,安心的遙控吧
    前往https://127.0.0.1/transmission/web (務必加上/web,不然很會出現409錯誤)

備註:這一段只是講解技術細節,看不懂就算了沒關係XD

 

參考資料:http://linux-guys.blogspot.tw/2010/12/nginx-reverse-proxyweb-cache.html

在〈在Debian用nginx幫Transmission的WebUI加密〉中有 2 則留言

    1. 暫時我也還沒研究出這個解…..

      不過我都是用Transmission Remote GUI,說實話也很少開瀏覽器去管理Transmission…..

      期中考結束來試試看有沒有辦法用ReWrite規則修正好了

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

這個網站採用 Akismet 服務減少垃圾留言。進一步了解 Akismet 如何處理網站訪客的留言資料