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

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

其实很简单,这种卡里包含了一张客户端证书的thumb-print,需要根据这个指纹从证书库里搜索到对应的证书和私钥. 下面这张图:
[img]http://lao-lee.iteye.com/upload/picture/pic/12619/2a41b82e-3f39-336f-932f-4b36897cc7e8.png[/img]
是一张卡的文本内容,可以看到证书信息.[注:所谓thumb-print是微软创造的一个名字,实际上就是把一张X509证书导出为DER编码文件之后做一个SHA摘要.]

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

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

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

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

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

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


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~~~
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值