星期二, 1月 28, 2014

抽換 IIS Express SSL 憑證

這件事在一般的網站伺服器都不難(可參考這篇),但誰叫 IIS Express 沒有管理介面這麼陽春呢? 先來談一下在 IIS Express 如何測試 https?其實還真簡單,只要到專案的屬性頁去找「SSL Enabled」設定就可以了,但為什麼不必(也不能)指定憑證與金鑰對呢?其實是在 Visual Studio 2013 Express for Web 安裝過程中,就已建立了一個本機用的伺服器憑證。 為了讓外界訪問非以 localhost 為名的網站(可參考這篇),並且通過 SSL 加密,必須準備另一個憑證來抽換,以下是簡略的步驟:
  1. 雖然是在 Windows 8.1 64 bits + Visual Studio 2013 Express for Web 測試,但必須事先額外安裝的是 Windows 8 SDK(現在好像還是沒看到 Windows 8.1 SDK?),而且使用 x86 目錄(微軟官網自承用 x64 會有問題)下的工具產生一個自簽憑證,命令如下:MakeCert.exe -r -pe -n "CN=yourhostname" -eku 1.3.6.1.5.5.7.3.1 -ss my -sr LocalMachine -sky exchange
  2. 用 MMC 將上述憑證由「個人」區匯出到 pfx 檔案,記得要匯出私鑰與延伸屬性,再匯入到「信任的根憑證」區。注意:一不能用拖拉,二不能刪了舊的。
  3. 準備上述憑證的姆指紋,去除分隔用的空白。
  4. 用以下指令清除舊的安全通道與憑證繫結:netsh http delete sslcert ipport=0.0.0.0:443
  5. 用以下指令建立新的安全通道與憑證繫結:netsh http add sslcert ipport=0.0.0.0:443 appid={214124cd-d05b-4309-9af9-9caa44b2b74a} certhash=thumbprint

關於使用微軟工具處理憑證

此人真是先進! http://blogs.microsoft.co.il/applisec/2008/04/08/creating-x509-certificates-using-makecertexe/

星期一, 1月 27, 2014

解放 IIS Express 的快速做法

IIS Express 通常有兩個限制:
  • 只能藉由 localhost,不能透過真實的主機名稱訪問。
  • 埠號小於 1024 時,必須以系統管理權限啟動。
如果真的深究下去,讀者們可能會發現以上這些敘述不是那麼精準(或直接相關)的,我先承認!不過本篇的重點在如何突破這些限制,做法也很簡單(二選一):
  • 請參考 http://www.hanselman.com/blog/WorkingWithSSLAtDevelopmentTimeIsEasierWithIISExpress.aspx 的附錄 Z,以系統管理權限在命令列執行「C:\Program Files (x86)\IIS Express>IisExpressAdminCmd.exe  setupFriendlyHostnameUrl -url:http://myHostName:80/」。
  • 在 applicationHost.config 新增相關的 binding。
以上這些方式還是有個小小限制,不能將主機名稱設得像 www.abc.com 這種形式,如果一定要,還是請自行修改 hosts 吧!

[2018/08/27] 為了找到正確的 applicationHost.config,還得花一番工夫,所以再補充一下:
  • system tray > Show All Applications > Config
  • change bindingInformation from *:80:localhost to *:80:

星期二, 1月 21, 2014

使用 Eclipse 瀏覽藉由 Maven 管理的專案原始碼

安裝設定需求
  • JDK 最新版,不需設定環境變數等內容
  • Eclipse for Java EE 最新版,會自動搜尋電腦上已安裝的 Java
  • 不需額外安裝 Maven 或插件,使用內建版本即可
做法
  • 隨意新增一個 Maven 專案,groupId 與 artifactId 可以任意填寫,template 選預設的 quickstart 即可。
  • 編輯 pom.xml,新增一個 dependency,groupId、artifactId、version 要填人家正式公佈的,例如 org.jasig.cas / cas-server-webapp / 3.5.2。存檔。
  • 需有網路連線。
  • 在專案上右鍵所出現的選單有 Maven -> Download Sources。
  • 在 Maven Dependencies 展開可見相依的 Jar 檔,進一步展開即可見原始碼。

星期二, 12月 24, 2013

CAS Client for .NET renew="true"

過去不算短的一段時間,一直都是在本機 IIS Express 開兩個埠模擬兩個不同的網站,它們都裝上 CAS Client for .NET 來測試單一簽入,好像沒問題?今天深究為何 renew 的值不論怎麼設的效果都一樣之下,才大吃一驚:由於兩個網站都在 localhost,所以根本就共享 Cookie!

為了要確認此參數有效,整個測試環境大修:
  1. CAS Server 必須安裝憑證。
  2. 瀏覽器所在電腦必須信任該憑證,各網站以 https 連入 CAS Server。
  3. 即使兩個網站都在本機,也要設 C:\Windows\system32\drivers\etc\hosts 給它們不同的主機名稱,例如 www.ap1.com 與 www.ap2.com。
  4. 登入後,利用瀏覽器不同的頁籤訪問 renew="false" 的網站,可正常使用;但若設定 renew="true" 的網站,則必須重新登入。

星期一, 12月 09, 2013

如何確認 PreparedStatement 有在 Oracle 被執行到?

假設程式如下:

String s = "Select COUNT(*) From TABLE1 Where ID = ?";
PreparedStatement p = connection.prepareStatement(s);
Object o = (Object)"id";
p.setObject(1, o);
ResultSet r = p.executeQuery();

可以藉由 Oracle SQL Developer 執行以下的查詢(在程式執行前後各一次):

Select FETCHES From V$SQL Where SQL_TEXT = 'Select COUNT(*) From TABLE1 Where ID = :1';

如果控制在很短的時間內,第二次的結果比前次多一,則幾乎可以確定這個敘述有被執行到。其中 V$SQL 或是 V$SQLAREA 是一個內建的統計用 View,FETCHES 是這個 View 的一個欄位,SQL_TEXT 是 SQL Statement,「:1」表示查詢語句的第一個變數。