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两个系统参数
- //server
- System.setProperty("javax.net.ssl.keyStore", SERVER_KEY_STORE);
- System.setProperty("javax.net.ssl.keyStorePassword", SERVER_KEY_STORE_PASSWORD); SSLServerSocketFactory factory = (SSLServerSocketFactory)SSLServerSocketFactory.getDefault();
- SSLServerSocket _socket = (SSLServerSocket)factory.createServerSocket(8443);
- _socket .accept();
- //client
- System.setProperty("javax.net.ssl.tructStore", SERVER_TRUST_STORE);
- System.setProperty("javax.net.ssl.tructStorePassword", SERVER_TRUST_STORE_PASSWORD); SSLSocketFactory factory = (SSLSocketFactory)SSLSocketFactory.getDefault();
- SSLSocket _socket = (SSLSocket)factory.createSocket("localhost",8443);
对于双向认证而言,两个端点既做为服务端,也做为客户端。这时四个系统参数都需要设定。从字面本身的意思就可以理解,keyStore存储自已的私钥,用于表明自已的身份,而trustStore存储我可以信任的其他人公钥。我们一般所说的单向认证,就是客户端去认证服务端,服务端需要keyStore存储私钥,而客户端则需要把服务端的公钥加入可信任认证列表,即trustStore中
本文转自 anranran 51CTO博客,原文链接:http://blog.51cto.com/guojuanjun/572478