Ads 468x60px

Pages

2011年12月30日 星期五

多重網域 UCC SSL 憑證的申請方式 Multi-domain UCC SSL on one certificates

近代,使用 https 協定的網站或服務,經常是由多個 domain name 來組成一個網頁,可是 ssl v1.0 只允許單一 SSL certificate 使用於單一 domain name,這樣,在使用上就會有問題。

要支援 multiple sites 使用 HTTPS 以及名稱虛擬主機(Name-Based Virtual Host) 可以使用

  1. Wildcard Names(萬用字元): specified in RFC2818
  2. Subject Alternative Names(憑證主體別名):  x509 version 3 certificate (specified in RFC3280)

這二者在使用上是不同的。萬用字元是用在同一個 sub-domain 之下的,例如: *.example.com 的憑證, 可以使用在 www.example.com, foo.example.com, bar.example.com, 但是不可以使用在 example.com, aaa.www.example.com. 而憑證主體別名卻可以涵蓋多個不同的網域,例如:www.mydomain.com 的憑證,可以包含 www.myimage.com, foo.myugc.com, foo.bar.mydomain.com. 至於如何挑選要使用那一種憑證,就要視你的網站規劃而定了,它們的費用也不一樣,正常來說,萬用字元會比憑證主體別名還貴。

以下詳列「憑證主體別名」的申請以及自行簽章的方式,環境為 Cent-OS 5.x, OpenSSL 0.9.8e. 你需要修改 /etc/pki/tls/openssl.cnf

1. 啟動擴展
[req]
req_extensions = v3_req
2. 增加 subjectAltName 到 v3_req 的區段
[ v3_req ]
subjectAltName = @alt_names
3. 例如你要包含的多個網域
[alt_names]
DNS.1 = example.com
DNS.2 = hello.example.com
DNS.3 = testing.com
DNS.4 = www.testing.com
DNS.5 = foo.testing.com
4. 修改完成,存檔後,接著產生私密金鑰
openssl genrsa -des3 -out www.example.com.key 2048
這個步驟,一定要你輸入 passphrase;不過在未來使用上,重啟 Apache Server 時,都一定要輸入這個 passphrase 有點麻煩。我們可以另外產生一個不需要 passphrase 的 key 來使用。
openssl rsa -in www.example.com.key -out www.example.key.insecure
5. 產生 CSR(憑證簽署請求)
openssl req -new -key www.example.com.key -out www.example.com.csr
按照步驟填入適當資料,請注意,在填寫 commonName 的地方,就是填入你的主網站名稱,如本例:www.example.com 做完之後,就會有一個 www.example.com.csr 的檔案,在你當前的目錄中,接著我們確認一下
openssl req -text -noout -in www.example.com.csr
應該會看到
Attributes:
        Requested Extensions:
            X509v3 Basic Constraints:
                CA:FALSE
            X509v3 Key Usage:
                Digital Signature, Non Repudiation, Key Encipherment
            X509v3 Subject Alternative Name:
                DNS:example.com, DNS:hello.example.com, DNS:testing.com, DNS:www.testing.com, DNS:foo.testing.com
這樣,你就可以拿這個 CSR 去申請有效的 SAN 憑證了。在此,我們繼續做自行簽章及核發的動作。
openssl x509 -req -days 3650 -extfile /etc/pki/tls/openssl.cnf -extensions v3_req -in www.example.com.csr -signkey www.example.com.key -out www.example.com.crt
這裡,要注意一下,一定要加 "-extfile /etc/pki/tls/openssl.cnf -extensions v3_req" 這二個參數(卡關很久啊!);然後,再驗證一下
openssl x509 -text -noout -in www.example.com.crt
應該會看到
X509v3 extensions:
            X509v3 Basic Constraints: 
                CA:FALSE
            X509v3 Key Usage: 
                Digital Signature, Non Repudiation, Key Encipherment
            X509v3 Subject Alternative Name: critical
                DNS:example.com, DNS:hello.example.com, DNS:testing.com, DNS:www.testing.com, DNS:foo.testing.com
這樣,就大致完成了。接著就 copy www.example.com.key.insecure, 以及 www.example.com.crt 到你的 Apache Server, 並設定 apache conf(請自己 google 一下就不贅述了)

2011年12月16日 星期五

node.js & npm 安裝注意事項 (用 forever 執行 node.js)


node.js 及 npm 的安裝都需要編譯的環境,也跟使用者的環境變數有很大的關係;以下分別逐一說明編譯、安裝、執行的注意事項,主要分成二大步驟

1. 在 server1 上編譯及安裝
2. Deploy 到 server2 上,安裝及執行

準備編譯環境
Before install nodeJS, please ensure your environment prepared these tools, below:
python - version 2.6 or higher.
GCC - c++ complier
Git

python update
yum install python26;
mv /usr/local/bin/python /usr/local/bin/python.bak;
ln -s /usr/bin/python2.6 /usr/local/bin/python;
編譯 node.js (v0.4.12 為例),並安裝到 ~/node.out
kevin@server1 {~}$ git clone --depth 1 git://github.com/joyent/node.git node
kevin@server1 {~}$ mkdir node.js
kevin@server1 {~}$ cd node
kevin@server1 {~/node}$ git checkout v0.4.12
kevin@server1 {~/node}$ ./configure --prefix=~/node.out
kevin@server1 {~/node}$ make -j2 # -j sets the number of jobs to run
kevin@server1 {~/node}$ make install
執行完成後,在你的 ~/node.out 會有以下目錄
kevin@server1 { ~/node.out  }$ ls
bin  include  lib  share
nodeJS installation is finished, we can input some test code for making sure nodeJS is ready.
kevin@server1 { ~/node.out/bin  }$ ./node --version
#result : v 0.4.12
編譯及安裝 NPM 到 ~/npm.out
Before install npm, please ensure your environment variable(path) is ready.
kevin@server1 { ~ }$ export PATH=$PATH:/usr/local/bin
kevin@server1 { ~ }$ env | grep PATH
PATH=/bin:/usr/bin:/usr/local/bin
Now npm package wrote a shell script for quick install, we download this and
kevin@server1 { ~ }$ mkdir npm.out
kevin@server1 { ~ }$ export npm_config_prefix=~/npm.out
kevin@server1 { ~ }$ curl http://npmjs.org/install.sh | sh
注意:如果沒有 "export npm_config_prefix=~/npm.out", 預設會安裝到 /usr/local 下,這樣會有檔案權限的問題,所以我們需要設定這個環境變數

After shell script executed, run npm test
kevin@server1 { ~ }$ cd npm.out/bin
kevin@server1 { ~/npm.out/bin }$ ./npm --version
#result: 1.0.105
安裝 npm modules,這個步驟跟你所在的目錄有很大的關係,預設會裝在目前目錄下的 npm_modules ,這不是我們要的,所以請照以下步驟
kevin@server1 { ~ }$ cd npm.out/lib
kevin@server1 { ~/npm.out/lib }$ npm install forever -d # 目前預設會裝 0.7.5,會遇到問題
...
npm info addNamed [ 'timespan', '2.0.x' ]
npm info addNamed [ 'watch', '0.4.x' ]
npm info addNamed [ 'utile', '0.0.x' ]
npm info addNamed [ 'winston', '0.5.x' ]
npm ERR! error installing forever@0.7.5 Error: ETIMEDOUT, Connection timed out
npm ERR! error installing forever@0.7.5     at Socket._onConnect (net.js:576:18)
npm ERR! error installing forever@0.7.5     at IOWatcher.onWritable [as callback] (net.js:165:12)
npm info unbuild /home/kevin_luo/npm/lib/node_modules/forever
npm info preuninstall forever@0.7.5
npm info uninstall forever@0.7.5
npm info postuninstall forever@0.7.5
npm ERR! Error: ETIMEDOUT, Connection timed out
npm ERR!     at Socket._onConnect (net.js:576:18)
npm ERR!     at IOWatcher.onWritable [as callback] (net.js:165:12)
...
我的解決的方法是先裝 0.6.5 ,再裝 0.7.5
kevin@server1 { ~/npm.out/lib }$ npm install forever@0.6.5 -d
kevin@server1 { ~/npm.out/lib }$ npm install forever -d # (0.7.5)
這樣裝完之後, forever  的 bin 檔沒有正確的建立,請執行以下步驟
kevin@server1 { ~/npm.out/lib }$ cd ../bin
kevin@server1 { ~/npm.out/bin }$ ln -sf ../lib/npm_modules/forever/bin/forever ./
kevin@server1 { ~/npm.out/bin }$ ln -sf ../lib/npm_modules/forever/bin/foreverd ./
安裝 socket.io,需要升級你的 tar 版本(這是什麼怪規定呢!!)
kevin@server1 {~}$ rpm -e --no-deps tar
kevin@server1 {~}$ wget ftp://ftp.gnu.org/gnu/tar/tar-1.26.tar.gz
kevin@server1 {~}$ tar zxvf tar-1.26.tar.gz
kevin@server1 {~}$ cd tar-1.26
kevin@server1 {~/tar-1.26}$ export FORCE_UNSAFE_CONFIGURE=1
kevin@server1 {~/tar-1.26}$ ./configure
kevin@server1 {~/tar-1.26}$ make
kevin@server1 {~/tar-1.26}$ make install
kevin@server1 {~/}$ cd npm.out/lib
kevin@server1 {~/npm.out/lib}$ npm install  socket.io@0.8.5 -d

└─┬ socket.io@0.8.5
  ├── policyfile@0.0.4
  ├── redis@0.6.6
  └─┬ socket.io-client@0.8.5
    ├── uglify-js@1.0.6
    ├── websocket-client@1.0.0
    └── xmlhttprequest@1.2.2
安裝 npm mysql, daemon modules
kevin@server1 {~/npm.out/lib}$ npm install mysql
kevin@server1 {~/npm.out/lib}$ npm install daemon
以上動作皆發生在 server1 上,接下到要 deploy server2 上,並執行
kevin@server1 {~} $ tar cvfz node.out.tgz node.out
kevin@server1 {~} $ tar cvfx npm.out.tgz npm.out
kevin@server1 {~} $ scp node.out.tgz server2:
kevin@server1 {~} $ scp npm.out.tgz server2:
接著來到 server2,並將 node 及 npm 安裝到 /usr/local
kevin@server2 {~} $ tar xvfz node.out.tgz
kevin@server1 {~} $ tar xvfz npm.out.tgz
kevin@server1 {~} $ cd node.out
kevin@server1 {~/node.out } $ sudo cp -r * /usr/local
kevin@server1 {~/node.out } $ cd ~npm.out
kevin@server1 {~/npm.out } $ sudo cp -r * /usr/local
這樣整個安裝算是完成了,接著執行 node.js (假設 node.js 放在 /var/www/node/node.js),我們會使用 apache 這個 user 來執行 node.js 以確保安全。
kevin@server1 {~} $ sudo -u apache -H PATH=/usr/local/bin NODE_PATH=/usr/local/bin/node:/usr/local/lib/node_modules forever start /var/www/node/node.js

info:   Forever processes running
data:       uid  command script                                      forever pid   logfile                    uptime       
data:   [0] 1YH_ node    /home/m/share/htdocs/miiicasa/comet/node.js 21088   26038 /var/www/.forever/1YH_.log 0:0:38:6.956 
kevin@server1 {~} $ sudo -u apache -H PATH=/usr/local/bin NODE_PATH=/usr/local/bin/node:/usr/local/lib/node_modules forever list

info:   Forever processes running
data:       uid  command script                                      forever pid   logfile                    uptime       
data:   [0] 1YH_ node    /home/m/share/htdocs/miiicasa/comet/node.js 21088   26038 /var/www/.forever/1YH_.log 0:0:38:6.956 
這邊最主要的問題,就是 forever 執行者(apache)的環境問題,通常我們用自己的 id (kevin) 在執行時,都會預先設定 PATH, NODE_PATH 的環境變數在我們的 .profile or .bashrc 上,不過用 sudo 執行時,這些變數,有時候沒有設定,有時候是錯的,所以我們在 sudo 的參數上做一些設定,說明如下:
  • -H : 使用 sudo 後 user 的 home directory, eg: apache 的使用者 HOME=/var/www, 而 forever 執行時,會根據 HOME 的值,在底下建立 $HOME/.forever 的目錄,來存放執行時期的設定
  • PATH=/usr/local/bin : 指定執行檔的搜尋路徑,主要是 forever, 及 env
  • NODE_PATH=/usr/local/bin/node:/usr/local/lib/node_modules : 指定 forever 要到那裡找 npm 的 modules ,由於我們只把 npm_modules 安裝到 /usr/local/lib 下,所以需要這個設定
這樣就大功告成了。

按"X"......搞了很多次,才終於瞭解