`
lao_lee
  • 浏览: 94793 次
  • 性别: Icon_minigender_1
  • 来自: 北京
最近访客 更多访客>>
社区版块
存档分类
最新评论

支持基于X509 V3客户端证书(IdP的认证手段)的Information Card

阅读更多
声明: 本文所有code除摘自网络的已注明出处外,都是本人在个人时间进行练习的代码,系本人个人书写,没有copy自任何出处, 也与IBM, Eclipse, 以及任何其他组织无关,本人也不对其主张任何权利.

其实很简单,这种卡里包含了一张客户端证书的thumb-print,需要根据这个指纹从证书库里搜索到对应的证书和私钥. 下面这张图:

是一张卡的文本内容,可以看到证书信息.[注:所谓thumb-print是微软创造的一个名字,实际上就是把一张X509证书导出为DER编码文件之后做一个SHA摘要.]

首先是怎样获得这样的一张卡,可以从微软公布的测试站点得到:
https://ipsts.federatedidentity.net/MgmtConsole/TestAccount.aspx?cardtype=x509Card

从上面这个网站可以得到一个测试用的客户端证书,是一个PFX格式的文件. Google一下,我找到了怎样从PFX文件中得到有用的东西并导入Java世界中:
http://dev2dev.bea.com.cn/techdoc/20061103894.html

这篇文章提供了一个方法,通过openSSL提供的工具把PFX文件转成PEM文件,再从PEM文件里把私钥和公钥用不同的命令导入到JKS文件中,这样就可以在Java程序中使用了.

于是又开始google可以在Windows上安装的openSSL.人类没有了Google可怎么办?!!
http://www.slproweb.com/products/Win32OpenSSL.html

使用这个命令:
openssl pkcs12 -in MYCERTS.pfx -out MYCERTS.pem -nodes
把PFX转换成了可以看懂的PEM文本文件(BASE64编码),这样我找到了证书和私钥.

证书可以很容易导入到JKS文件中,问题是java的keytool不能把私钥导入,这时我又找到了一个实用工具类ImportKey (注:代码拷贝自下面的站点:http://www.agentbob.info/agentbob/79-AB.html)

        try {
            // initializing and clearing keystore 
            KeyStore ks = KeyStore.getInstance("JKS", "SUN");
            ks.load( null , keypass.toCharArray());
            System.out.println("Using keystore-file : "+keystorename);
            ks.store(new FileOutputStream ( keystorename  ),
                    keypass.toCharArray());
            ks.load(new FileInputStream ( keystorename ),
                    keypass.toCharArray());

            // loading Key
            InputStream fl = fullStream (keyfile);
            byte[] key = new byte[fl.available()];
            KeyFactory kf = KeyFactory.getInstance("RSA");
            fl.read ( key, 0, fl.available() );
            fl.close();
            PKCS8EncodedKeySpec keysp = new PKCS8EncodedKeySpec ( key );
            PrivateKey ff = kf.generatePrivate (keysp);

            // loading CertificateChain
            CertificateFactory cf = CertificateFactory.getInstance("X.509");
            InputStream certstream = fullStream (certfile);

            Collection c = cf.generateCertificates(certstream) ;
            Certificate[] certs = new Certificate[c.toArray().length];

            if (c.size() == 1) {
                certstream = fullStream (certfile);
                System.out.println("One certificate, no chain.");
                Certificate cert = cf.generateCertificate(certstream) ;
                certs[0] = cert;
            } else {
                System.out.println("Certificate chain length: "+c.size());
                certs = (Certificate[])c.toArray();
            }

            // storing keystore
            ks.setKeyEntry(defaultalias, ff, keypass.toCharArray(), certs );
            System.out.println ("Key and certificate stored.");
            System.out.println ("Alias:"+defaultalias+"  Password:"+keypass);
            ks.store(new FileOutputStream ( keystorename ), keypass.toCharArray());
        } catch (Exception ex) {
            ex.printStackTrace();
        }


接下来遇到的问题是: 微软的Web service provider只接受application/soap+xml的Content-Type, 而AXIS-1.4发送的消息类型是text/xml...

22日与Mike聊天,问题很多: 微软的provider只支持SOAP 1.2,而Higgins STS目前的状态是SOAP 1.1的,留待Mike老兄处理了.我先把上层应用部分的code提交到Eclipse了.

25日, OK, Mike老兄发信声称他已经把STS部分的代码搞定了,可以check out出来一试究竟. 目前SVN中code是可以用于Wag IdP的(wag.bandit-project.org),但是微软的还不行,他们只支持SOAP 1.2, 我们只支持SOAP 1.1~~~
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics