`
yuankai
  • 浏览: 107218 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

javascript与Capicom实现显示证书信息

阅读更多
首先介绍下什么是Capicom:
Capicom是Windows操作系统为我们提供了先进的加密体系模型CryptAPI,同时该模型也提供了丰富的函数供第三方开发使用。但使用CryptAPI完成一些通常的操作(如:加密、签名)仍然是相当复杂的。幸好MS同时提供了CAPICOM组件,封装了上述的复杂操作,使你只需要调用一两个函数,就可以完成指定的功能。CAPICOM是一个COM模型的组件,可以在Windows环境下各种语言中使用。而且,CAPICOM中的大多数接口都是“脚本安全”的,这意味着你可以在浏览器网页脚本中安全地使用这些接口所提供的功能。

Capicom官方API地址:
http://msdn.microsoft.com/en-us/library/aa380256(VS.85).aspx
下面介绍下怎么使用这个例子(浏览器必须是IE,还有IE中需要有数字证书):
1.把附件的例子下载到本地后,打开可以看到一个叫cert的文件夹,这个里面包含了一个证书,这个是一个HongKong Post Cert,把这个证书导如到你的IE浏览器中(点工具->Internet 选项->内容->证书->导入,接下来就一步步操作,选择证书,然后输入密码,证书的密码为12345678)。
2.找到GDCA_CAPICOM.HTM这个文件,右键选择打开方式为IE,然后IE会弹出一个是否允许运行ActiveX插件,允许就可以了。
3.如果你的IE中有证书的话,在页面会显示你证书的信息,然后选择你要查看的证书,点击显示选定证书信息按钮,就会在下面显示你当前选择的证书信息(这个显示证书信息的做得比较寒酸,就在当前也没加了一个层,然后显示在了这个层的里面  ).
4.收工。
4
1
分享到:
评论
2 楼 tuoxie007 2010-08-19  
请教,我想在前台用js签名,后台用java验证,但是校验不能成功,我发现了以下现象:
1. 你的签名里用了当前时间做干扰,那么我不知道如何用java来校验了,所以我就把时间干扰去掉了,但依然不能校验成功;
2. 我发现你在签名的时候,有几个下拉框,让选择哪种算法,但是js里貌似并没有读取这个select的值,所以这个Hash算法的选择是没有起到作用的;
3. 既然是没有选择使用哪种Hash算法,那么在签名的时候会不会隐式的使用了某种Hash算法呢?我不得而知;
4. 如果隐式的使用了默认的Hash算法,信息摘要的长度就是固定的,则签名的长度也应该是固定的,但我发现并不是这样的,签名的长度和明文的长度有关系,但不是正比例关系,而是一种一次线性关系;
5. 我试图用java对相同的文本做一次签名,从而对比一下和js产生的签名值是否是一样的,但是我却发现页面上js签名出来的值比java签名出来的长很多,无论我在java里使用了哪种签名算法都是这样,我实在不知道那个是合理的。

这里贴一下我后台的一点主要代码
import java.io.IOException;
import java.security.InvalidKeyException;
import java.security.KeyStoreException;
import java.security.NoSuchAlgorithmException;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.UnrecoverableKeyException;
import java.security.cert.CertificateException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.xml.XmlBeanFactory;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.Resource;

import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;

/**
 * Servlet implementation class PersonShowServlet
 */
public class PersonShowServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
	private String signatureAlgorithm = "SHA1withRSA";

    /**
     * @see HttpServlet#HttpServlet()
     */
    public PersonShowServlet() {
        super();
        // TODO Auto-generated constructor stub
    }
    
//在这里后台做签名与js相比较
	public static void main(String[] args) throws ServletException,
			IOException, KeyStoreException, NoSuchAlgorithmException,
			CertificateException, UnrecoverableKeyException {
		PersonShowServlet pss = new PersonShowServlet();
		byte[] bytes = "Hello 1".getBytes("UTF-8");//pss.digest("Hello 1");
		byte[] signedBytes = pss.doSign(bytes, CertificateUtil.loadPrivateKey("E:/tmp/pki-crt/mark.jks"));
		String signedB64 = new BASE64Encoder().encode(signedBytes);
		System.out.println(signedB64);
		
		Resource resource = new ClassPathResource("/com/apusic/portal/ldap/demo/spring-ldap.xml");
		BeanFactory factory = new XmlBeanFactory(resource);
		UserDao userDao = (UserDao) factory.getBean("userDao");
		String dn = "cn=mark";
		Person person = userDao.getPersonByDn(dn);
		PublicKey publicKey = CertificateUtil.loadCertificate(person).getPublicKey();
		boolean result = pss.doVerify(bytes, publicKey,  new BASE64Decoder().decodeBuffer(signedB64));
		System.out.println(result);
	}

//在这里校验js生成的签名
	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		String text = request.getParameter("loginMsgText");
		String security = request.getParameter("loginMsgSecurity");
		System.out.println(security.length());
		byte[] signed = new BASE64Decoder().decodeBuffer(security);
		Resource resource = new ClassPathResource("/com/apusic/portal/ldap/demo/spring-ldap.xml");
		BeanFactory factory = new XmlBeanFactory(resource);
		UserDao userDao = (UserDao) factory.getBean("userDao");
		String dn = "cn=mark";
		Person person = userDao.getPersonByDn(dn);
		try {
		    byte[] digest = text.getBytes();//digest(text);
		    PublicKey publicKey = CertificateUtil.loadCertificate(person).getPublicKey();
		    if(doVerify(digest, publicKey, signed)){
		    	response.getWriter().println("verified, it's OK");
		    }else{
		    	response.getWriter().println("verified, it's Invalid");
		    }
		} catch (CertificateException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
    
    private byte[] doSign(byte[] digest, PrivateKey priKey){
        // do sign for the message digest
        java.security.Signature signature = null;
        try {
            signature = java.security.Signature.getInstance(signatureAlgorithm);
        } catch (NoSuchAlgorithmException e) {
        }
        try {
            signature.initSign(priKey);
        } catch (InvalidKeyException e) {
        }
        try {
            signature.update(digest);
        } catch (java.security.SignatureException e) {
            //could not happen after the initialization
        }
        byte[] signed = null;
        try {
            signed = signature.sign();
        } catch (java.security.SignatureException e) {
        }
        return signed;
    }

    private boolean doVerify(byte[] digest, PublicKey pubKey, byte[] signedInfo) {
        // do verify
        java.security.Signature signature = null;
        try {
            signature = java.security.Signature.getInstance(signatureAlgorithm);
        } catch (NoSuchAlgorithmException e) {
            return false;
        }
        try {
            signature.initVerify(pubKey);
        } catch (InvalidKeyException e) {
            return false;
        }
        
        try {
            signature.update(digest);
        } catch (java.security.SignatureException e) {
            return false;
        }
        try {
            return signature.verify(signedInfo);
        } catch (java.security.SignatureException e) {
            return false;
        }
    }

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doGet(request, response);
	}

}


我现在是陷入绝境了,实在没办法了,兄台要是有时间,还望帮我看看,谢谢了!
1 楼 tuoxie007 2010-08-11  
太强了,多谢

相关推荐

    capicom操作证书的源代码

    1. **证书(Certificates)**:证书是一种包含公钥和身份信息的数据结构,通常由权威机构(如证书颁发机构,简称CA)签发。在Capicom中,证书用于验证数字签名的来源,确保数据的完整性和发送者的身份。 2. **数字...

    Javascript调用CAPICOM接口给数据签名

    将待签名数据以BASE64格式传入,页面调用此javascript进行签名。可以支持IE。

    微软的数字证书组件capicom

    微软的数字证书组件capicom和SDK 下载的资源

    capicom2java20130620

    Capicom与Java之间的交互是一个常见的需求,尤其是在Windows环境中使用Java进行开发时。本文将深入探讨Capicom库在Java中的应用,以及如何在2013年6月20日这个时间点上实现两者之间的互操作。 Capicom,全称为...

    capicom.rar_capicom_delphi p

    CAPICOM(Cryptographic API Component Object Model)是微软提供的一种组件,它允许开发者在应用程序中实现加密、签名和证书管理等功能。Delphi是一种流行的面向对象的编程语言,常用于开发Windows应用程序。 描述...

    CapiCom.rar_CAPICO_capicom cert delphi_certificate_delphi CAPIC

    在这个Delphi程序中,开发者展示了如何在Delphi环境下使用CAPICOM来读取数字证书的公钥信息。 描述中提到,这个程序的运行需要安装微软的CSP(CryptoAPI Service Provider),这是Windows操作系统中用于实现各种...

    CAPICOM.CAB

    标题 "CAPICOM.CAB" 指的是一个与IE浏览器和数字证书相关的 CAB 文件,CAB 是一种压缩格式,通常用于打包软件组件或驱动程序。在这个特定的情况下,CAPICOM(Cryptographic API Component Object Model)是微软提供...

    capicom包和demo代码(全)

    5. **时间戳服务**:Capicom 提供了与时间戳服务器交互的功能,使得数字签名即使在证书过期后也能保持有效性。 在压缩包中的"demo代码"部分,你可能会看到以下内容: - **环境兼容性**:示例可能涵盖不同的运行...

    CAPICOM for delphi应用实例(含CAPICOM_TLB.pas)

    CAPICOM,全称为“Microsoft Cryptographic API: Next Generation (CNG) Compatibility Interfaces”,是微软提供的一套组件,用于在应用程序中实现加密、签名、哈希等安全功能。它为.NET Framework和COM环境提供了...

    基于CAPICOM的签名验签DEMO

    这可以通过CAPICOM的`Certificates`集合实现,通过指定证书存储区(如“我的”或“受信任的根颁发机构”)和证书指纹来查找特定证书。 2. **创建签名**:使用`Signature`对象,结合证书和待签名的数据,生成数字...

    capicom.dll

    CAPICOM,全称为“Cryptographic API Component Object Model”,是微软提供的一套安全工具,用于在应用程序中实现加密、数字签名和证书管理等功能。在Windows Server 2008操作系统中,capicom.dll是系统正常运行或...

    capicom.rar_capicom

    标题中的"capicom.rar_capicom"暗示了我们关注的主题是CAPICOM,这是一个与加密和安全相关的组件,它被封装在RAR压缩文件中。描述进一步解释了CAPICOM(Cryptographic API Component Object Model)是微软Windows...

    CAPICOM.zip_capicom_zip

    1. `msxml5.dof` 和 `MSXML5_TLB.dcr`:这些都是与Microsoft XML Core Services (MSXML) 5.0相关的文件,MSXML是一个解析XML文档的库,CAPICOM可能会依赖于MSXML来处理XML格式的数据,如证书或加密信息。 2. `...

    capicom数字签名及验证源代码(pkcs#7)

    Capicom是微软提供的一个组件,全称为“CAPICOM ( Cryptographic API: Next Generation )”,它是.NET框架下的一个加密API,主要用于实现PKI(公钥基础设施)相关的功能,包括数字签名、证书管理等。此资源包提供的...

    CAPICOM_TLB_delphi_

    标题 "CAPICOM_TLB_delphi_" 指涉的是使用 Delphi 语言与 CAPICOM(Microsoft Cryptographic API Component Object Model)库交互的过程。CAPICOM 是微软提供的一组接口,用于加密、数字签名、消息摘要等安全操作。...

    capicom.dll xenroll.dll capicom.cab

    标题中的"capicom.dll"、"xenroll.dll"以及"capicom.cab"都是与数字证书和安全相关的组件,这些文件在Windows操作系统中扮演着关键角色。它们主要用于处理PKI(公钥基础设施)和证书操作,如数字签名、加密等。 ...

    下载capicom_dc_sdk.msi文件

    (5)开始-运行,输入regsvr32 capicom.dll,确定(win7通过附件中“命令提示符”打开) (6)再次运行VS2008(VS2005)进行编译,成功通过! 也可以直接先运行第(5)步试一下,如果不行从第(1)步开始

    capicom2java

    综上所述,Capicom2Java是一个解决Java平台与CAPICOM兼容性问题的工具,它使Java开发者能够在不依赖于.NET Framework的情况下,利用类似的接口进行证书操作,如签名、验证和管理。这对于在多平台环境中保持一致性,...

Global site tag (gtag.js) - Google Analytics