分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.youkuaiyun.com/jiangjunshow
也欢迎大家转载本篇文章。分享知识,造福人民,实现我们中华民族伟大复兴!
本文首先感谢 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 -srcaliasp12client -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(HttpServletRequestrequest, HttpServletResponse response)
*/
protected void doGet(HttpServletRequestrequest, HttpServletResponse response) throws ServletException, IOException {
String filename="C://Documents andSettings//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");
//man.saveCert(alias,"123456");
}catch(Exception e){
e.printStackTrace();
}
}
// 导出证书
private void exportCert(Pkcs12Managerman,String alias,HttpServletResponse response){
OutputStream out=null;
try{
Certificate cert = man.keyStore.getCertificate(alias);
// 得到证书内容(以编码过的格式)
byte[] buf = cert.getEncoded();
// 写证书文件
response.setContentType("application/x-download");
response.addHeader("Content-Disposition", "attachment;filename="
+ man.file.getName());
out= response.getOutputStream();
out.write(buf);
}
catch(Exception e){e.printStackTrace();}
finally{
try{
out.close();
}catch(Exception e){
}
}
}
/**
* @seeHttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected voiddoPost(HttpServletRequest request, HttpServletResponse response) throws ServletException,IOException {
doGet(request,response);
}
}
其中,Pkcs12Manager是一个javabean,提供了对PKCS12证书的读取、修改操作,代码如下:
public class Pkcs12Manager {
public File file;
public KeyStore keyStore;
private char[] storePass;
public Pkcs12Manager(File file, String pass) throws IOException, Exception {
this.file = file;
this.storePass=pass.toCharArray();
getKeyStore();// 加载KeyStore文件
}
// 加载KeyStore文件
public synchronized KeyStore getKeyStore() throws IOException, Exception {
if (keyStore == null) {
FileInputStream fin = new FileInputStream(file);
KeyStore store = KeyStore.getInstance("PKCS12");
try {
store.load(fin,storePass);
}
finally {
try {
fin.close();
} catch (IOException e) { }
}
keyStore = store;
}
return keyStore;
}
// 读取alias指定的证书内容
public X509CertInfogetX509CertInfo(String alias)throws Exception {
X509CertImpl cimp=getX509CertImpl(alias);
//获取X509CertInfo对象
return (X509CertInfo) cimp.get(X509CertImpl.NAME
+ "." + X509CertImpl.INFO);
}
// 根据alias获取X509CertImpl对象
private X509CertImplgetX509CertImpl(String alias)throws Exception{
Certificate c = keyStore.getCertificate(alias);// 读取证书
// 从待签发的证书中提取证书信息
byte[] enc = c.getEncoded();//获取 证书内容(经过编码的字节)
X509CertImpl cimp= new X509CertImpl(enc);//创建X509CertImpl象
return cimp;
}
// 修改证书过期时间:过期时间顺延n天
public void updateExpiration(Stringalias,String keypass,