2008-04-21
支持基于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)
接下来遇到的问题是: 微软的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~~~
其实很简单,这种卡里包含了一张客户端证书的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~~~
发表评论
- 浏览: 39325 次
- 性别:

- 来自: 北京

- 详细资料
搜索本博客
我的相册
照片 006
共 11 张
共 11 张
最近加入圈子
最新评论
-
程序员为什么跳槽
深以为然。的确如此
-- by penghao122 -
程序员为什么跳槽
很荣幸 看到这么两位牛人的发言。朴素....
-- by sunchang_long -
Windows SPNEGO 开发小结
首先,你需要部署一个Windows AD domain。 其次,需要在域内配置你 ...
-- by lao_lee -
Web service杂谈
以前听说SOA是说给企业老总听的,与程序员无关,所以没有多多关注。前些天看了程序 ...
-- by Lincoln -
Web service杂谈
关注WebSevice 但愿开是以后开发简便的好!!!
-- by O.Lions






评论排行榜