[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])
接下来遇到的问题是: 微软的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,需要根据这个指纹从证书库里搜索到对应的证书和私钥. 下面这张图:
[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~~~