JAVA SSL SOCKET通信服务器端证书单向认证

浅谈基于SSL的Socket通信  
        客户端认证服务器,即判断当前客户端连接的服务器是否可信  
        当客户使用SSL向站点服务器发送请求时,服务器向客户端发送一个证书,客户使用已安装的证书,验证服务器身份,然后检查IP地址(主机名)与客户端连接的主机是否匹配。客户生成可以用来对话的私钥(称为会话密钥),然后用服务者的公钥对它进行加密并将它发送到服务者。服务者用自己的私钥解密,然后用该信息和客户端一样的私有会话密钥。通常在这个阶段使用RSA算法。 
        随后,客户端和服务器端使用私有会话密钥和私钥算法(通常是RC4)进行通信。使用另一个密钥的消息认证码来确保消息的完整性。 
        使用JSSE实现客户与服务器端安全通信的步骤如下: 
         1. 建立服务器端密钥库,制作数字证书  
        (a) 建立服务器端密钥库 
Java代码   收藏代码
  1. keytool.exe -genkeypair -v -alias sslsocket -keyalg RSA -keystore e:\keytool\sslsocket.keystore  

建立密钥库提示代码   收藏代码
  1. 输入keystore密码:  
  2. 再次输入新密码:  
  3. 您的名字与姓氏是什么?  
  4.   [Unknown]:  lcl  
  5. 您的组织单位名称是什么?  
  6.   [Unknown]:  hansky  
  7. 您的组织名称是什么?  
  8.   [Unknown]:  sts  
  9. 您所在的城市或区域名称是什么?  
  10.   [Unknown]:  bj  
  11. 您所在的州或省份名称是什么?  
  12.   [Unknown]:  bj  
  13. 该单位的两字母国家代码是什么  
  14.   [Unknown]:  zh  
  15. CN=lcl, OU=hansky, O=sts, L=bj, ST=bj, C=zh 正确吗?  
  16.   [否]:  y  

结果代码   收藏代码
  1. 正在为以下对象生成 1,024 位 RSA 密钥对和自签名证书 (SHA1withRSA)(有效期为 90 天):  
  2.          CN=lcl, OU=hansky, O=sts, L=bj, ST=bj, C=zh  
  3. 输入<sslsocket>的主密码  
  4.         (如果和 keystore 密码相同,按回车):  
  5. [正在存储 e:\keytool\sslsocket.keystore]  

        (b) 查看密钥库信息 
Java代码   收藏代码
  1. keytool.exe -list -v -alias sslsocket -keystore e:\keytool\sslsocket.keystore  

        (c) 制作证书 
        制作证书是从密钥库输出特定别名的证书,保存到证书文件sslsocket.cer 
Java代码   收藏代码
  1. keytool.exe -exportcert -v -alias sslsocket -file e:\keytool\sslsocket.cer -keystore e:\keytool\sslsocket.keystore  

制作证书的提示代码   收藏代码
  1. 输入keystore密码:  
  2. 保存在文件中的认证 <e:\keytool\sslsocket.cer>  

        (d) 查看证书文件信息 
Java代码   收藏代码
  1. keytool.exe -printcert -v -file e:\keytool\sslsocket.cer  

         2. 保存服务器端证书到客户端密钥库,以备客户接收到服务器端证书进行验证  
        (a) 导入证书 
Java代码   收藏代码
  1. keytool.exe -importcert -v -alias sslsocketcer -file e:\keytool\sslsocket.cer -keystore e:\keytool\sslclient.keystore  

导入证书提示信息代码   收藏代码
  1. 输入keystore密码:  
  2. 所有者:CN=lcl, OU=hansky, O=sts, L=bj, ST=bj, C=zh  
  3. 签发人:CN=lcl, OU=hansky, O=sts, L=bj, ST=bj, C=zh  
  4. 序列号:4ce5e012  
  5. 有效期: Fri Nov 19 10:25:22 CST 2010 至Thu Feb 17 10:25:22 CST 2011  
  6. 证书指纹:  
  7.          MD5:A3:8E:D8:83:4B:FC:12:30:36:0F:E3:F8:3C:EB:CE:74  
  8.          SHA1:E3:B8:FB:D3:98:FB:FB:63:D8:BC:A9:F9:AA:F4:FE:8A:54:CC:B6:4B  
  9.          签名算法名称:SHA1withRSA  
  10.          版本: 3  
  11. 信任这个认证? [否]:  y  
  12. 认证已添加至keystore中  
  13. [正在存储 e:\keytool\sslclient.keystore]  

         (b) 若希望删除 
Java代码   收藏代码
  1. keytool.exe -delete -alias sslsocketcer -keystore e:\keytool\sslclient.keystore  

         (c) 查看证书信息 
Java代码   收藏代码
  1. keytool.exe -list -v -keystore e:\keytool\sslclient.keystore  

          3. 建立服务器端安全的Socket对象  
Java代码   收藏代码
  1. public class TestSSLSocketServer {  
  2.     private static String path = "e:\\keytool\\sslsocket.keystore";  
  3.     private static char[] password = "aaaaaaa".toCharArray();  
  4.   
  5.     /** 
  6.      * @param args 
  7.      */  
  8.     public static void main(String[] args) {  
  9.         boolean flag = true;  
  10.         SSLContext context = null;  
  11.         try {  
  12.             KeyStore ks = KeyStore.getInstance("JKS");  
  13.             ks.load(new FileInputStream(path), password);  
  14.             KeyManagerFactory kmf = KeyManagerFactory.getInstance("SunX509");  
  15.             kmf.init(ks, password);  
  16.             KeyManager[] km = kmf.getKeyManagers();  
  17.             context = SSLContext.getInstance("SSL");  
  18.             context.init(km, nullnull);  
  19.         } catch (FileNotFoundException e) {  
  20.             e.printStackTrace();  
  21.         } catch (KeyStoreException e) {  
  22.             e.printStackTrace();  
  23.         } catch (IOException e) {  
  24.             e.printStackTrace();  
  25.         } catch (NoSuchAlgorithmException e) {  
  26.             e.printStackTrace();  
  27.         } catch (CertificateException e) {  
  28.             e.printStackTrace();  
  29.         } catch (UnrecoverableKeyException e) {  
  30.             e.printStackTrace();  
  31.         } catch (KeyManagementException e) {  
  32.             e.printStackTrace();  
  33.         }  
  34.         SSLServerSocketFactory ssf = (SSLServerSocketFactory) context.getServerSocketFactory();  
  35.         try {  
  36.             SSLServerSocket ss = (SSLServerSocket) ssf.createServerSocket(8000);  
  37.             System.out.println("等待客户点连接。。。");  
  38.             while (flag) {  
  39.                 Socket s = ss.accept();  
  40.                 System.out.println("接收到客户端连接");  
  41.                 ObjectOutputStream os = new ObjectOutputStream(s.getOutputStream());  
  42.                 os.writeObject("echo : Hello");  
  43.                 os.flush();  
  44.                 os.close();  
  45.                 System.out.println();  
  46.                 s.close();  
  47.             }  
  48.             ss.close();  
  49.         } catch (IOException e) {  
  50.             e.printStackTrace();  
  51.         }  
  52.     }  
  53. }  

         4. 建立客户与服务器端连接的Socket对象  
Java代码   收藏代码
  1. public class TestSSLSocketClient {  
  2.     private static String path = "e:\\keytool\\sslclient.keystore";  
  3.     private static char[] password = "aaaaaaa".toCharArray();  
  4.   
  5.     /** 
  6.      * @param args 
  7.      */  
  8.     public static void main(String[] args) {  
  9.         SSLContext context = null;  
  10.         try {  
  11.             KeyStore ts = KeyStore.getInstance("JKS");  
  12.             ts.load(new FileInputStream(path), password);  
  13.             TrustManagerFactory tmf = TrustManagerFactory.getInstance("SunX509");  
  14.             tmf.init(ts);  
  15.             TrustManager [] tm = tmf.getTrustManagers();  
  16.             context = SSLContext.getInstance("SSL");  
  17.             context.init(null, tm, null);  
  18.         } catch (...... e) {         //省略捕获的异常信息  
  19.             e.printStackTrace();  
  20.         }   
  21.         SSLSocketFactory ssf = context.getSocketFactory();  
  22.         try {  
  23.             SSLSocket ss = (SSLSocket) ssf.createSocket("localhost"8000);  
  24.             System.out.println("客户端就绪。");  
  25.             ObjectInputStream br = new ObjectInputStream(ss.getInputStream());  
  26.             try {  
  27.                 System.out.println(br.readObject());  
  28.             } catch (ClassNotFoundException e) {  
  29.                 e.printStackTrace();  
  30.             }  
  31.             br.close();  
  32.             ss.close();  
  33.             System.out.println("客户端测试ok");  
  34.         } catch (UnknownHostException e) {  
  35.             e.printStackTrace();  
  36.         } catch (IOException e) {  
  37.             e.printStackTrace();  
  38.         }  
  39.     }  
  40. }  
  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值