dim majorver dim ua dim ie3 dim ie4 dim aol dim minorver4 dim update dim winplat dim nav dim win32 dim intButton dim upgrade dim keyName dim keyType upgrade = 0 set nav = navigator ua = nav.useragent minorver4 = "" if len(ua) >=1 then 'nav object is supported winplat = mid(ua,instr(ua,"Windows") + 8, 2) win32 = mid(ua,instr(ua,"Win") + 3, 2) 'In some user agent strings the platform is referred to as Win32 majorver = mid(ua,instr(ua,"MSIE") + 5, 1) ie3 = majorver = 3 and (winplat = "NT" or winplat = "95" or win32 ="32") ie4 = majorver = 4 and (winplat = "NT" or winplat = "95" or win32 ="32") update = instr(ua,"Update a") aol = instr(ua,"AOL") if ie4 then minorver4 = mid(ua,instr(ua,"MSIE") + 7, 3) If (ie3 or minorver4 = "0b1") and update = 0 and aol = 0 then upgrade = 1 end if else upgrade = 1 end if if upgrade = 1 then intButton = msgbox ("To use this enrollment form, you must have Microsoft Internet Explorer version 4.0 or version 3.02 with Authenticode 2.0, Do you want to upgrade now?", 4 + 64, "Update My Browser Now!" ) if intButton = 6 then location.href = "http://www.microsoft.com/ie/download" else location.href = "../error/invalidBrowser.html" end if end if ' -------------------------------------------------- ' 查找CSP提供者,查找的结果填充到theSelectCtrl对象 ' ' theSelectCtrl: Html SELECT Element ' 返回值: 无 theSelectCtrl ' -------------------------------------------------- Sub FindProviders(theForm) If isRunningOnVista Then FindProvidersOnVista(theForm) Else FindProvidersOnNonVista(theForm) End If End Sub ' -------------------------------------------------- ' 查找CSP提供者,查找的结果填充到theSelectCtrl对象 ' 说明: Non Vista系统调用方法 ' theSelectCtrl: Html SELECT Element ' 返回值: 无 ' -------------------------------------------------- Sub FindProvidersOnNonVista(theForm) Dim i, j, count Dim providers() i = 0 j = 1 count=0 Dim el Dim temp Dim first On Error Resume Next first = 0 FixAcceptButton() Do While True temp = "" cenroll.providerType = j temp = cenroll.enumProviders(i,0) If Len(Temp) = 0 Then If j < 1 Then 'Look for RSA_FULL only. j = j + 1 i = 0 Else Exit Do End If Else set el = document.createElement("OPTION") el.text = temp el.value = j theForm.IeTokenList.add(el) count = count + 1 If el.text = "Microsoft Enhanced Cryptographic Provider v1.0" Then theForm.IeTokenList.selectedIndex = count End If If first = 0 Then first = 1 theForm.IeTokenList.selectedIndex = 0 End If i = i + 1 End If Loop End Sub ' -------------------------------------------------- ' 查找CSP提供者,查找的结果填充到theSelectCtrl对象 ' 说明: Vista系统调用方法 ' theSelectCtrl: Html SELECT Element ' 返回值: 无 ' -------------------------------------------------- Sub FindProvidersOnVista(theForm) Dim cspInfos Dim cspCount On Error Resume Next Set cspInfos = CreateObject("X509Enrollment.CCspInformations") If ( err.number <> 0 ) then MsgBox Err.Number & " " & Err.Description Exit Sub End If On Error Resume Next cspInfos.AddAvailableCsps() If ( err.number <> 0 ) then MsgBox Err.Number & " " & Err.Description Exit Sub End If cspCount = cspInfos.Count Dim i ,j Dim el Dim first Dim temp i = 1 j = 1 first = 0 Do While True If i = cspCount Then Exit Do End If set cspInfo = cspInfos.ItemByIndex(i) If Len( cspInfo.Name) = 0 Then If j < 1 Then j = j + 1 i = 0 Else Exit Sub End If Else set el = document.createElement("OPTION") el.text = cspInfo.Name el.value = j theForm.IeTokenList.add(el) If first = 0 Then first = 1 enrlform.selectedIndex = 0 End If End If i = i + 1 Loop End Sub Function CreateP10( keyName, keyType,keyflags ,DNItem) CreateP10 = GenPKCS10RequestByEnroll(keyName, keyType, 1, DNItem) End Function Sub DoKeyGen(theForm) dim options dim cn dim lengthofkey dim keyflags index = options.selectedIndex keyName = options(index).text keyType = options(index).value if IsIE4() Then On Error Resume Next set options = theForm.IeTokenList.options cenroll.providerName = options(index).text cenroll.providerType = options(index).value else On Error resume next cenroll.providerType = 1 cenroll.providerName = "Microsoft Base Cryptographic Provider v1.0" end if cenroll.HashAlgorithm = "MD5" cenroll.KeySpec = 1 'if theForm.userprotect.checked = true then ' keyflags = 2 'else keyflags = 0 'end if theForm.pkcs10Request.value = CreateP10(keyflags) GenPKCS10Req1 ( theForm.pkcs10Request.value) End Sub ' ---------------------------------------------------------------------------- ' 根据指定的CSP Provider名称、类型及密钥生成标识,生成PEM编码PKCS#10证书请求 ' ' cspName: CSP Provider名称,该值为FindProviders填充的SELECT.options.text ' cspType: CSP Provider类型,该值为FindProviders填充的SELECT.options.type ' keyFlags: 密钥生成标识。 ' 1 生成的密钥可以导出 ' 2 生成的密钥不可以导出 ' 返回值: "" 生成失败 ' PEM编码的PKCS#10格式请求 生成成功 ' ---------------------------------------------------------------------------- Function GenPKCS10RequestByEnroll(cspName, cspType, keyFlags, DNItem) If isRunningOnVista Then GenPKCS10RequestByEnroll= GenPKCS10RequestByEnrollOnVista(cspName, cspType, keyFlags, DNItem) Else GenPKCS10RequestByEnroll= GenPKCS10RequestByEnrollOnNonVista(cspName, cspType, keyFlags, DNItem) End If End Function ' ---------------------------------------------------------------------------- ' 根据指定的CSP Provider名称、类型及密钥生成标识,生成PEM编码PKCS#10证书请求 ' 非Vista系统调用 ' cspName: CSP Provider名称,该值为FindProviders填充的SELECT.options.text ' cspType: CSP Provider类型,该值为FindProviders填充的SELECT.options.type ' keyFlags: 密钥生成标识。 ' 1 生成的密钥可以导出 ' 2 生成的密钥不可以导出 ' 返回值: "" 生成失败 ' PEM编码的PKCS#10格式请求 生成成功 ' ---------------------------------------------------------------------------- Function GenPKCS10RequestByEnrollOnNonVista(cspName, cspType, keyFlags , DNItem) Dim pkcs10req On Error Resume Next cenroll.providerName = cspName cenroll.providerType = cspType cenroll.HashAlgorithm = "MD5" cenroll.KeySpec = 2 cenroll.GenKeyFlags = keyFlags pkcs10req = cenroll.CreatePKCS10(DNItem, "1.3.6.1.5.5.7.3.2") if(pkcs10req = Empty) Then GenPKCS10RequestByEnrollOnNonVista = "" errorString = "The error '" & hex(Err.Number) & "' occurred."& chr(13) & chr(10) & "Your certificate request could not be generated." err = MsgBox(errorString, 0, "Internet Explorer Certificate Request") on error goto 0 exit function else GenPKCS10RequestByEnrollOnNonVista = pkcs10req exit function end if End Function ' ---------------------------------------------------------------------------- ' 根据指定的CSP Provider名称、类型及密钥生成标识,生成PEM编码PKCS#10证书请求 ' Vista系统调用 ' cspName: CSP Provider名称,该值为FindProviders填充的SELECT.options.text ' cspType: CSP Provider类型,该值为FindProviders填充的SELECT.options.type ' keyFlags: 密钥生成标识。 ' 0 Export is not allowed. ' 1 The private key can be exported ' 2 The private key can be exported in plaintext form ' 4 The private key can be exported once for archiving ' 8 The private key can be exported in plaintext form once for archiving ' 返回值: "" 生成失败 ' PEM编码的PKCS#10格式请求 生成成功 ' ---------------------------------------------------------------------------- Function GenPKCS10RequestByEnrollOnVista(cspName, cspType, keyFlags , DNItem) Dim pkcs10req Dim g_objClassFactory Dim obj Dim objPrivateKey Dim g_objRequest Dim g_objRequestCMC Dim objDn Set g_objClassFactory=CreateObject("X509Enrollment.CX509EnrollmentWebClassFactory") Set obj=g_objClassFactory.CreateObject("X509Enrollment.CX509Enrollment") Set objPrivateKey=g_objClassFactory.CreateObject("X509Enrollment.CX509PrivateKey") Set objRequest=g_objClassFactory.CreateObject("X509Enrollment.CX509CertificateRequestPkcs10") Set objDn = g_objClassFactory.CreateObject("X509Enrollment.CX500DistinguishedName") ' pkcs10 length to 2048 objPrivateKey.Length = 2048 objPrivateKey.ProviderName = cspName objPrivateKey.ProviderType = cspType objPrivateKey.KeySpec = keyFlags objPrivateKey.ExportPolicy = keyFlags objRequest.InitializeFromPrivateKey 1, objPrivateKey, "" obj.InitializeFromRequest(objRequest) obj.CertificateDescription="Description" objDn.Encode DNItem,0 objRequest.Subject= objDn pkcs10req = obj.CreateRequest(1) if(pkcs10req = Empty) Then GenPKCS10RequestByEnrollOnVista= "" errorString = "The error '" & hex(Err.Number) & "' occurred."& chr(13) & chr(10) & "Your certificate request could not be generated." err = MsgBox(errorString, 0, "Internet Explorer Certificate Request") on error goto 0 exit function else GenPKCS10RequestByEnrollOnVista= pkcs10req exit function end if End Function ' ------------------------------------------------------------ ' ' 判断操作系统是否是Windows Vista 和IE7.0系统 ' ' ------------------------------------------------------------ Function isRunningOnVista () Dim Info Dim b dim s Info =Navigator.appVersion b = Browser (Info ) s = System(Info) If b >=7.0 And s>=6.0 Then isRunningOnVista = true Else isRunningOnVista = false End if End Function ' ------------------------------------------------------------ ' 使用CSP安装PKCS#7证书内容 ' ------------------------------------------------------------ Function AcceptCertSub(pkcs7Value) AcceptCertSub = InstallPKCS7Cert(pkcs7Value) End Function ' ------------------------------------------------------------ ' 使用CSP安装PKCS#7证书内容 ' ' pkcs7Value: BASE64编码的PKCS7格式证书内容(可为PEM编码) ' 返回结果: 0 安装成功 ' 其它 安装失败,返回错误代码。 ' ------------------------------------------------------------ Function InstallPKCS7Cert(pkcs7Value) If isRunningOnVista Then InstallPKCS7Cert = InstallPKCS7CertOnVista(pkcs7Value) Else InstallPKCS7Cert = InstallPKCS7CertOnNonVista(pkcs7Value) End If End Function ' ------------------------------------------------------------ ' 使用CSP安装PKCS#7证书内容 ' 非Vista系统调用 ' pkcs7Value: BASE64编码的PKCS7格式证书内容(可为PEM编码) ' 返回结果: 0 安装成功 ' 其它 安装失败,返回错误代码。 ' ------------------------------------------------------------ Function InstallPKCS7CertOnNonVista(pkcs7Value) On Error Resume Next err.clear Call cenroll.acceptPKCS7(pkcs7Value) If err.Number <> 0 Then msgbox err.Description InstallPKCS7CertOnNonVista = err.Number Else InstallPKCS7CertOnNonVista = 0 End If cenroll.WriteCertToCSP = false WriteMessage End Function ' ------------------------------------------------------------ ' vista 系统上使用CSP安装PKCS#7证书内容 ' Vista系统调用 ' pkcs7Value: BASE64编码的PKCS7格式证书内容(可为PEM编码) ' 返回结果: 0 安装成功 ' 其它 安装失败,返回错误代码。 ' ------------------------------------------------------------ Function InstallPKCS7CertOnVista(pkcs7Value) On Error Resume Next err.clear Dim enroll1 Dim g_objClassFactory_insert Set g_objClassFactory_insert=CreateObject("X509Enrollment.CX509EnrollmentWebClassFactory") Set enroll1 = g_objClassFactory_insert.CreateObject("X509Enrollment.CX509Enrollment") enroll1.Initialize(1) Call enroll1.InstallResponse(0,pkcs7Value,1,"") InstallPKCS7CertOnVista=0 If err.Number <> 0 Then msgbox err.Description InstallPKCS7CertOnVista = err.Number Else InstallPKCS7CertOnVista= 0 End If End Function ' ------------------------------------------------------------ ' ' 判断操作系统类型和浏览器类型 ' ' ------------------------------------------------------------ Function Browser(Info) If InStr(Info,"MSIE 7.0") > 0 Then Browser = 7.0 ElseIf InStr(Info,"MSIE 8") > 0 Then Browser = 8.0 ElseIf InStr(Info,"MSIE 6") > 0 Then Browser = 6.0 ElseIf InStr(Info,"MSIE 5.5") > 0 Then Browser = 5.5 ElseIf InStr(Info,"MSIE 5.0") > 0 Then Browser = 5.0 ElseIf InStr(Info,"MSIE 4") > 0 Then Browser = 4.0 Else Browser = "-1" End if End Function Function System(Info) If InStr(Info,"NT 6.0") > 0 Then 'Windows Vista System = 6.0 ElseIf InStr(Info,"NT 6.1") > 0 Then 'Windows 7 System=6.1 ElseIf InStr(Info,"NT 5.1") > 0 Then 'Windows XP System=5.1 ElseIf InStr(Info,"NT 5.0") > 0 Then 'Windows 2000 System = 5.0 Else System = "-1" End if End Function