Friday, December 16, 2005

將ActiveX元件做數位簽章之經過

最近幾天為了一個ActiveX的元件傷透了腦筋,倒不是做不出來,而是做出來後無法在一台NT 4.0與IE 5.5的機器上運作。於是種種的猜測油然而生…
1. 首先在我的電腦開啟該網頁時,會出現”目前的安全性設定會禁止在目前的畫面執行ActiveX控制項”的錯誤訊息,為了讓測試順利進行,因此先將IE的安全性設定中”下載未簽名的ActiveX控制項”的設定由”關閉”調整為”提示”。果然在我的電腦上就可以正常的開啟網頁。
2. 為了要測試相容性,於是就找了一台NT 4.0與IE 5.5的機器進行測試,不知什麼原因,網頁沒有出現訊息,但是ActiveX控制項就是無法在網頁上顯示,因此懷疑是否IE不同版本對ActiveX控制項是否簽章的接受度不同,因此開始想要做一個有簽章的ActiveX控制項。
3. 雖然在SDK中有提供製作測試的憑證(Certificate),但是我還是覺得要使用微軟的Certificate Service來做會較實在。
4. 安裝過程還算順利,接著就要產生憑證了。一般是透過該機器的網頁 http://localhost/certsrv/ 來進行憑證的要求(Certificate Request)。”要求憑證-進階要求-使用這個表單將憑證要求提交給憑證授權單位-用途-程式碼簽署憑證-金鑰標示成可匯出-將金鑰匯出到檔案(附檔名為.pvk)。”
5. 憑證要求成功後,可於”系統管理工具-憑證授權單位-擱置要求”中將該憑證”發行”。若成功,可於”發出的憑證”中看到該憑證。
6. 透過該機器的網頁 http://localhost/certsrv/ 來進行憑證的下載。”檢查擱置中的憑證-選取一個憑證- 下載CA憑證-儲存檔案(附檔名為.cer)”。另一種取得憑證的方法是於”系統管理工具-憑證授權單位-發出的憑證”選取一憑證,用滑鼠右鍵選擇”開啟”,於”詳細資料”項中選擇”複製到檔案”。
7. 接著使用cert2spc.exe產生軟體出版商憑證(Software Publisher Certificate)。
cert2spc mycert.cer mycert.spc
其中 mycert.cer於步驟6產生。
8. 接著使用signcode.exe將.cab檔進行簽章。
signcode –spc mycert.spc –v mycert.pvk myviewer.cab
其中 mycert.cer於步驟6產生,mycert.pvk於步驟4產生,myviewer.cab為VB使用Package & Deployment Wizard所產生的.cab檔。
9. 接著使用chktrust.exe測試簽章結果是否正確。
chktrust myviewer.cab
其中 mycert.cer於步驟8產生。
10. 經過簽章的.cab檔,果然可以在不更改IE安全性設定的情形下運作。但是在NT 4.0的機器上還是有問題。
11. 後來想說試試看安控系統會不會也有問題,結果沒有問題,所以就檢查兩個.cab檔看看是否有不一樣的地方,果然在.cab中的.inf檔有不一樣的地方。在我的.inf檔中有幾個元件的file-win32-x86是指向Microsoft網站。這幾個元件(msstkprp.dll與VB6 Runtime and OLE Automation)在安控系統的.inf中則不存在。後來發現是在執行Package & Deployment Wizard時,其中在”Included Files”步驟中可以選擇是否要 include這些檔案,另外在下個步驟”File Source”中則可以選擇是”Include in this cab”還是 ”Download from Microsoft Web site”。若是Include in this cab,則會由C:\Program Files\Microsoft Visual Studio\VB98\Wizards\PDWizard\Redist目錄中取得所需的檔案。
12. 後來想可能是因為該機器無法連到外部網站的原因,因此重新做一個.cab並選擇不將msstkprp.dll與VB6 Runtime and OLE Automation包含至 .cab中,然後再對該.cab檔簽章,果然NT 4.0 與 IE 5.5也可以顯示網頁了。
13. 為了能讓不同版本的IE可以使用,因此將元件中原來呼叫 Microsoft Internet Controls的Navigate2方法改成Navigate。
後記:
這裡所使用到的工具,可於Windows SDK(C:\Program Files\Microsoft SDK\Bin),或者是Visual Studio. NET 2003(C:\Program Files\Microsoft Visual Studio .NET 2003\SDK\v1.1\Bin)),或者是Visual Studio. NET 2005(C:\Program Files\Microsoft Visual Studio 8\SDK\v2.0\Bin)中取得,但是在Visual Studio. NET 2005中似乎找不到ChkTrust.exe。

Thursday, December 15, 2005

將ActiveX元件做數位簽章

http://www.cnblogs.com/babyt/archive/2005/03/14/118264.html
http://www.cnblogs.com/babyt/archive/2005/03/14/118302.html
http://www.cnblogs.com/babyt/archive/2005/03/14/118309.html

Tuesday, December 13, 2005

由 java 呼叫 asp 網頁並上傳資料

製作了一個範例,感謝 wasjkf的範例。

java 的部分(myhttpclient.java):

import java.net.*;
import java.io.*;
class myhttpclient
{
public static void main(String args[])
{
String stime = "";
String sd = "";
String st = "";
String rtime = "";
String strSendMsg="";
try{
StringBuffer sbRecvMsg= new StringBuffer();
java.net.URL url = new java.net.URL("http://dmbond01/httptest.asp");
java.net.HttpURLConnection conn = (java.net.HttpURLConnection)(url.openConnection());
conn.setRequestMethod("POST");
conn.setDoOutput(true);
OutputStreamWriter wr = new OutputStreamWriter(conn.getOutputStream());
java.text.DateFormat my = new java.text.SimpleDateFormat("yyyy-MM-dd kk:mm:ss.SSS");
java.text.DateFormat d1 = new java.text.SimpleDateFormat("yyyyMMdd");
java.text.DateFormat t1 = new java.text.SimpleDateFormat("kkmmss");
stime = my.format(new java.util.Date());
sd = d1.format(new java.util.Date());
st = t1.format(new java.util.Date());
strSendMsg = "SendString=" + "01" + "P" + sd + st ;
wr.write(strSendMsg);
wr.flush();
wr.close();
BufferedReader rd = new BufferedReader(new InputStreamReader(conn.getInputStream()));
String strTempRecvMsg;
while (((strTempRecvMsg = rd.readLine()) != null)) {
sbRecvMsg.append(strTempRecvMsg);
}
rd.close();
strTempRecvMsg = sbRecvMsg.toString();
rtime = my.format(new java.util.Date());
System.out.println(strTempRecvMsg);
}catch(Exception e){
System.out.println("!! doSendMsg error occurred ->");
}
}
}

asp 的部分(httptest.asp):
<%
Response.Write Request.Form("SendString")
%>