1. 作为文件形式存在的证书一般有这几种格式:
1.带有私钥的证书
由Public Key Cryptography Standards #12,PKCS#12标准定义,包含了公钥和私钥的二进制格式的证书形式,以pfx作为证书文件后缀名。
2.二进制编码的证书
证书中没有私钥,DER 编码二进制格式的证书文件,以cer作为证书文件后缀名。
3.Base64编码的证书
证书中没有私钥,BASE64 编码格式的证书文件,也是以cer作为证书文件后缀名。

用keystool创建一个密钥库,里面含有demo-server的公钥与私钥.

1. keytool -genkey -v -alias  demo-server -keyalg RSA -keystore ./server_ks -dname "CN=localhost,OU=cn,O=cn,L=cn,ST=cn,C=cn" -storepass server -keypass 123123

导出demo-server的数字证书,证书有会有demo-server的公钥

2. keytool -export -alias demo-server -keystore ./server_ks -file server_key.cer

3. 把2生成的demo-server的数字证书导入到demo-client的密钥库./client_ks中

keytool -import -trustcacerts -alias bluedash-ssl-demo-server -file ./server_key.cer -keystore ./client_ks

这样客户端就可以与服务端通信了.

服务器端需要设定javax.net.ssl.keyStore/javax.net.ssl.keyStorePassword两个系统参数

而客户端需要设定javax.net.ssl.trustStore/javax.net.ssl.trustStorePassword两个系统参数

 

 

   
   
   
   
  1. //server  
  2. System.setProperty("javax.net.ssl.keyStore", SERVER_KEY_STORE);  
  3.   System.setProperty("javax.net.ssl.keyStorePassword", SERVER_KEY_STORE_PASSWORD); SSLServerSocketFactory factory = (SSLServerSocketFactory)SSLServerSocketFactory.getDefault();  
  4. SSLServerSocket _socket = (SSLServerSocket)factory.createServerSocket(8443);  
  5. _socket .accept();  
  6.  
  7. //client  
  8. System.setProperty("javax.net.ssl.tructStore", SERVER_TRUST_STORE);  
  9.   System.setProperty("javax.net.ssl.tructStorePassword", SERVER_TRUST_STORE_PASSWORD); SSLSocketFactory factory = (SSLSocketFactory)SSLSocketFactory.getDefault();  
  10. SSLSocket _socket = (SSLSocket)factory.createSocket("localhost",8443);  
  11.  

 

 对于双向认证而言,两个端点既做为服务端,也做为客户端。这时四个系统参数都需要设定。从字面本身的意思就可以理解,keyStore存储自已的私钥,用于表明自已的身份,而trustStore存储我可以信任的其他人公钥。我们一般所说的单向认证,就是客户端去认证服务端,服务端需要keyStore存储私钥,而客户端则需要把服务端的公钥加入可信任认证列表,即trustStore中