Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 306|回复: 0

[默认分类] java安全套接层SSL示例

[复制链接]
  • TA的每日心情
    开心
    2021-12-13 21:45
  • 签到天数: 15 天

    [LV.4]偶尔看看III

    发表于 2018-5-15 14:51:41 | 显示全部楼层 |阅读模式

    1.建立密钥库:
    keytool -genkey -v -keyalg RSA -alias test -keystore sslkeystore
    其中;-keyalg RSA表示密钥算法RSA,-alias test 表示别名test,-keystore sslkeystore 表示密钥库名为sslkeystore
    2. 制作 证书文件:制作证书是从密钥库输出特定别名的证书,保存到证书文件test.cer中。
    keytool -export -alias test -file test.cer -keystore sslkeystore

    3.将证书文件test.cer导入自己的密钥库test:
    keytool -import -alias test -file test.cer -keystore test

    4.SSL服务端程序:
    SSLServerExample.java


    1. package com.cjq.save;
    2. import java.io.IOException;
    3. import java.io.PrintWriter;
    4. import java.net.ServerSocket;
    5. import java.net.Socket;
    6. import javax.net.ssl.SSLServerSocketFactory;
    7. //SSL服务器端程序
    8. public class SSLServerExample {
    9.         public static void main(String[] args) throws IOException{
    10.                 System.setProperty("javax.net.ssl.keyStore","sslkeystore");
    11.                 System.setProperty("javax.net.ssl.keyStorePassword", "123456");
    12.                 //创建SSLServerSocketFactory类对象。利用getDefault()方法建立一个强制转换成的SSLServerSocketFactory类对象
    13.                 SSLServerSocketFactory sslsf = (SSLServerSocketFactory)SSLServerSocketFactory.getDefault();
    14.                 //建立服务器套接口ServerSocket类对象,其端口8080
    15.                 ServerSocket ss = sslsf.createServerSocket(8080);
    16.                 System.out.println("Waiting for connection...");
    17.                
    18.                 while(true){
    19.                         Socket  s= ss.accept();
    20.                         System.out.println("Client connection made");
    21.                         //
    22.                         PrintWriter out = new PrintWriter(s.getOutputStream());
    23.                         out.println("HI");
    24.                         System.out.println("HI is sent to client");
    25.                        
    26.                        
    27.                         out.close();
    28.                         s.close();
    29.                 }
    30.         }
    31. }
    复制代码

    5.SSL客户端程序:
    SSLClientExample.java:


    1. package com.cjq.save;
    2. import java.io.BufferedReader;
    3. import java.io.IOException;
    4. import java.io.InputStreamReader;
    5. import java.net.Socket;
    6. import javax.net.ssl.SSLSocketFactory;
    7. //SSL客户端程序
    8. public class SSLClientExample {
    9.         public static void main(String[] args) throws IOException{
    10.                 //
    11.                 System.setProperty("javax.net.ssl.trustStore", "test");
    12.                 System.setProperty("javax.net.ssl.keyStorePassword", "123456");
    13.                 SSLSocketFactory sslsf = (SSLSocketFactory)SSLSocketFactory.getDefault();
    14.                
    15.                 Socket s = sslsf.createSocket("127.0.0.1",8080);
    16.                 System.out.println("the connection is ok");
    17.                
    18.                 BufferedReader in = new BufferedReader(new InputStreamReader(s.getInputStream()));
    19.                
    20.                 System.out.println(in.readLine());
    21.                
    22.                 in.close();
    23.                 s.close();
    24.                
    25.                 System.out.println("the connection is close");
    26.         }
    27. }
    复制代码

    6.运行程序:
    cmd窗口运行,且程序中System.setProperty(..,...)的代码是不存在的时候:
    java  -Djavax.net.ssl.keyStore=sslkeystore -Djava.net.ssl.keyStorePassword=123456 SSLClientExample
    则会出现错误:

    1. Exception in thread "main" java.net.SocketException: java.security.NoSuchAlgorithmException: Error constructing implementation (algorithm: Default, provider: SunJSSE, class: com.sun.net.ssl.internal.ssl.DefaultSSLContextImpl)
    2.         at javax.net.ssl.DefaultSSLServerSocketFactory.throwException(Unknown Source)
    3.         at javax.net.ssl.DefaultSSLServerSocketFactory.createServerSocket(Unknown Source)
    4.         at com.cjq.save.SSLServerExample.main(SSLServerExample.java:16)
    5. Caused by: java.security.NoSuchAlgorithmException: Error constructing implementation (algorithm: Default, provider: SunJSSE, class: com.sun.net.ssl.internal.ssl.DefaultSSLContextImpl)
    6.         at java.security.Provider$Service.newInstance(Unknown Source)
    7.         at sun.security.jca.GetInstance.getInstance(Unknown Source)
    8.         at sun.security.jca.GetInstance.getInstance(Unknown Source)
    9.         at javax.net.ssl.SSLContext.getInstance(Unknown Source)
    10.         at javax.net.ssl.SSLContext.getDefault(Unknown Source)
    11.         at javax.net.ssl.SSLServerSocketFactory.getDefault(Unknown Source)
    12.         at com.cjq.save.SSLServerExample.main(SSLServerExample.java:14)
    13. Caused by: java.security.UnrecoverableKeyException: Password must not be null
    14.         at sun.security.provider.JavaKeyStore.engineGetKey(Unknown Source)
    15.         at sun.security.provider.JavaKeyStore$JKS.engineGetKey(Unknown Source)
    16.         at java.security.KeyStore.getKey(Unknown Source)
    17.         at com.sun.net.ssl.internal.ssl.SunX509KeyManagerImpl.<init>(Unknown Source)
    18.         at com.sun.net.ssl.internal.ssl.KeyManagerFactoryImpl$SunX509.engineInit(Unknown Source)
    19.         at javax.net.ssl.KeyManagerFactory.init(Unknown Source)
    20.         at com.sun.net.ssl.internal.ssl.DefaultSSLContextImpl.getDefaultKeyManager(Unknown Source)
    21.         at com.sun.net.ssl.internal.ssl.DefaultSSLContextImpl.<init>(Unknown Source)
    22.         at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    23.         at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
    24.         at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
    25.         at java.lang.reflect.Constructor.newInstance(Unknown Source)
    26.         at java.lang.Class.newInstance0(Unknown Source)
    27.         at java.lang.Class.newInstance(Unknown Source)
    28.         ... 7 more
    复制代码

    原因是密码为空,但实际上参数中有“-Djava.net.ssl.keyStorePassword=123456”这个,密码不应该为空, 却报空, 目前不解。
    但将java 之后两个参数写在程序中:

    1.                 System.setProperty("javax.net.ssl.keyStore","sslkeystore");
    2.                 System.setProperty("javax.net.ssl.keyStorePassword", "123456");
    复制代码
    则正常运行。









    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2024-4-27 07:08 , Processed in 0.376578 second(s), 48 queries .

    Powered by Discuz! X3.4

    © 2001-2017 Comsenz Inc.

    快速回复 返回顶部 返回列表