Atl ActiveX網頁控件的數字簽名和安全驗證

項目需求中,有需求:從Javascript中生成ActivexObject對象,然後調用其方法和響應其事件。例如:

<script language="JavaScript" type="text/javascript">
<!--
        var assistantCtrl = new ActiveXObject("myActivexCtrl.progId");       
        assistantCtrl.sayHello("hello");
// -->
</script>

 但是new ActiveXObject("myActivexCtrl.progId"); 總是失敗。分析原因爲:IE7對未加數字簽名的 ActiveX dll文件採用的安全策略,不允許生成對象和調用。經過對IE7的安全策略的修改,調爲最安全級別最低,則正常。或者在中級安全時,設置可以下載和運行爲簽名的ActiveX控件也可以。

 我的開發環境爲:開發主機Windows XP, VS2008 做的ATL Com ActiveX控件(已經註冊成功並且從其他VC項目中能調用),  IE7.

 

嘗試一1:在我的控件安裝.exe中,將該網站設置爲授信網站,只需要修改註冊表即可。結果失敗。

 

嘗試—2:數字簽名

於是,從網上找到免費簽名工具signcode.exe,製作cer整出,pvk私鑰,和spc文件,支持在設置時間戳url的地方沒有勾選,最後給dll簽名成功。但是IE7的加載應用的列表裏,我的控件發佈者還是 (未驗證)控件名 的樣子。數字簽名只把控件名顯示出來了,以前是未知名稱。於是測試,還是失敗。網上有人分析,是因爲時間戳url沒有指定,或者指定的url和你的證書不匹配。網上有人提供免費的時間戳url,但是也要用他們的證書來簽名纔可以用。

 

嘗試—3:

於是另闢蹊徑,查看MSDN,看到我們的ATL 或者 MFC的ActiveX控件,只要實現了IObjectSafety接口就可以不用數字簽名。於是給我的Atl Com類加上:

 

頭文件中讓你的類繼承:

public IObjectSafetyImpl<CYourComClass,INTERFACESAFE_FOR_UNTRUSTED_CALLER|INTERFACESAFE_FOR_UNTRUSTED_DATA>,

然後在下面的EGIN_COM_MAP加上對IObjectSafety的包含,如下:

EGIN_COM_MAP(CYourComClass)
    COM_INTERFACE_ENTRY(IYourComClass)
    COM_INTERFACE_ENTRY(IDispatch)
    COM_INTERFACE_ENTRY(IObjectSafety)
    COM_INTERFACE_ENTRY(ISupportErrorInfo)
    COM_INTERFACE_ENTRY(IConnectionPointContainer)
END_COM_MAP()

 

經過測試,就算沒有數字簽名和設置授信網站,IE7會提示用戶是否使用該ActiveX控件,顯示的爲未知發行商。至此,該ActiveX控件已經通過了IE的安全攔截,如果想修改發行商名稱,使用方法2中的數字簽名工具給dll簽名即可,但是你的公司名稱前,還有未驗證的字樣。

 

其他深入的問題還沒有經過研究。有朋友發現可以告訴我。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章