代码改变世界

Win7 支付宝证书 安装记

2009-06-15 00:17  G yc {Son of VB.NET}  阅读(11350)  评论(12编辑  收藏  举报

 

Win7 是个好东西啊~ 因为太好了

推荐给了别人, 但这也是问题的开始,

因为是老机器 (Benq joybook 6000),弄得有些乱, 因此想重做。

于是安装了最新的 Win7,但有1个大失败, 就是 855GM 显卡 没有驱动, 这个郁闷啊

Aero 开不了了, 不过这个也不常用,也就算了。

之后,没有什么问题,直到 支付宝这,就完了。

虽然,当初认为是Win7问题,以为没有方法, 但网上一搜,原来 尝鲜的也不少啊~

网上那些方法都试过了,但却没用。 于是开始了一番探索,终于成功导入证书。

 

在开始之前,先说一下几点

系统, 是WIN 7  32位 中文版的, BT上弄来的,不知道是原转的还是后大补丁的。

如果你已经成功导入,那么恭喜你,你没必要继续读下去了。(学习的话,也可以)

如果你还没有成功导入证书,并且试了你按照网上的文章操作了(http://blog.alipay.com/638.html)还是无效的,

那么你可参考本文试试,不过 建议你还原之后在做。 这部分可以看最后的注释。

 

1、定位到注册表

HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Internet Explorer\ActiveX Compatibility\{127698e4-e730-4e5c-a2b1-21490a70c8a1}

(注:这个是64位的,32位的是

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorer\ActiveX Compatibility\{127698e4-e730-4e5c-a2b1-21490a70c8a1})

将 Compatibility Flags 设置为0 (默认 400)

clip_image001

 

2、 然后浏览 http://www.myca.cn/myca/installRoot.asp (注3)

看到 证书安装失败

clip_image002

 

不用管这个, 点击确定。

然后, 注意到 IE 下边出现 的信息栏, 单击, 然后选择 “为此计算机上的所有用户安装此加载项。”

clip_image003

之后页面会自动刷新,然后 UAC会弹出, 选择 “是” (因为UAC是在安全桌面, 无法截图)

之后,稍等一会,便可以看到

clip_image004

 

这就表示这个 加载项安装成功了, 选择 “是” 继续。

clip_image005

如果看到这个错误, 则你需要把当前站点添加到 “可信任站点” 中

clip_image006

 

如果没有错误, 或者完成了上步,应该 会看到这个

clip_image007

单击 “是(Y)”继续。

clip_image008

 

看到了这个就表示成功了。

然后 点击 “工具”——“管理加载项”

clip_image009

 

出来这个,

clip_image010

 

可以在对话框中看到 Cenrool Class , 选中它 然后 单击 “详细信息(R)” 或者直接双击, 看到

clip_image011

 

(可以看到 它 安装的位置不是 System32,而是 Downloaded Program Files 下)

点击 “删除所有站点” (恩,不要怕) , 然后在点击 在 “在所有站点上允许(A)” , 之后 关闭。

然后,就可去支付宝? 还是不行啊~

截至目前为止(2009-06-14), 我是没有成功过(通过IE)

后来,用调试器继续分析,发现,

 

实际上 Vista 之后,MS 一改之前的安全策略,而使用了新的安全控件

clip_image012

 

而支付宝一向和MS合作要好(IE8的时候就是), 当然也使用了新的控件。

使用了新的控件,也就意味着前面做的那西没用了 (-_---!) (后面,说说新的控件)

回头有仔细看了一下调试器的JS,发现

 

Code
if(!isVista()) {    //Not vista
    var objstr='<object classid="clsid:127698e4-e730-4e5c-a2b1-21490a70c8a1" CODEBASE="'+urlXEnrollCab+'" onreadystatechange="javascript:if(this.readyState==4) cenroll=this"> </object>';
    document.write(objstr);
}
else{    //vista
    var objstr='<object id="objCertEnroll" classid="clsid:884e2049-217d-11da-b2a4-000e7bbb2b09" onreadystatechange="javascript:if(this.readyState==4)cenroll=new XEnroll();"> </object>';
    document.write(objstr);
}

function isVista()
{
    
if (navigator.userAgent.indexOf("NT">= 0 && navigator.userAgent.substr(navigator.userAgent.indexOf("NT")+31>= 6)
        
return true;
    
else
        
return false;
}

 

看来只要使 骗过系统,让对方误以为 是 Vista之前的系统就可以继续使用老控件了~

但是 在网上看了半天,也没看到可以用的方法, 因为修改Windows注册表没用,Windows NT字符在注册表那些之前出来。

后来突然想到一个救军~~ 傲游

记得傲游设置里面可以自定义 UserAgent字符串, 打开看看, 没想到真的救军来了

在“高级选项”里 勾选 “自定义 UserAgent 字符串” ,然后在 “预定义模板” 中 选择 IE7

再把下边字符串中的 7.0 改成8.0 保存 重启

clip_image013

 

去支付宝试试, 通过顺利通过验证, 之后就可以再把那个设置关闭了就可以了

 


 

 

再说说新控件问题,在网上找到新控件的测试代码

 

Code
<html>
<head>
<title>Certificate Request test</title>
</head>
<body> 
  
<object id="objCertEnrollClassFactory" classid="clsid:884e2049-217d-11da-b2a4-000e7bbb2b09"></object>    
  
<script language="javascript">

    
function CreateRequest() 
    {
      document.write(
"<br>Create Request");                      

      
try {
        
// Variables
        var objCSP = objCertEnrollClassFactory.CreateObject("X509Enrollment.CCspInformation");
        
var objCSPs = objCertEnrollClassFactory.CreateObject("X509Enrollment.CCspInformations");
        
var objPrivateKey = objCertEnrollClassFactory.CreateObject("X509Enrollment.CX509PrivateKey");
        
var objRequest = objCertEnrollClassFactory.CreateObject("X509Enrollment.CX509CertificateRequestPkcs10")
        
var objObjectIds = objCertEnrollClassFactory.CreateObject("X509Enrollment.CObjectIds");
        
var objObjectId = objCertEnrollClassFactory.CreateObject("X509Enrollment.CObjectId");
        
var objX509ExtensionEnhancedKeyUsage = objCertEnrollClassFactory.CreateObject("X509Enrollment.CX509ExtensionEnhancedKeyUsage");
        
var objExtensionTemplate = objCertEnrollClassFactory.CreateObject("X509Enrollment.CX509ExtensionTemplateName")
        
var objDn = objCertEnrollClassFactory.CreateObject("X509Enrollment.CX500DistinguishedName")
        
var objEnroll = objCertEnrollClassFactory.CreateObject("X509Enrollment.CX509Enrollment")

        
//  Initialize the csp object using the desired Cryptograhic Service Provider (CSP)
        objCSP.InitializeFromName("Microsoft Enhanced Cryptographic Provider v1.0");

        
//  Add this CSP object to the CSP collection object
        objCSPs.Add(objCSP);

        
//  Provide key container name, key length and key spec to the private key object
        //objPrivateKey.ContainerName = "AlejaCMa";
        objPrivateKey.Length = 1024;
        objPrivateKey.KeySpec 
= 1// AT_KEYEXCHANGE = 1

        
//  Provide the CSP collection object (in this case containing only 1 CSP object)
        //  to the private key object
        objPrivateKey.CspInformations = objCSPs;

        
// Initialize P10 based on private key
        objRequest.InitializeFromPrivateKey(1, objPrivateKey, ""); // context user = 1

        
// 1.3.6.1.5.5.7.3.2 Oid - Extension
        objObjectId.InitializeFromValue("1.3.6.1.5.5.7.3.2");
        objObjectIds.Add(objObjectId);
        objX509ExtensionEnhancedKeyUsage.InitializeEncode(objObjectIds);
        objRequest.X509Extensions.Add(objX509ExtensionEnhancedKeyUsage);

        
// 1.3.6.1.5.5.7.3.3 Oid - Extension
        //objExtensionTemplate.InitializeEncode("1.3.6.1.5.5.7.3.3");
        //objRequest.X509Extensions.Add(objExtensionTemplate);

        
// DN related stuff
        objDn.Encode("CN=alejacma"0); // XCN_CERT_NAME_STR_NONE = 0
        objRequest.Subject = objDn;

        
// Enroll
        objEnroll.InitializeFromRequest(objRequest);
        
var pkcs10 = objEnroll.CreateRequest(3); // XCN_CRYPT_STRING_BASE64REQUESTHEADER = 3

        document.write(
"<br>" + pkcs10);
        document.write(
"<br>The end!");
      }
      
catch (ex) {
        document.write(
"<br>" + ex.description);
        
return false;
      }

      
return true;
    }       

    CreateRequest();

  
</script>
    
</body>

</html>

 

 

 

将代码保存到 .HTM 文件,然后打开,信息栏提示 使用 ActiveX 可能带来安全问题, 但却始终不能启动。。(恩是不能启动, 没有那一项)

自已一个IIS站点将其放入,并加入 信任站点中, 也不行, 还是无法开打

后来,看了一下 Windows帮助,又去微软官方看看, 想到是权限问题。

回来赶紧试试, 经过测试,发现, 只要在对应区域中,将 ActiveX里的 “对未标记为可安全执行脚本的 ActiveX控件初始化。。。” 选上提示。 就可以解决问题,(页面会有提示,是否允许交互, 选择是既可, 否的话就是禁用)

clip_image014

虽然可以用了, 但抱着激动心情,去支付宝上, 却。。。。。

不管用。。。。 唉。。。。。

 


 

 

注1: 想必有很多人看到网上的N多转载, 说是解决WIn7 问题, 但却不管用。 (虽然,现在我也十分怀疑,当初他们是怎么通过检测的, 当然也有可能,那个时候,在支付宝还没有升级到新控件的时候,或许可用,但现在一切未知了。。)

虽然不管用,但你已经做了,不过本文使用的是另一个方式,因此你需要把之前的改回去。

首先是文件, 用管理员模式打开 命令行提示符

然后输入

Cd c:\windows\system32 (如果是X64 ,则是 c:\Windows\SysWOW64)

Regsvr32 -u xenroll.dll

反注册之后,你就删掉那个文件了

接下来是注册表,实际上,这个问题不大, 但网上那些,却多出一个简直来, 不明白用途, 所以可以删了

 

 

注2:如果你已经不知道都对IE改了什么了, 你可以通过 在 IE “工具” ——“Internet 选项” ——“高级” 中

点击 还原高级设置 和 重置, 将浏览器回复。

clip_image015

 

 

注3: 虽然可以想我这里这么安装, 但也可以直接进入支付宝来安装。 因为 支付宝也提供了控件下载。不过这是我后期发现了, 没有测试