本文首先感谢 Apple 开发者论坛的eskimo1,他是我见过的最热心肠的人,对任何人他都不吝于给予无私帮助。
服务器生成PKCS12证书库,并通过servlet导出为DER客户端证书(含一个密钥和一个证书)。iPhone从服务器下载证书后,如何进行验证?
一、
生成证书
假设密钥库为dlt.p12,库密码ipcc@95598,有效期1天,则命令为:
keytool -genkey -v
-alias root -keyalg RSA -storetype PKCS12 -keystore dlt.p12 -dname "CN=www.handtimes.com,OU=ipcc,O=云电同方,L=昆明,ST=云南,C=中国"
-storepass ipcc@95598 -keypass ipcc@95598
生成客户端用的证书:
keytool -genkey -v
-alias p12client -keyalg RSA -storetype PKCS12 -keystore dlt.p12 -dname
"CN=www.handtimes.com,OU=ipcc,O=云电同方,L=昆明,ST=云南,C=中国" -storepass ipcc@95598
-keypass 123456 -validity 1
要查看已生成的证书,用下面的命令:
keytool -list -v
-alias p12client -keystore dlt.p12 -storepass ipcc@95598 -storetype PKCS12
或者:
keytool -list -v
-keystore IPCCCA
–
dlt.p12 ipcc@95598 -storetype PKCS12
如果需要将p12证书导出为.cer格式,可以使用命令:
keytool -export
-alias p12client -keystore dlt.p12 -storetype PKCS12 -storepass ipcc@95598 -rfc
-file p12.cer
查看.cer文件:
keytool -printcert
-v -file /Users/kmyhy/Desktop/client.cer
如果需要将keystore中的私钥导出为.p12格式:
Keytool.exe
-importkeystore -srckeystore IPCCCA -srcstoretype jks -srcstorepass ipcc@95598 -srcalias
p12client
-destkeystore dltclient.p12
-deststoretype pkcs12 -deststorepass ipcc@95598 -destkeypass 123456
–
validity 3
注意,keytool用的是jdk1.6提供的版本。此时命令提示忽略用户输入的destkeypass密码:
重新输入密码123456,回车,将在用户主目录下生成dltclient.p12文件。
查看dltclient.p12内容:
keytool.exe -list
-keystore dltclient.p12 -storepass ipcc@95598 -storetype pkcs12
可以看到如下输出:
可以看到其中包含了证书和私钥,并且其认证指纹是和IPCCCA中的一模一样的。
一、
提供证书下载
先把生成的p12证书库dlt.p12放到服务器目录下。
新建一个Servlet:GetP12Cert。
public
class
GetP12Cert
extends
HttpServlet {
private
static
final
long
serialVersionUID
= 1L;
private
static
final
int
max_days
=1;
/**
*
@see
HttpServlet#HttpServlet()
*/
public
GetP12Cert() {
super
();
//
TODO
Auto-generated constructor stub
}
/**
*
@see
HttpServlet#doGet(HttpServletRequest
request, HttpServletResponse response)
*/
protected
void
doGet(HttpServletRequest
request, HttpServletResponse response)
throws
ServletException, IOException {
String filename=
"C://Documents and
Settings//Administrator//dlt.cer"
;
String pass=
"ipcc@95598"
;
Pkcs12Manager man=
null
;
String alias=
"p12client"
;
String keypass=
"123456"
;
try
{
man=
new
Pkcs12Manager(
new
File(filename),pass);
man.updateExpiration(alias,
keypass,
max_days
);
exportCert(man,alias,response);
//
man.saveCert(alias,
"123456");