2009年5月15日 星期五

[Windows] 安裝 Apache with HTTPS (SSL) 、建立憑證 @ Windows XP

過去曾在 FreeBSD 4.10 的環境上安裝過 HTTPS 環境,細數起來已經是四、五年前的事了。最近一兩年,總在 Windows XP 的環境下,安裝 Apache HTTP Server 和 PHP 環境,用來開發簡單的網頁程式,但一直忘了,自己根本連 HTTPS 都還沒安裝過。前幾天,彷彿操起老本業,開始系統整合的工作,才想起該設定 HTTPS 的部分了,想著想著,一直以為用了 AppServ 就免痛,事實證明,我真的把 HTTPS 忘的一乾二淨了,無論是 AppServ 還是 Appache HTTP Server 皆要自行產生憑證,憑證就是用來提供加密連線的重要資訊,詳情可以多參考 RSA 演算法 啦。


最近開發時已經不用 AppServ ,反璞歸真般地,我開始只安裝需要的環境,即只安裝 Apache HTTP Server(including OpenSSL) + PHP 罷了。這次實作的環境是 Apache 2.2.11 + PHP 5.2.9-2 ,皆在 Windows XP with SP3 ,此篇跟 PHP 沒關係。


當晚處理完憑證試裝的結果,碰到第一個問題是 SSLPassPhraseDialog !搞到最後我才又想起 Skype 這賊賊軟體!它總是愛佔 Port ,第一次它就佔了 80 Port ,害我 HTTPD 跑不起來,這次很快地又想到它啦,但實在太久沒設定 HTTPS,所以不敢確定哪邊有錯,最後,由於很晚了,則是選擇隔天再到實驗室的電腦安裝。該台電腦沒有安裝 Skype ,才真正確定沒什麼大問題,但卻碰到第二個問題:sec_error_bad_signature!原先就知道自己產生的憑證沒有公信力,因此好心的瀏覽器都會提醒,詢問後再允許通過,如 Firefox 新增例外網站等,但這個訊息連新增例外都不行!所幸地,沒多久就在網路上找到答案,至少可以將錯誤訊息修成 sec_error_ca_cert_invalid ,這次就能新增成例外網站啦!


實作過程:



  1. 建立憑證

    • openssl genrsa -des3 -out server.key 2048

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

      openssl x509 -req -days 3650 -in server.csr -signkey server.key -out server.crt

      openssl rsa -in server.key -out server.key

    • 以 Windows XP 為例,預設的 Apache HTTP Server 2.2.11 安裝目錄是 "C:\Program Files\Apache Software Foundation\Apache2.2",以該目錄為基準,簡寫為 "~\Apache2.2"

      • 所謂的 openssl 是在 "~\Apache2.2\bin\openssl.exe"

      • 上述部份指令執行時會說找不到 config 檔案,config 檔是在 "~\Apache2.2\conf\openssl.cnf" ,請多加參數 -config "~\Apache2.2\conf\openssl.cnf"

      • 我習慣切換到 "~\Apache2.2" 去執行上述指令,如 cmd mode 下執行 bin\openssl genrsa -des3 -out server.key 4096 ,碰到要增加 config 則用 -config conf\openssl.cnf 囉



    • 建立 server.key 時記得輸入一下密碼,該密碼後面還會詢問到。

    • 簡單的詢問範例,"()"內不用打,是簡單的敘述註解
      Country Name (2 letter code) [AU]:TW
      State or Province Name (full name) [Some-State]:Taiwan
      Locality Name (eg, city) []:YunLin Country (城市)
      Organization Name (eg, company) [Internet Widgits Pty Ltd]:CYY(組織,例如公司)
      Organizational Unit Name (eg, section) []:CYY (單位,例如公司部門等)
      Common Name (eg, YOUR name) []:localhost (主機的全名)
      Email Address []:cyy@localhost (信箱)

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



  2. 設定 Apache httpd.conf

    • 將上述產生的 server.key 跟 server.crt ,就直接擺到 "~\Apache2.2\conf" 即可(預設的憑證用的檔名跟位置)

    • 設定 httpd.conf

      • 打開 LoadModule ssl_module modules/mod_ssl.so 註解

      • 打開 Include conf/extra/httpd-ssl.conf

      • 基本上重新啟動 Apache 即可搞定囉!






最後,有任何問題請多看看 ~\Apache2.2\logs\error.log 或 ~\Apache2.2\logs\access.log ,這幫助很大的!


 


2009年5月12日 星期二

[PHP] memory usage with fread (limit or leak ?)

花了些時間,想寫一隻 PHP 的 tool 來處理資料轉換的問題,沒想到卻碰到超過 PHP.ini 中的記憶體限制,我用的版本是 PHP 5.2.9-2。接著又花了時間找尋,發現大部分討論的是物件方面的記憶體管控,至於 garbage collection 等的,似乎在 5.3.0 以後的版本才有類似的處理機制。


沒有指標的 PHP ,說真的還寫得很不順手,唯一目前知道的是可以用 unset 釋放記憶體空間!但很多情況並不如預期的,舉例來說,對於 fread 的函數,應該不難得知它是會自行維護 buffer 的,但就是因為這一點,導致使用的記憶體空間增倍:


<?php
$size = 52428800;    // 50MB
$fp = fopen( 'test.dat' , 'rb' );
echo "Init State: ".memory_get_usage() . "\n";

$data = fread( $fp , $size ); // $data 跟 fread 內的 buffer 各吃 50MB 的空間
echo "fread: ".memory_get_usage() . "\n";

unset( $data ) ;
echo "unset variable: ".memory_get_usage() . "\n";

fclose( $fp );
echo "fclose: " .memory_get_usage() . "\n";

?>


上述如註解,除非把 fclose( $fp ) ,以上的程式光運行就吃掉 100MB 的空間了!執行結果:


Init State:108400
fread: 104966184
unset variable: 52537368
fclose: 108560


第一次讓我不想用 PHP 來做事啊。但這似乎不是 memory leak 的問題?我多希望 $data 可以是指標啊。


2009年5月8日 星期五

以PHP-cURL模擬瀏覽器行為

相關文章



  1. [PHP] 客製化部落格同步發文實作筆記 - 模擬瀏覽器行為

  2. 免搬家,部落格同步發文之設計












這週 meeting 時,我報了這。早在一年前的投影片中,已有提過一兩頁來敘述它。這學期多了幾位新成員,老板也稍微提及關於報告的內容方向,希望能夠以帶給大家新資訊或是相關的學習,所以,早在半個月前就順手弄了這個,並且在昨天報完請示一下,便將投影片擺放在網路上。報個這的理由很簡單,第一點是趣味,第二點則是未來可能有其他人會維護或開發相關的應用服務,而我自己的所學很淺薄,回想起來好像只剩這個東西可以跟大家分享吧!過去幾次的報告,我比較愛報 paper ,為的是訓練自己看 paper ,而我又特愛找有數學式子的,報起來對大家的收穫很少。


回歸主題,上面的投影片講述的是如此用 cURL 來模擬瀏覽器的連線,假設可以模擬瀏覽器的行為,那麼就可以寫一些個人化方便的小程式,以此完成一些正當的例行性行為,如發表文章到多個部落格等應用,因此,未來可能會趨向每個人都有一位專門的機器人秘書,幫你關注事件、服務等等,如此一來,就會有寫這類程式的需求。


上述投影片中,比較重要的例子是對於要向一個網頁作出送出表單動作的例子( FORM & POST ),除此之外,應該就沒特別的部分,整體流程就像監控網路封包流向,連到各個網頁進行 cookie 資料的收集,最後送出表單,再收集完成登入的資訊,接著,就可以進行相關的應用,如取得資料等。


最後,這些應用程式主要用在個人端、正當不違法的便利化為主,並不適合跑在 Server 端(容易被對方Server阻擋)。此外,這 Flash 投影片是使用 iSpring 這個免費軟體製作的,若輸出時出現中文字型亂掉的情況,記得換一下字型就行囉!


2009年5月6日 星期三

窗外月

只要時間跨過了凌晨一點,抬頭一望就能看到一彎月兒,這是五月初才開始發現的。有時發個呆望著,總在想,到底在追求什麼,有時目標彷彿再跨一步就到了,但往往在那一步尚未踏穩時,又陷入迷惘?









聽聽老歌,一首 LUNA SEA - I for You ,彷彿將我帶回日劇”神啊,請給我多一點時間”。然而,我卻想不起來那齣日劇的劇情。因為,我從來都沒仔細看過,只知道裡頭有當年最紅的深田恭子和金城武。有時人生不也這樣,追逐著好像知道的目標,結果到頭來有幸得到後,卻發現自己根本沒享受過?只是當別人談論起時,彷彿又有莫名的感同深受?話說回來,看著這演唱會,才覺得主唱還真會唱,看他的表演真的很苦。


論文的進度我一直都很 ok ,並不是說已達到想要目標,過去付出的想拿來寫論文都沒什麼問題,只是,有一種一寫論文就莫名的罪惡感,好像要把還沒完善的程式丟給別人善後?回想起來,碩班好像又沒得到我真正想取得的東西?或許那東西本來就不存在吧!


儘管如此,這就是生活吧?還是播放著數首經典的日劇主題曲,每一首還是很容易敲動我心,那些劇情我都已忘得差不多了,但一聽到還是有種活力精神感,這該不會就像喝酒?好像醉,又似清醒乎?


或許這一切的心境,來自於生活些微的變動吧?心情?工作?生活?或許又是週期性的心情吧。


2009年5月2日 星期六

[Excel] 取得指定分頁的欄位資料( get a cell value )

很久沒用 Excel 了,我習慣在一個 Excel 檔開多個分頁(sheet),過去曾寫過簡單的 VB 程式去分析資料,這次我只是單純地想在分頁 B 取得分頁 A 的資料,逛了很久都只看到 VB 的用法,最後自己亂用才發現原來非常簡單。


環境敘述:Excel 檔案,內有 A,B,C 三個分頁(sheet),其中 A,B,C 各是他們的 sheet 名字,預設大概都是 sheet1, sheet2,sheet3,etc


解決方式:假設我想在 C 分頁的 C1 欄顯示 A 分頁 A1 欄位的數值,就只要在 C 分頁的 C1 欄位上,按一下,再切換到 A 分頁再點 A1 就搞定了!


公式化:在某欄位的數值設定為 "=分頁名字!欄位" ,例如:"=A!A1" ,即可取得 A 分頁裡的 A1 數值。


在 VB 上大概是用 Sheet 跟 Cell 這兩個函數囉