第四种方案:用脚本实现,编写一个脚本,让用户下载,下载后双击就获取MAC,然后通过XMLHTTP方式传给服务器,有可能,但后面一种方法实现后就没去试这个方案了
第五种方案:自己建立一个安全的ActiveX控件,这是终极方案
先参考以下两个文章:
http://support.microsoft.com/kb/182598/zh-cn
http://www.cnblogs.com/babyt/archive/2005/03/14/118264.html
在VB中建立ActiveX控件,然后实现IObjectSafety接口,生成OCX后,再用signcode.exe对其进行数字签名,签名用的文件又来自http://www.ca365.com/。最后放在网页上,让用户自动下载安装。
测试成功后,开始试验:
1、不实现IObjectSafety接口会如何?
在本机上都是小红叉,其它电脑就不试了
2、最小化实现IObjectSafety接口
要引用VB IObjectSafety Interface(文件objsafe.tlb)
Implements IObjectSafety
Private Sub IObjectSafety_GetInterfaceSafetyOptions( _
ByVal riid As Long, pdwSupportedOptions As Long, pdwEnabledOptions As Long)
End Sub
Private Sub IObjectSafety_SetInterfaceSafetyOptions( _
ByVal riid As Long, ByVal dwOptionsSetMask As Long, ByVal dwEnabledOptions As Long)
End Sub
而模块文件中的常量、API、Main子程序都可以不要
3、要不要经过打包这一步骤
不要了,因为我的控件没用到什么特别的DLL,在网页中直接这样写
<object classid="CLSID:...." CODEBASE="IobjSafety.ocx#version=1,0,0,6">
而不像打包文件写的那样:
<object classid="CLSID:...." CODEBASE="IobjSafety.CAB#version=1,0,0,6">
4、要用MKTYPLIB.EXE吗?
不用也一样正常
不过后来才知道,之前我们有的是objsafe.odl文本文件,经过
MKTYPLIB objsafe.odl / tlb objsafe.tlb
才得到tlb文件,这个tlb文件可以用于任何制作安全接口的控件。所以现在不用也正常。
5、要用LPK_TOOL.EXE吗?
不用。可能控件工程属性中标为“要求许可证关键字”时才用。
6、生成控件的CLSID如何找
一种方法,运行注册表,在HKEY_CLASSES_ROOT中找到“控件名.UserControl1”,其下的CLSID即是。
还有一种方法,在VB下启动自己的控件,会出来一个网页,然后再看其中的源代码,就可以找到控件的CLSID
如果建立VB的EXE,把控件拉出来,VBP文件中体现的不是CLSID,而是TypeLib。
7、不进行数字签名如何?
那就是经典的“Windows 已经阻止此软件因为无法验证发行者。”
现在我知道了IE的安全设置是有两个问题:
一是“对没有标记为安全的 ActiveX 控件进行初始化和脚本运行”的禁用,例如:Wscript.Shell、Scripting.FileSystemObject、76A64158-CB41-11D1-8B02-00600806D9B6、75718C9A-F029-11d1-A1AC-00C04FB6C223这些都是不引入安全接口的程序。我们普通的控件也就是吃这个亏。
二是对“下载未签名的 ActiveX 控件”的禁用。这就是我的控件即使按着安全接口在走,也被IE阻止的原因。
8、如何数字签名
用signcode.exe对ocx文件进行处理,其中要用到证书,所以要先去http://www.ca365.com/申请一个来,安装好根证书,再安装好个人证书,按着“阿泰”教的对ocx进行处理,再用chktrust.exe来验证。并且看一下ocx的右键,属性中是否多了一个“数字签名”。
9、申请证书
可以向http://www.ca365.com/申请证书,至于要什么类型的证书,只要前后都一贯性就行,没有什么大问题。我申请测试的证书Test,这样根证书也要下载Test的,将来自动注册的代码也要用Test的。
10、证书能一直用吗?
可以,我就申请一个,用在好几个控件上。
11、本机不安装根证书行吗
不行,那样,你申请的个人证书安装不了。个人证书安装不了,signcode.exe就不能继续。
控件安全接口也实现了,数字签名也签了,发布到网络上,就没问题了。
No! No! No!
客户端还要安装根证书
否则,IE还是一样弹出“经典”的对话框,不过其中的发行者变成链接,可以点击进去看,结果就是根证书不是受信任的
客户端安装根证书,一种方法是把rootTest.cer在各个客户端上安装,如果能这样,还不如把我的控件在客户端一个个地安装。另一种是http://www.ca365.com/提供的自动安装根证书的代码,我是用第二种,因为第一种在我试的一两台电脑上不行。另外我把它转为javascript的代码:
<OBJECT classid=clsid:127698e4-e730-4e5c-a2b1-21490a70c8a1 codebase="xenrlinf.cab#Version=5,131,3659,0" id=XEnroll name=XEnroll VIEWASTEXT></OBJECT><OBJECT id="oCAPICOM" codeBase="capicom.cab#version=2,0,0,3" classid="clsid:A996E48C-D3DC-4244-89F7-AFA33EC60679" VIEWASTEXT></OBJECT>
<script language="javascript" type="text/javascript">
installTestRoot();
function installTestRoot()
{
var sPKCS7 = "";
var n;
sPKCS7 = "-----BEGIN CERTIFICATE-----\r\n" +
"MIIDszCCApugAwIBAgIIPn9KwWPUprMwDQYJKoZIhvcNAQEFBQAwZzELMAkGA1UE\r\n" +
"BhMCQ04xEDAOBgNVBAgTB0JlaWppbmcxEDAOBgNVBAcTB0JlaWppbmcxDjAMBgNV\r\n" +
"BAoTBUNBMzY1MSQwIgYDVQQDExtDQTM2NSBUZXN0IFJvb3QgQ2VydGlmaWNhdGUw\r\n" +
"HhcNMDEwNTEyMDg0MDIwWhcNMzEwNTA1MDg0MDIwWjBnMQswCQYDVQQGEwJDTjEQ\r\n" +
"MA4GA1UECBMHQmVpamluZzEQMA4GA1UEBxMHQmVpamluZzEOMAwGA1UEChMFQ0Ez\r\n" +
"NjUxJDAiBgNVBAMTG0NBMzY1IFRlc3QgUm9vdCBDZXJ0aWZpY2F0ZTCCASIwDQYJ\r\n" +
"KoZIhvcNAQEBBQADggEPADCCAQoCggEBAL7TIQ00d7mYx9CNOvGJDCTm+yFK5rM3\r\n" +
"tH3Om5e9eQtt290t3TJoMEm78SNi7rVl/tgPtR3IEznL8C9NREeyG48Mlh3RLkCH\r\n" +
"9YVvwqoz5dPU8OSiV4KMwuaAk0NxEWal3jtDN2yNZiNrqjXeYWdkIvYE8jEYSXVD\r\n" +
"GB748oBMhrXR8mN5QyYPJ/yuXTK4vkrgOdn+DA46NECpFNpj97AgdmsjU1oEx/WF\r\n" +
"xSDrwQv5JwpVkNO4hlUqvU2HkSwJiYibWTHiuq/WX2KZRiGBbQsMUlBKT/SGTz0x\r\n" +
"kTBciXzkTN4kd0nHcYcbhRyNCj3S9tLjZuU4KmO8aYq+3uw7MzuIqaUCAwEAAaNj\r\n" +
"MGEwHQYDVR0OBBYEFOFerZs5arMIYGXkIn7sz8xPsdHLMA4GA1UdDwEB/wQEAwIB\r\n" +
"BjAfBgNVHREEGDAWhhRodHRwOi8vd3d3LmNhMzY1LmNvbTAPBgNVHRMBAf8EBTAD\r\n" +
"AQH/MA0GCSqGSIb3DQEBBQUAA4IBAQB5tTmySgq4J50bWoz+F7pZL75U0X4IPmQ+\r\n" +
"wXaUr8M7PthCMMIv/CN9mLbWK8fEXO8cEMkpusgSbSZybJpNggeLuyu+9iZcJnsZ\r\n" +
"TOXs7JnG0D91N0m/y/8Q794XsG64X2MRKBAMEyv/l0oR2fYym9iOkCJtv5rkMYWG\r\n" +
"jYplLrJWsEooFOrn4CzWkJ3lYuuc+WdlXEsPfLedPB5xAl1PU8FSjxvwEczOdWWK\r\n" +
"99YMbVaQDMPSeVLKwxWeLtcZ10leyCotGpPaLLwcUEWiTyVt0mPZ+NQEqpm3nApp\r\n" +
"BeRFkRLtHm1+BF8piiZ/89ToczDZBx87TM2KqqUolQ4usKzB+P/r\r\n" +
"-----END CERTIFICATE-----\r\n";
if (haveInstalled("3964 D899 A04C 9EC7 BCF9 BB4E 6E60 226D CD6E 5BA0") == 0)
{
n = XEnroll.InstallPKCS7Ex(sPKCS7);
if (n == 0)
alert("没有安装测试根证书,请手动下载根证书,并安装!");
}
}
function haveInstalled(str)
{
var storeName;
var thumbprint;
var thumbprint0;
var i;
thumbprint0 = str;
thumbprint0 = thumbprint0.replace(/ /g, "").toUpperCase();
st = new ActiveXObject("CAPICOM.Store");
//get store name
storeName = "root";
//open store
st.Open(2, storeName, 0); //这里每次都会提示一段英文,所以这种代码不能放在网页上直接执行,需要时用户再点某个链接过来
for (i=1; i<st.Certificates.count; i++)
{
thumbprint = st.Certificates(i).thumbprint.replace(/ /g, "").toUpperCase();
if (thumbprint == thumbprint0)
{
return 1;
}
}
return 0;
}
</script>
就这样,我的控件在IE默认的安全设置下总算可以发布出去了。
其它一些知识点:如何删除证书,如何在客户端禁用/更新我的控件(在IE属性的“程序”页签的“管理加载项”,也可以通过“工具”菜单中进入),如何删除我的控件(在C:\WINDOWS\Downloaded Program Files,使用regsvr32 /u 控件名.ocx,再del)