九月 18, 2012

hoamon's sandbox
hoamon
hoamon's sandbox is about »

tag cloud

» 轉移至 Nginx

2012 三月全世界的網頁伺服器市佔率圖 from netcraft.com 

上圖可以看出歷久彌新的 Apache 持續雄距首位,有超過 15 年的時間,沒"器"可挑戰它的地位。直至 Nginx 的出現,或許它現在只有 10% ,但從各方評價看來,它絕對是 Apache 有史以來最強大的對手。短短 5 年,它已經爬上第 3 名的位子,從趨勢線上看來,要超越 IIS 也是有很大的機會。

而 Nginx 為什麼短短幾年竄起,絕不是因為『用的人多』。如果是這種原因的話, palm 、 Windows OS 、 x86 CPU 、 PlayStation 到現在會活得好好地,因為它們都曾有超越 50% 的市佔率。

Nginx 被選擇的原因有幾點:
  1. 跨平台: *nix, Mac, Windows 皆可。這那算優點呢!!! 那個網頁伺服器沒跨平台,喔喔~講太早了, IIS 就是不能跨平台,或許這就是它市佔率持續下降的原因,強迫綁 Windows OS ,結果只要 Windows OS 下滑,它就必死無疑了。
  2. 開源的 BSD-like 授權。
  3. 靜態檔案輸出省資源。
  4. 不怕慢速連線。
  5. 比較不怕 DOS 攻擊。
  6. 穩定性高。
簡單講,除了效能,還是效能。而我要的功能, Nginx 都有提供,唯一算得上缺點的,就是因為 Apache 活得比較久,安全性已被磨得比較好了。所以對於我們愛研究的研究生來說,還有什麼理由不切換過去呢? 大概只有「懶」是個原因吧!

目前我們使用 Apache + Django 的方式多是利用 mod_python 的技術。然而這種作法是比較不安全的,把很多事都包給 Apache 去作,那不管是我們程式設計有錯,或是它用的元件有錯,只要出錯那就是管理員等級的錯。不過這個「錯」也不算是 Apache 的錯,是「用 mod_python 」的錯,如果用的是「 mod_fastcgi 」,那安全層級就能拉高了。

所以說來,這次的「升級」是把「 mod_python 」丟掉,改用「 mod_fastcgi 」。那麼我心裡想想,都要換成 Django 自己跑 fcgi mode 了,為什麼不乾脆連前端網頁伺服器也換一下呢! 因為重點已換成 Django 的 fcgi server , Apache 的重點性大減,前端網頁伺服器的功能只剩下靜態檔案輸出、虛擬站台切換、 https 處理等,那我何必跑一個 Huge Apache 呢? Nginx 就是我的新選擇。

安裝很簡單,如果是在 Ubuntu 中,請打:

$ sudo apt-get install nginx

如果是在 Windows 中,請到官網下載 nginx.zip 檔,解開了,就是一個可執行的 nginx 程式。

而我用的方法是下載源始碼自己編譯:

$ wget some_file_link.tgz
$ tar -zxf some_file_link.tgz
$ cd nginx
$ sudo apt-get install libpcre3-dev libssl-dev # 這些是編譯時,須用到的函式庫程式碼
$ sudo apt-get install libxml2-dev libxslt-dev # 這些是編譯時,須用到的函式庫程式碼
$ sudo apt-get install libgd2-xpm-dev libgeoip-dev # 這些是編譯時,須用到的函式庫程式碼
$ ./configure --prefix=/usr/local/nginx --with-debug --with-http_dav_module \
--with-http_addition_module --with-http_geoip_module --with-http_gzip_static_module \
--with-http_image_filter_module --with-http_realip_module --with-http_stub_status_module \
--with-http_ssl_module --with-http_sub_module --with-http_xslt_module \
--with-ipv6 --with-sha1=/usr/include/openssl --with-md5=/usr/include/openssl --with-mail \
--with-mail_ssl_module
$ make
$ sudo make install

這樣 Nginx 就安裝完成了。

接下來,我們作 Django 程式的設定,讓它可以跑在 fcgi mode 上,方法很簡單,原本我們在本機開發時,都是用:

$ python2.7 manage.py runserver 127.0.0.1:8080

讓它跑在 http://127.0.0.1:8080/ 上,現在則改用:

$ cd /home/somewhere
$ su - someuser -c "python2.7 manage.py runfcgi host=localhost port=3033 daemonize=true method=threaded workdir=/home/somewhere pidfile=/home/somewhere/fcgi.pid"

這樣 django 會在 127.0.0.1:3033 中,幫我們開一個 someuser 帳號權限的 fcgi server , daemonize=true 則表示指令打完後,它就背景處理了,想要把這個 fcgi server 殺掉,就去看看 /home/somewhere/fcgi.pid 的內容,裡面的編號就是系統行程編號, kill 那個編號就能關 fcgi server 了。

同時殺掉 fcgi server ,再馬上啟動它的指令可參考如下:

$ su - someuser -c "kill `cat /home/somewhere/fcgi.pid` && python2.7 manage.py runfcgi host=localhost port=3033 daemonize=true method=threaded workdir=/home/somewhere pidfile=/home/somewhere/fcgi.pid"

請注意在這個階段,你用瀏覽器去看 http://127.0.0.1:3033/ 是沒反應的,因為它現在跑的是 FastCGI 協定,不是 http 協定。瀏覽器無法跟 Django FastCGI 溝通。

接下來,我們再到 nginx.conf 去設定。Nginx 與 FastCGI Server 互動原理如下:
圖來自陈辉的博客
先由 Nginx 與瀏覽器互動,得到 GET, POST 等變數後,整理成 fastcgi 協定的變數,然後用 Socket 或 Port 方式傳遞給 FastCGI Server ,接下來就是 FastCGI 去驅動程式去處理,完成後拋回。

以下是 nginx.conf 的設定範例:

user www-data; # 子行程用的是 www-data 帳號
worker_processes 4; # 常駐 4 個子行程
pid /var/run/nginx.pid; # 紀錄母行程的編號
http {
    server_tokens off; # 網頁上不顯示伺服器版本編號
    sendfile on;
    tcp_nopush on;
    tcp_nodelay on;
    keepalive_timeout 30;
    types_hash_max_size 2048;
    include /etc/nginx/mime.types;
    default_type application/octet-stream;
    access_log /var/log/nginx/access.log;
    error_log /var/log/nginx/error.log;
    gzip on;
    gzip_disable "msie6";
    server {
        listen 80;
        server_name www.whatever-you-want.com.tw;
        root /var/www;
        index index.html;
        access_log /var/log/nginx/TW-access.log;
        error_log /var/log/nginx/TW-error.log;
    }
    server {
        listen 443;
        server_name www.whatever-you-want.com;
        keepalive_timeout 60;
        ssl on;
        ssl_certificate /etc/ssl/hoamon.info/hoamon.info.crt;
        ssl_certificate_key /etc/ssl/hoamon.info/hoamon.info.key;
        location "/" {
            fastcgi_pass_header Authorization;
            fastcgi_intercept_errors off;
            fastcgi_pass 127.0.0.1:3033;
            fastcgi_param PATH_INFO                          $fastcgi_script_name;
            fastcgi_param  GATEWAY_INTERFACE  CGI/1.1;
            fastcgi_param  SERVER_SOFTWARE       nginx;
            fastcgi_param  QUERY_STRING                $query_string;
            fastcgi_param  REQUEST_METHOD         $request_method;
            fastcgi_param  CONTENT_TYPE                $content_type;
            fastcgi_param  CONTENT_LENGTH          $content_length;
            fastcgi_param  SCRIPT_FILENAME           $document_root$fastcgi_script_name;
            fastcgi_param  REQUEST_URI                     $request_uri;
            fastcgi_param  DOCUMENT_URI                 $document_uri;
            fastcgi_param  DOCUMENT_ROOT            $document_root;
            fastcgi_param  SERVER_PROTOCOL         $server_protocol;
            fastcgi_param  REMOTE_ADDR                 $remote_addr;
            fastcgi_param  REMOTE_PORT                  $remote_port;
            fastcgi_param  SERVER_ADDR                  $server_addr;
            fastcgi_param  SERVER_PORT                    $server_port;
            fastcgi_param  SERVER_NAME                  $server_name;
        }
        location "/media" {
            autoindex on;
            root /home/somewhere/media;
        }
        access_log  /var/log/nginx/whatever-you-want.access_log;
        error_log   /var/log/nginx/whatever-you-want.error_log;
    }
}

上面有兩個虛擬站台,一個是給 www.whatever-you-want.com.tw ,一個是給 www.whatever-you-want.com 。

www.whatever-you-want.com.tw 只是單純的靜態網站,預設首頁是 http://www.whatever-you-want.com.tw/index.html ,而它的硬碟位置在 /var/www/index.html 。

而使用者若是瀏覽 https://www.whatever-you-want.com/media 的連結,則 Nginx 會給它 /home/somewhere/media 資料夾內的所有檔案。除了 /media/.* 外,其他的連結都會用 3033 port 送到 Django FastCGI Server 處理。

而使用 https 的方法,只須要設定 3 個變數值: ssl , ssl_certificate , ssl_certificate_key 即可。

設定完成後,用指令開啟 Nginx :

$ /usr/local/nginx/sbin/nginx

重新載入:

$ /usr/local/nginx/sbin/nginx -s reload

關閉:

$ /usr/local/nginx/sbin/nginx -s stop

這樣 Nginx 伺服器就建立完成了。

在新架構下,可以由系統管理員獨立控管 Nginx 網頁伺服器的開啟、關閉,而讓程式設計師,自行作 FastCGI Server 的管理,程設師自己作程式更新、套用,避免給予過多的權限。畢竟這兩者的知識領域是有別的,少有人兩邊都作得很好。

=== 以下可能是 *nix(含 Mac) 專用(因為我不知道 Windows 能不能作 unix:socket 的指定) ===

如果我們一台機器有多個 django-base 的虛擬站台,那麼一個 django-base project 就要花一個 port ,這對於系統管理員及程式設計師而言,容易有搞亂的可能性,畢竟 "網址" <=> "port" <=> "django-base project" 的過程當中,是文字對應數字,再對應文字,難以記在人的腦中(也可能是我的記性比不上平均值吧!)。

所以我建議使用 Unix Socket 方式作對應。程式設計師把 socket 開在程式庫的 root 資料夾中,並取名為 django.socket 。再將 django.socket 權限設為 770 ,然後系統管理員把這個 django.socket 擁有群組設為 www-data 。

程式專案在 /home/someproject/ ,設定範例如下:

$ cd /home/someproject && /usr/bin/python2.7 manage.py runfcgi socket=`pwd`/django.socket method=threaded workdir=`pwd` pidfile=`pwd`/pid daemonize=true

上面程式設計師跑起一個 django-base 專案,並將 socket 開在 /home/someproject/django.socket 。

然後系統管理員作權限設定(也可以用 visudo 指給程式設計師作權限設定):

$ sudo chgrp www-data /home/someproject/django.socket
$ sudo chmod 770 /home/someproject/django.socket

系統管理員再把 nginx.conf 原本的 fastcgi_pass 127.0.0.1:3033 設定改如下:

        fastcgi_pass unix:/home/someproject/django.socket;

改成這樣的設定方式,對程式設計師來說,永遠是把 socket 開在同一個專案資料夾中,並命名為 django.socket ,而系統管理員也知道一定是專案資料夾下的 django.socket 。少了數字 port 的對應記憶,減少錯誤的機率。

四月 17, 2011

hoamon's sandbox
hoamon
hoamon's sandbox is about »

tag cloud

» How to get a free HTTPS web certification authority by StartSSL.com

一般在上網時,所用的 Http 協定是明碼的,使用者與網站伺服器之間的任何網路結點(閘道器)都有方法可以看到網路連線所傳遞的訊息,所以如果網站所提供的服務關係到機密(隱私)資料時,我都會讓網站用 Https 加密協定服務。

使用 Https 服務時,有一個重要觀念: 如何拒絕「中間人攻擊」。

假想一個以 Https 加密協定服務的 A 網站,在它與使用者傳遞公錀(加密憑證)時,是被一個中間人接走,而中間人再把它自己的公錀傳遞給使用者,結果使用者傻傻地使用中間人的公錀加密,再把加密資訊傳到中間人,而中間人用自己的私錀解密後,再用 A 網站公錀加密傳回 A 網站,在這個模式,雖然使用的是 Https 協定,但資料還是被中間人看光光了。

所以要防止此類攻擊,就必須讓使用者能「確認」公錀真的是 A 網站的。方法是使用者自己手頭上要有一些公認機構所發行的公錀憑證(一般的瀏覽器都已經包入),然後在拿到 A 網站的公錀憑證時,用手頭上已有的公認機構公錀憑證去驗證這個 A 網站的公錀憑證是否被這些公認機構簽核過,如果有,則表示公錀的確就是 A 網站的,當使用者用這把公錀加密時,就只能被 A 網站解密。

本篇文章的目的是站在 A 網站的立場上,如何將 A 網站的公錀交給公認機構作簽核,這樣使用者在瀏覽 A 網站時,才不會跳出一個警示視窗告知使用者:「 A 網站有安全疑慮」。

一般將公錀交給公認機構去作簽核是要花錢的,像是國內最大的簽證公司(我猜的)網際威信最便宜的簽核年費是 18000 元。這筆費用不是每個人願意負擔的,像是我的 https 網站,主要是提供我們團隊作專案管理之用,也就不到 10 位的使用者,要我花 18000 元,去買一個「讓使用者在一年之內不會看到該網站有安全疑慮」的警告訊息,這我可花不下手。

所幸,有公認機構了解這種需求,它以「一年免費」作廣告宣傳,如果有更高級的簽核需求,它才額外收費。那麼以我上述所要的,其實就拿那個「一年免費」用用即可。

首先請使用 Firefox (它們目前不支援 Chrome)去瀏覽 http://www.startssl.com/ ,並點選右上角的錀匙圖示,如下圖:


就能看到 Sign-up 按鈕,如下圖:


按下 Sign-up 按鈕就開始註冊帳戶的流程,整個公錀簽核的程序分成三個階段:
  1. 註冊帳戶
  2. 驗證網址
  3. 公錀簽核
1. 註冊帳戶時, startssl 會給你的瀏覽器一個全新的公私錀檔,這個公私錀檔是專供你的帳戶使用的,這個公私錀檔要好好保管,搞丟了,你就不能再用這個帳戶申請簽核的動作,因為它的登入不是用帳號密碼作登入機制,而是用公私錀作登入機制。

2. 驗證網址,你必須證明要作簽核的網址是你所管理的。而這個驗證動作完成後,你也只有 30 天的期限去作簽核它的公錀,過期後,就必須再次驗證網址。

3. 針對已驗證過的網址,你可以申請簽核公錀的動作,主要分兩種作法,一是 startssl 完全生出一把全新的公私錀憑證; 二是我們自己生出私錀及公錀請求檔,再把公錀請求檔交給 startssl 去作出已簽核的公錀。本文是介紹第二種方法,因為私錀應該是自己處理會比較妥當,不要懶惰到連解密錀匙也委託他人製造,我個人認為這種人不只懶還不負責任。

原則上,公錀不過是一個文字檔,所以它在 Linux, Window$, Mac 作業系統下,都能處理,但我個人還是喜歡用 Linux 來作這件事

1. 註冊帳戶:


請填寫你的詳細資料,原則上,他們只採 web 審核,所以只要你的資料不要「太假」,他們都會通過。


請到註冊信箱接受具驗證碼的信。並注意「目前的這個視窗」是不允許關閉的,如果你關閉當下這個網頁,再用相同連結回來,這樣你填寫的驗證碼就算是對的,它也不會通過你的申請。


產生「帳戶」專用的公私錀檔,可選擇 Hign Grade 。


將公私錀檔安裝至瀏覽器上,這裡的公私錀檔是指你的帳戶與 startssl 網站溝通時,所用的公私錀檔,而不是你的網站要用的公錀。


建議你備份這份公私錀檔。


完成後,可見到帳戶頁面。

2. 驗證網址:


我是選擇 Domain Name Validation 方式。


填入網址。


startssl 會從 whois 資料中抓出管理員信箱,所以你必須確認該網址的 whois 內容是正確的。


請到信箱收取驗證碼。並填入上面的 Verification Code 中。


成功後,你只有 30 天的時間,去簽核該網站的公錀檔。

3. 簽核公錀:


公錀可以有很多種用途( Email/XMPP/Object Code ),但目前我只需要 Web 的,所以選擇 Web Server SSL/TLS certificate 。


要使用自己獨立生成的私錀來作簽核公錀的動作,請選擇 Skip 。

欲生成長度為 4096 bits 的私錀檔並使用 des3 格式作私錀加密(密碼長度要大於 4 個字元),請使用如下指令:

# openssl genrsa -des3 -out exmple.com.key 4096
Generating RSA private key, 4096 bit long modulus
................................................................................................................................................................++
...............................................++
e is 65537 (0x10001)
Enter pass phrase for exmple.com.key:
Verifying - Enter pass phrase for exmple.com.key:

從新增的私錀中,產生一個憑證請求檔,並在請求檔中,寫入「目標網址」(也就是你剛驗證過的那個網址)的所屬資料,如:所在地、單位名稱、負責人信箱等:

# openssl req -new -key exmple.com.key -out exmple.com.csr
Enter pass phrase for exmple.com.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]:{{Taichung}}
Locality Name (eg, city) []:{{Taichung}}
Organization Name (eg, company) [Internet Widgits Pty Ltd]:{{EXAMPLE-Company}}
Organizational Unit Name (eg, section) []:{{EXAMPLE-Company}}
Common Name (eg, YOUR name) []:{{EXAMPLE Company}}
Email Address []:{{master@exmple.com}}

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:


兩個 {{ }} 所包住的部份,請自己修改成正確資料。


在 Linux 完成 CSR 檔的製作後,你會得到 example.com.csr 檔案,請將檔案內容貼入上圖的文字框中。


CSR檔如無誤,它會出現上圖的訊息。


它要你選擇要生成簽核公錀的頂層網域。


請填入你所提供 https 服務的網址名稱。


確認要簽核公錀的網址。 startssl 簽核的公錀,預設會給你的目標網域及它的頂層網址兩個。如果你要簽核公錀的網址希望是 *.example.com ,也就是除頂層網域外,把它的下層網域一網打盡,也是可以,只要二年付 USD 49.9 即可,大約 1500 元的新台幣,而且這是 wild cards 網址,網際威信可沒這麼好康,一個就要 18000 元、二個就是要 36000 元。這時,我又感到「全球化」的愉悅。


接下來,請把文字框中的文字貼到 example.com.crt 中,這個內容即已被簽核過的公錀檔。另外,請順便下載上圖中的 intermediate 及 root 兩個 CA 檔案。


整個工作完成了。

然後在 Apache 設定檔中設定如下:
SSLEngine on
SSLProtocol all -SSLv2
SSLCipherSuite ALL:!ADH:!EXPORT:!SSLv2:RC4+RSA:+HIGH:+MEDIUM
SSLCertificateFile /etc/apache2/example.com.crt
SSLCertificateKeyFile /etc/apache2/example.com.key
SSLCertificateChainFile /etc/apache2/sub.class1.server.ca.pem
SSLCACertificateFile /etc/apache2/ca.pem
SetEnvIf User-Agent ".*MSIE.*" nokeepalive ssl-unclean-shutdown

重新啟動 Apache 時,它會問你私錀密碼為何? 這個動作在管理員面前發生是沒有問題的,但在系統自動重開機時,會造成困惱,所以我們可移除私錀的加密,指令如下:

# openssl rsa -in exmple.com.key -out exmple.com.key.no_password

exmple.com.key.no_password 這個私錀檔就是沒加密的,將它寫入 apache 設定檔即可。

四月 16, 2011

hoamon's sandbox
hoamon
hoamon's sandbox is about »

tag cloud

» SSH 的公私錀生成說明

Linux/Mac:

請在命令列鍵入如下指令:

$ ssh-keygen -t rsa -b 4096


Generating public/private rsa key pair.
Enter file in which to save the key (/home/tmp/.ssh/id_rsa): <<按 Enter ,使用預設值>>
Enter passphrase (empty for no passphrase): <<設個私錀密碼,請大於 5 個字元>>
Enter same passphrase again: <<確認剛剛的私錀密碼>>

Your identification has been saved in /home/tmp/.ssh/id_rsa.
Your public key has been saved in /home/tmp/.ssh/id_rsa.pub.
The key fingerprint is:
72:fb:40:ba:8a:40:be:48:03:bd:20:13:6d:83:cb:d0 tmp@core2duo
The key's randomart image is:
+--[ RSA 4096]----+
| |
| + |
|+ A |
|o= . |
|*o. T . S |
|=o . = . |
|.-. . o |
|o.o. . o |
|... ... . |
+-----------------+


這樣,你的公錀就是 ~/.ssh/id_rsa.pub 而私錀就是 ~/.ssh/id_rsa 。

$ cat ~/.ssh/id_rsa.pub
ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAgEAz22m/azvKC7uk05/D6qvl5c+QR95jkiqEpnn3/co/zOGc4Gf7v1sc5H7Lf5CUOTxgfgAOZSmdr1OPaUYU1cvJTLTjKeVznifyTl3KabMH1Yy8wpSS1TjCTbS8896uXXYtrdIL5KEHnVADYdS4fHWtY7uAR+JWlbh9OjN3deU77656knwW0PO5ELMYKUicSZZZFoUFyDCflM61cNNP1i/rwa1pp8nFqyjzNOq5hKaEsssiJK4tPcm+5K8rwRXm3k7fprvoxYswebo9U85kvyWPqY0iMFE0P019Pbq5VWCaqfv9nzD7rZaKe+aLk/7n+E4HSSSLYNlhnQkZUVm40zGnhGEZvT0e+kmpJpXJKjAe3ZJkowc3o8xrBjD0ULP+jN1fHMUxllWOuxgNkqdD/UjXf5E777Zw+Fpoy2B1c/wRPpRfsFisfLg9xxj3MF+E3wkHROOtrSv+M2wLKVtDODF4zwO8dr5g9s5xBTlSJFsBCJGmX2+zQ6y2033amRnr/Xl0+KAqCOdO+BmQ+iw7X0DFCfxZtjx4RQXcGYw3HqSKP3I4Tft0IHD0g1HXuQhMezG6yVIVABgbo47+Xbdxx7vFb82Anv7DnmhbOovk3LDrzPzyNe7fS2Jla5T5Etb5jyEHE1qNfJNzKVgxjBMGKGk7L5GIx7pXUk= tmp@core2duo

把上面的公錀內容放到你想登入的 Linux/Mac 機器中的 ~/.ssh/authorized_keys2 (這個檔,其實是看系統管理員是怎麼設定的,只不過一般的 Linux 套件都是用這個作預設值)中,這樣你就能使用這一對公私錀登入遠端機器了。

Windows:

就比較麻煩了,請去下載 puttygen.exe 程式,執行它後如下圖:



選擇 SSH-2 RSA 及輸入 4096 的 Number of bits in a generated key 後,再按下 Generate 按鈕,讓滑鼠停留在綠色生成桿的下方空白處,並胡亂移動滑鼠遊標,讓 puttygen.exe 得到亂數種子,待進度達百分百後,可得到下圖:



選取的藍色文字即公錀內容,請貼到你欲登入的 Linux/Mac 機器中的 ~/.ssh/authorized_keys2 中,而私錀部份,請在設定密碼「Key passphrase」及確認密碼「Confirm passphrase」後,按下 Save private key 按鈕以存檔至系統硬碟。

最後,請保護好你的私錀檔(最好不要離開生成它的機器硬碟),遺失它或是被別人盜取後的代價相當大。 Good Luck!

五月 28, 2010

hoamon's sandbox
hoamon
hoamon's sandbox is about »

tag cloud

» 如何解決 TortoiseHG on Windows 上中文檔名的問題

因為 Windows 在紀錄檔案名稱時,是用 UTF-16 ,而不是 UTF-8 作紀錄,所以如果在 Windows 中,加入一個「中文檔名(嚴格來說,是非 ascii 編碼的名稱)」的檔案,那麼這個檔案到了 Mac OS X, Linux 平台時,就無法使用了。


要解決這個問題,只要 Windows 使用者用 fixutf8 extension 先處理檔名即可。下載程式碼後,只要到 hgrc.d/Mercurial.rc 檔中,加入

[extensions]
fixutf8 = C:/fix-utf8/fixutf8.py

但使用這個外掛(16 (baf283ab9f92)版)會導致 TortoiseHG 無法作 commit 的動作,這 commit 問題,我找了很久,但實在沒辦法解決,只知道 TortoiseHG 將 commit message 以 cp950 送出,但 fixutf8 卻要求 message 要以 utf8 進入,但那裡的程式要修改,我就 de 不到了。

目前我只能回到 cmd.exe 底下,用 hg ci 來作提交動作。

而且,在使用 fixutf8 下,有可能會導致 merge 功能錯亂,這時候,就只得用 Linux/Mac OS X 來解決 merge 問題。

五月 5, 2009

hoamon's sandbox
hoamon
hoamon's sandbox is about »

tag cloud

» 使用 PGP 來建立人際信任網

當我們可以使用自己生成的 PGP 公私錀來作加解密及簽章驗證的工作後,事實上,我們還能將 PGP 運用得更淋離盡致: 我們把整個人際關係展現在我們的公錀上。

當你把公錀四處發放的時候,實際上,你正在宣告這個世界,這把公錀可以代表你的身份,用這把公錀所加密的訊息只有你才看得到。而只要相信了「這把公錀就是對應著你的身份」這個關係後,也代表「這把公錀」所驗證成功的某個訊息,必定是由「你」所發佈的。

以上,就是 PGP 信任網的基礎: 一把公錀代表一個人。

所以,如果有一個 A 用他的私錀 Sa,為另一個 B 的公錀 Pb 作簽章而得到 Pb'(這也就是為什麼一把公錀生成後,會有變動發生的原因),那麼我們可以透過 Pa 來作 Pb' 的驗證,驗證成功後,我們將了解到 A 這個人完全為 B 的新公錀 Pb' 負責,因為 Pb' 是 A 所簽章過的。也就是,我們可以合理地相信 A 這個人一定認識 B 這個人,而且他也同意 Pb' 是屬於 B 這個人的公錀

所以,本來我們可能只認識 A ,相信 Pa 是 A 的代表,但是透過 Sa 對 Pb' 的簽章,我們間接地相信 Pb' 是 B 的代表,就算原本我們根本不曉得 B 是何許人也,就算 B 也沒告知我們他的公錀編號,但我們可以透過 A 來相信 Pb' 代表 B 了。

簡單地講,你可以使用個人私錀為「認識(信任)的人的公錀」作簽章 *1,簽章後,別人就會知道你一定認識這些人。

註1: PGP 信任網中,所謂的信任並不指的是一般的信任,並不是說你簽章了某個人的公錀,就表示你相信這個人是「好人」,這裡的信任,指的是你「確認」該公錀的確是這個人所擁有的。

這麼作的好處是什麼? 如果你想要寫一封信給歐巴馬(想當然耳,你一定不認識他),又希望你的內容只有他看得見且連他的幕僚也無法事先閱讀,那麼你就可以先下載他的公錀,用他的公錀來加密。但在加密前,得先確認他的公錀有沒有經過你認識的人作過簽章,如果有,則表示這把公錀的確是歐巴馬所擁有。

有沒有可能你不直接認識歐巴馬,但卻透過你的朋友的朋友來認識到歐巴馬呢? 因為他的公錀被 A 簽章過,而 A 的公錀又被 B 簽章過,而 B 的公錀又被 U 簽章過,最後湊巧你認識 U 這個人。這真的是有可能的,請參考六度分離理論 *2。

註2: 六度分離理論告訴我們,地球上的任二個人,他們之間只被 6 個人隔離,也就是你必定能透過某人的朋友去認識某人的朋友再去認識某人的朋友再去認識某人的朋友再去認識某人的朋友去認識某人的朋友來認識地球上的任何一個人。

了解了 PGP 這麼偉大的信任網概念,那麼該如何實現呢? 很簡單,你只要為你所認識的人的公錀所簽章,那麼就能協助體現 PGP 信任網了。

一樣來到「金錀管理程式」的介面。(不知道如何叫出嗎? 請參考如何使用 PGP (Linux/Mac/Windows 皆適用)來加解密及簽章驗證)



選擇一把欲簽章的公錀並按下[簽章],然後再按下[Sign this key]並選擇使用那一把私錀來簽章。完成後,你就會看到該公錀下出現你金錀的資訊,這代表已簽章成功。



** 在為某些公錀簽章時,可能會出現失敗訊息,原因可能是 FireGPG 尚未支援該公錀的額外資訊簽章,如:相片資訊(是的! 公錀也可以放相片。要看別人公錀中的相片請打 gpg --list-options show-photos --list-keys {XXX})。

所以這時候,可以使用命令列來作,如下指令:


# gpg --sign-key {XXX}

並回答它所提出的問題即可。{XXX}代該公錀編號。
**

接下來把該簽章後的公錀匯出至伺服器,並告知該公錀的擁有者:「你已經確認了這把公錀就是代表他這個人,請他可以更新自己的公錀」。

那如果是別人簽章了你的公錀後,請務必記得:「如果你認識這個人且確認他的公錀是那一把的情況下,絕對要用你的私錀去簽章他的公錀,因為這是禮貌」。當然啦, PGP 並沒有強迫你一定要這麼作,但如果你這麼作了, PGP 信任網會更完備。

在簽章他人公錀時,請務必記得:「這個簽章不是恩惠,是一種信任,唯有你認識的人才作簽章。不認識的人請不要簽章。」

除了用自己的私錀去簽章他人公錀外,我建議各位也可以利用 PGP 信任網的概念,為自己的私錀買保險。

什麼是買保險? 之前我提過,如果私錀搞丟了,是不是之前別人用它對應公錀所加密的內文,你完全就看不到了。沒錯,的確是完全看不到了。但是逝者已矣,來者可追,你還是得繼續用 PGP 來過你未來的生活呀! 但是如果你原本的公錀已經有 200 個人為它作過簽章了,那麼你的新公錀難道要重新再去找這些人作一次簽章嗎? 是的,你必須再麻煩當初的 200 個人為你重新再簽章一次。但那些人如何確認你的新公錀的確可以代表你呢! 你勢必得再經歷 200 次由第三方管道(面對面確認、電話確認等非網路形式的確認)提供公錀編號讓對方知道你的新公錀的確代表你的動作,嘩! 這會累死人。

所以,我建議各位多生幾把金錀,並彼此互相簽章,如下圖:



amornose@gmail.com 這把金錀已被 hoamon@hoamon.info, hoamon@gmail.com ... 等金錀給簽章過了。所以如果我的主要使用金錀 HOamon@hoAmon.iNfo 不小心搞丟了,那麼我就用 AmOnroSe@Gmail.Com 的信箱寄信給那 200 個人,並告知我的公錀必須更換為 AmoNrosE@GmaiL.com 了,因為早在之前 amoONrose@gmail.com 已被 hoamon@hoamon.info 所確認過了,所以,那 200 個人可以很容易地相信我這個人已把 hoamon@hoamon.info 公錀更換成 amonrose@gmail.com 了。這就是買保險的意思。

最後,再提醒各位一次,私錀搞丟了,的確是很麻煩的一件事,請慎重保管呀!


五月 4, 2009

hoamon's sandbox
hoamon
hoamon's sandbox is about »

tag cloud

» 如何使用 PGP (Linux/Mac/Windows 皆適用)來加解密及簽章驗證

最簡單的方式就是安裝 GnuPG, Firefox, FireGPG但為什麼要用 PGP 呢?

GnuPG: 是作業系統上的應用程式,其功能是以 PGP 公私錀作文章或檔案的加解密及簽章之用。其操作介面為命令列模式。
FireGPG: 是 Firefox 的外掛套件,它的功能是提供操作 GnuPG 程式的圖形介面。
Firefox: 不用說了吧! 現在還有人不知道 Firefox 是幹什麼的嗎?

上面程式都安裝好後,請打開 Firefox > 工具列 > 工具 > FireGPG > 金錀管理程式,如下圖:



我已經有一些金錀(有些是公錀,有些是私錀,但一律顯示公錀編號)了,綠色框是名稱及註釋、黑色框是 email 、黃色框是金錀編號、紅色框是信任程度。

如果是自己產生的金錀,則同時擁有公私錀,如果是別人給的金錀,則只有公錀。我們都是拿公錀來加密,然後用私錀來解密的,或是用私錀來簽章,再用公錀來驗證。

如果你還沒有金錀,請按下[New Key],然後填寫

  1. Name(最好是別人認得出你的名字)
  2. Email(必須吻合你使用的email,否則使用你公錀的人會誤會這把公錀的真實使用者是誰?)
  3. 註釋(可簡單說明你是誰)
  4. 密碼(這是用來鎖住私錀的,以防止你的私錀不小心落入別人手上,如果沒有這個密碼,別人也無法拿這把私錀來作解密的動作。同樣地,如果你忘了這個密碼,那麼你的公錀也就無用,且過去別人用該公錀加密的內容,你也解不開了,請慎重。)
  5. 建議點選金錀永遠不失效(Never Expire)。
再來就是按下[產生金錀]了。請耐心等候一段時間。並在此時胡亂開啟你的程式,亂打一些指令或文句,讓這把金錀不致於與別人的金錀重複。

成功產生後,要測試加解密的功能,可打開 Firefox > 工具列 > 工具 > FireGPG > 文字編輯器。

請在文字編輯器中,鍵入文句,完成後請點選加密,此時會詢問你用那把公錀,可以 Ctrl 鍵作複選,完成後,該文句就會變成一堆奇怪的亂碼,此亂碼只有你當初選定的那些公錀所對應的私錀才能作解密的動作。

再按下解密鈕, FireGPG 即會找尋該密文所對應的私錀作解密,如果你的私錀當初有設定密碼,此時,會先詢問你密碼為何! 正確鍵入後,它即為你解密。

接下來,測試作簽章及驗證,一樣打開 Firefox > 工具列 > 工具 > FireGPG > 文字編輯器。

請在文字編輯器中,鍵入文句,完成後請點選簽章,此時會詢問你用那把私錀(只能選定一把),完成後,該文句後面會出現一段奇怪的驗證碼,此驗證碼只有你當初選定私錀所對應的公錀才能作驗證的動作。

再按下驗證鈕, FireGPG 即會找尋該驗證碼所對應的公錀作驗證,驗證成功後,會顯示私錀的公開資訊(名稱、註釋、email、公錀編號)及簽章時間。

上面的工作都可正確使用後,接下來,就是把公錀傳給其他人。有二種方式,一種是[匯出至檔案],一種是[匯出至伺服器]。

匯出至檔案後,你可以透過第三方管道(像是隨身碟、email、放在blog 上)把公錀傳遞給其他人,這樣別人在收到公錀後檢查它的 fingerprint 或是公錀編號是否與你真實公錀相同,相同時就可確定這把公錀的確是你所屬的。但此法的缺點是不容易更新公錀內容(什麼,公錀不是一開始產生後,就一直用下去嗎? 為什麼會有變動。欲知詳請,請待下篇分解)。

另一種方式[匯出至伺服器],則是把公錀上傳至某一伺服器( FireGPG 的預設值是 subkeys.pgp.net ),然後跟其他人告知你的公錀編號及 fingerprint ,讓其他人到 subkeys.pgp.net 去下載。此法在使用上比較便利,省去了自行傳檔的功夫,一律要求其他人到公錀伺服器上抓取。

當你把公錀上傳至伺服器後,你就要廣為宣傳你的公錀編號、email,慎重一點的,還可以註明 fingerprint 。像我的處理方式就是放在 http://hoamon.blogspot.com/http://www.hoamon.info/#AboutMe 中,以及我在實體名片及信件簽名檔上都放了公錀編號、 email 及 fingerprint 。方便其他人比對公錀的真實性。但請注意一點,如果你是用網路形式來比對公錀編號的話,它會有一定程度的不可信,因為你不知道你的閘道器管理員有沒有動過手腳,最好的確認方式是與公錀主人面對面比對 *1,再次之是電話比對(已經有風險了),其他方法的風險就更高了。

註1: 如果你看過天龍特攻隊的話,或許你就會知道「面對面比對」也是有風險的,因為你不知道對方是不是「小白」。

當大家都擁有你的公錀時,就能寄送加密文本給你,如此一來,絕對可以保證,發文者與收文者之間沒有人可以破解此一加密文本。

不過,以上兩種匯出方法,所匯出的都只是公錀,如果想要匯出私錀來作備份的話,就必須打指令了,記得公錀不用作備份,它是可以從私錀中產生的。但其實也非常簡單,指令如下(Windows 用戶請到你的 GnuPG 安裝位置中打該指令):

# gpg -a --export-secret-keys {XXX} > private_key.txt

{XXX} 可以是 email 位置,也可以是公錀編號。匯出後,私錀內容就存在 private_key.txt 中。請慎重保管此檔。

又如果你想要把某個檔案作加密,也是得使用命令列來達到,如下(可用多把公錀加密):

# gpg -r {XXX} -r {YYY} -e {some_filename_you_want_to_encrypt}

解密則直接下

# gpg -d {some_fileame} > new_filename


biggo.com.tw

A Django site.