zoukankan      html  css  js  c++  java
  • java中 SSL认证和keystore使用

     

    java中 SSL认证和keystore使用

     

    目录(?)[+]

     
     
    好久没用过SSL认证了,东西久不用,就有点生疏。博客就是有这个好处,可以做备忘录。
    java中是通过SSL认证,使用的是SSLSocket,通过SSLSocketFactory可以获得SSLSocket实例对象。通常SSLSocketFactory需要一个SSLContext环境对象来构建,
    构建一个SSLContext 环境:
    SSLContext sslc=SSLContext.getInstance("SSLv3");
     // 构造SSL环境,指定SSL版本为3.0,也可以使用TLSv1,但是SSLv3更加常用。
    sslc.init(KeyManager[],TrustManager[]null);
    //KeyManager[] 第一个参数是授权的密钥管理器,用来授权验证。TrustManager[]第二个是被授权的证书管理器,用来验证服务器端的证书。第三个参数是一个随机数值,可以填写null。如果只是服务器传输数据给客户端来验证,就传入第一个参数就可以,客户端构建环境就传入第二个参数。
    双向认证的话,就同时使用两个管理器。
    服务端:

    [代码]java代码:

    [js] view plain copy
     
    1. import java.io.FileInputStream;  
    2. import java.io.*;  
    3. import java.net.Socket;  
    4. import java.security.KeyStore;  
    5.   
    6. import javax.net.ssl.KeyManagerFactory;  
    7. import javax.net.ssl.SSLContext;  
    8. import javax.net.ssl.SSLServerSocket;  
    9. import javax.net.ssl.SSLServerSocketFactory;  
    10.   
    11.   
    12. public class KeystoreTest {  
    13.   
    14.     /** 
    15.      * name:KeystoreTest 
    16.      * author:suju 
    17.      */  
    18.     public static void main(String[] args) throws Exception{  
    19.         String key="c:/.keystore";  
    20.         KeyStore keystore=KeyStore.getInstance("JKS");  
    21.         //keystore的类型,默认是jks  
    22.         keystore.load(new FileInputStream(key),"123456".toCharArray());  
    23.         //创建jkd密钥访问库    123456是keystore密码。  
    24.         KeyManagerFactory kmf=KeyManagerFactory.getInstance("SunX509");  
    25.         kmf.init(keystore,"asdfgh".toCharArray());  
    26.         //asdfgh是key密码。  
    27.         //创建管理jks密钥库的x509密钥管理器,用来管理密钥,需要key的密码  
    28.         SSLContext sslc=SSLContext.getInstance("SSLv3");  
    29.         // 构造SSL环境,指定SSL版本为3.0,也可以使用TLSv1,但是SSLv3更加常用。  
    30.         sslc.init(kmf.getKeyManagers(),null,null);  
    31.         //第二个参数TrustManager[] 是认证管理器,在需要双向认证时使用,  
    32.         //构造ssl环境  
    33.           
    34.         SSLServerSocketFactory sslfactory=sslc.getServerSocketFactory();  
    35.          SSLServerSocket serversocket=(SSLServerSocket) sslfactory.createServerSocket(9999);  
    36.         //创建serversocket,监听,并传输数据来验证授权  
    37.          for(int i=0;i<15;i++)  
    38.          {   
    39.              final Socket socket=serversocket.accept();  
    40.              new Thread(){  
    41.                  public void run()  
    42.                  {  
    43.                      try{  
    44.                          InputStream is=socket.getInputStream();  
    45.                          OutputStream os=socket.getOutputStream();  
    46.                            
    47.                          byte[] buf=new byte[1024];  
    48.                          int len=is.read(buf);  
    49.                          System.out.println(new String(buf));  
    50.                          os.write("ssl test".getBytes());  
    51.                          os.close();  
    52.                          is.close();  
    53.                      }catch(Exception e)  
    54.                      {// }  
    55.                  }  
    56.              }.start();  
    57.          }  
    58.           serversocket.close();   
    59.     }  
    60. }  

    客户端:

    [代码]java代码:

    [js] view plain copy
     
    1. import java.io.FileInputStream;  
    2. import java.io.InputStream;  
    3. import java.io.OutputStream;  
    4. import java.security.KeyStore;  
    5.   
    6. import javax.net.ssl.KeyManagerFactory;  
    7. import javax.net.ssl.SSLContext;  
    8. import javax.net.ssl.SSLServerSocket;  
    9. import javax.net.ssl.SSLServerSocketFactory;  
    10. import javax.net.ssl.SSLSocket;  
    11. import javax.net.ssl.SSLSocketFactory;  
    12. import javax.net.ssl.TrustManagerFactory;  
    13.   
    14. public class KeystoreTestClient {  
    15.     /** 
    16.      * name:KeystoreTestClient 
    17.      * author:suju 
    18.      */  
    19.     public static void main(String[] args) throws Exception{  
    20.         String key="c:/client";  
    21.         KeyStore keystore=KeyStore.getInstance("JKS");  //创建一个keystore来管理密钥库  
    22.         keystore.load(new FileInputStream(key),"123456".toCharArray());  
    23.         //创建jkd密钥访问库  
    24.         TrustManagerFactory tmf=TrustManagerFactory.getInstance("SunX509");  
    25.         tmf.init(keystore);                 //验证数据,可以不传入key密码  
    26.         //创建TrustManagerFactory,管理授权证书  
    27.         SSLContext sslc=SSLContext.getInstance("SSLv3");  
    28.         // 构造SSL环境,指定SSL版本为3.0,也可以使用TLSv1,但是SSLv3更加常用。  
    29.         sslc.init(null,tmf.getTrustManagers(),null);  
    30.         //KeyManager[] 第一个参数是授权的密钥管理器,用来授权验证。第二个是被授权的证书管理器,  
    31.         //用来验证服务器端的证书。只验证服务器数据,第一个管理器可以为null  
    32.         //构造ssl环境  
    33.           
    34.         SSLSocketFactory sslfactory=sslc.getSocketFactory();  
    35.          SSLSocket socket=(SSLSocket) sslfactory.createSocket("127.0.0.1",9999);  
    36.         //创建serversocket通过传输数据来验证授权  
    37.            
    38.          InputStream is=socket.getInputStream();  
    39.          OutputStream os=socket.getOutputStream();         
    40.          os.write("client".getBytes());        
    41.          byte[] buf=new byte[1024];  
    42.          int len=is.read(buf);  
    43.          System.out.println(new String(buf));   
    44.          os.close();  
    45.          is.close();  
    46.     }  
    47. }  
    使用java中自带keytool管理keystore。
    **经常忘记参数,写下来记住。
    默认密钥库下创建一个key     keytool -genkeypair

    显示默认keystore的key详细信息  keytool -list -v


    使用其他keystore来创建key,如果keystore不存在就创建一个新的。 keytool --genkeypair -keystore c:client

    导出一个key    keytool -exportcert -alias mykey -file c:mykey.cer

    导入一个key到一个keystore,  keytool -importcert -alias mykey -file c:mykey.cer -keystore c:client

    还有很多关于key的操作,keytool提供了-help帮助命令

     
    1
  • 相关阅读:
    阻止所有普通账号登录服务器
    grep命令
    redis集群配置和节点管理
    redis的安装和配置
    shell特殊字符
    获取docker容器的ip地址
    mysql5.6.38误删除root用户后的一系列问题及解决办法
    CenrOS7.5安装msyql5.7.24
    使用163邮箱的smtp ssl端口发送邮件
    linux统计大文件行数的命令效率大对比
  • 原文地址:https://www.cnblogs.com/developer-ios/p/6267345.html
Copyright © 2011-2022 走看看