SSL和HTTPS

SSL说明:

  1)简介

  SSL (Secure Socket Layer)为Netscape所研发,用以保障在Internet上数据传输之安全,利用数据加密(Encryption)技术,可确保数据在网络上之传输过程中不会被截取。它已被广泛地用于Web浏览器与服务器之间的身份认证和加密数据传输。SSL协议位于TCP/IP协议与各种应用层协议之间,为数据通讯提供安全支持。

  2)SSL提供的服务

  a.认证用户和服务器,确保数据发送到正确的客户机和服务器

  b.加密数据以防止数据中途被窃取

  c.维护数据的完整性,确保数据在传输过程中不被改变。

  3) SSL协议的握手过程

  SSL 协议既用到了公钥加密技术又用到了对称加密技术,对称加密技术虽然比公钥加密技术的速度快,可是公钥加密技术提供了更好的身份认证技术。SSL 的握手协议非常有效的让客户和服务器之间完成相互之间的身份认证,其主要过程如下:

  ①客户端的浏览器向服务器传送客户端SSL 协议的版本号,加密算法的种类,产生的随机数,以及其他服务器和客户端之间通讯所需要的各种信息。

  ②服务器向客户端传送SSL 协议的版本号,加密算法的种类,随机数以及其他相关信息,同时服务器还将向客户端传送自己的证书。

  ③客户利用服务器传过来的信息验证服务器的合法性,服务器的合法性包括:证书是否过期,发行服务器证书的CA 是否可靠,发行者证书的公钥能否正确解开服务器证书的“发行者的数字签名”,服务器证书上的域名是否和服务器的实际域名相匹配。如果合法性验证没有通过,通讯将断开;如果合法性验证通过,将继续进行第四步。

  ④用户端随机产生一个用于后面通讯的“对称密码”,然后用服务器的公钥(服务器的公钥从步骤②中的服务器的证书中获得)对其加密,然后传给服务器。

  ⑤服务器用私钥解密“对称密码”(此处的公钥和私钥是相互关联的,公钥加密的数据只能用私钥解密,私钥只在服务器端保留。详细请参看: http://zh.wikipedia.org/wiki/RSA%E7%AE%97%E6%B3%95),然后用其作为服务器和客户端的“通话密码”加解密通讯。同时在SSL 通讯过程中还要完成数据通讯的完整性,防止数据通讯中的任何变化。

  ⑥客户端向服务器端发出信息,指明后面的数据通讯将使用的步骤⑤中的主密码为对称密钥,同时通知服务器客户端的握手过程结束。

  ⑦服务器向客户端发出信息,指明后面的数据通讯将使用的步骤⑤中的主密码为对称密钥,同时通知客户端服务器端的握手过程结束。

  ⑧SSL 的握手部分结束,SSL 安全通道的数据通讯开始,客户和服务器开始使用相同的对称密钥进行数据通讯,同时进行通讯完整性的检验。


 


 1. 生成密钥库,密钥库中必须存放私钥和证书,此外为私钥设置的密码应该和密钥库的密码相同。服务器程序将自动从密钥库中提取证书,向客户程序表明自己是谁。

keytool -genkey -alias mytest -keyalg RSA -keysize 1024 -keystore mykeystore -validity 4000

 

2. 客户端欲和SSL服务器通信,则必须信任SSL服务器程序所使用的数字证书。因此客户程序应该将所信任的证书放在一个密钥库中,指定客户信任哪些证书,这样当其接收到服务器程序发来的证书后就可以判断是否相信服务器。

keytool -export -alias mytest -file mytest.cer -keystore mykeystore -storepass 123456 -rfc

keytool  -import -alias mytest -file  mytest.cer -keystore clienttrust

 

Server端的程序:

 

 

Java代码  收藏代码
  1. import java.io.PrintStream;  
  2. import java.net.ServerSocket;  
  3. import java.net.Socket;  
  4.   
  5. import javax.net.ssl.SSLServerSocketFactory;  
  6.   
  7. /** 
  8.  * SSL server 
  9.  * SSL编程和基于Socket的编程不同的地方在于其ServerSocket对象是通过一个特殊的对象:SSLServerSocketFactory类型的对象创建的, 
  10.  * 这样以后的输入和输出流将自动按照SSL协议指定的方法交换密钥并对数据进行加密。 
  11.  *  
  12.  * @author jimmee 
  13.  */  
  14. public class MySSLServer {  
  15.     public static void main(String args[]) throws Exception {  
  16.         System.setProperty("javax.net.ssl.keyStore""mykeystore");  
  17.         System.setProperty("javax.net.ssl.keyStorePassword""123456");  
  18.         SSLServerSocketFactory ssf = (SSLServerSocketFactory) SSLServerSocketFactory  
  19.                 .getDefault();  
  20.         ServerSocket ss = ssf.createServerSocket(5432);  
  21.         System.out.println("Waiting for connection...");  
  22.         while (true) {  
  23.             Socket s = ss.accept();  
  24.             PrintStream out = new PrintStream(s.getOutputStream());  
  25.             out.println("Hi");  
  26.             out.close();  
  27.             s.close();  
  28.         }  
  29.     }  
  30. }  
 

 

 

 

 

Client的程序:

 

Java代码  收藏代码
  1. import java.net.*;  
  2. import java.io.*;  
  3. import javax.net.ssl.*;  
  4.   
  5. /** 
  6.  * SSL client程序 
  7.  *  
  8.  * <p> 
  9.  * SSL客户端编程和基于Socket的客户端编程不同的地方在于其Socket对象是通过一个特殊 
  10.  * 的对象:SSLSocketFactory类型的对象创建的。 
  11.  *  
  12.  * 由于clienttrust中存放的只是可以公开的证书,因此程序中不需要给出密钥库的密码。 
  13.  *  
  14.  * @author jimmee 
  15.  * 
  16.  */  
  17. public class MySSLClient {  
  18.     public static void main(String args[]) throws Exception {  
  19.         System.setProperty("javax.net.ssl.trustStore""clienttrust");  
  20.   
  21.         SSLSocketFactory ssf = (SSLSocketFactory) SSLSocketFactory.getDefault();  
  22.         Socket s = ssf.createSocket("127.0.0.1"5432);  
  23.         BufferedReader in = new BufferedReader(new InputStreamReader(  
  24.                 s.getInputStream()));  
  25.         String x = in.readLine();  
  26.         System.out.println(x);  
  27.         in.close();  
  28.     }  
  29. }  
  30.   
  31. import java.io.BufferedReader;  
  32. import java.io.InputStreamReader;  
  33. import java.net.Socket;  
  34. import java.security.SecureRandom;  
  35. import java.security.cert.CertificateException;  
  36. import java.security.cert.X509Certificate;  
  37.   
  38. import javax.net.ssl.SSLContext;  
  39. import javax.net.ssl.SSLSocketFactory;  
  40. import javax.net.ssl.TrustManager;  
  41. import javax.net.ssl.X509TrustManager;  
  42.   
  43. /** 
  44.  * client端也可以选择不验证证书,直接通信 
  45.  *  
  46.  * @author jimmee 
  47.  *  
  48.  */  
  49. public class MyClientNoValidate {  
  50.   
  51.     public static void main(String[] args) {  
  52.         // Create a trust manager that does not validate certificate chains  
  53.         TrustManager[] trustAllCerts = new TrustManager[] { new X509TrustManager() {  
  54.             public void checkClientTrusted(  
  55.                     java.security.cert.X509Certificate[] arg0, String arg1)  
  56.                     throws CertificateException {  
  57.             }  
  58.   
  59.             public void checkServerTrusted(  
  60.                     java.security.cert.X509Certificate[] arg0, String arg1)  
  61.                     throws CertificateException {  
  62.             }  
  63.   
  64.             public java.security.cert.X509Certificate[] getAcceptedIssuers() {  
  65.                 return new X509Certificate[0];  
  66.             }  
  67.         } };  
  68.   
  69.         // Install the all-trusting trust manager  
  70.         try {  
  71.             SSLContext sc = SSLContext.getInstance("SSL");  
  72.             sc.init(null, trustAllCerts, new SecureRandom());  
  73.             SSLSocketFactory ssf = sc.getSocketFactory();  
  74.             Socket s = ssf.createSocket("127.0.0.1"5432);  
  75.             BufferedReader in = new BufferedReader(new InputStreamReader(  
  76.                     s.getInputStream()));  
  77.             String x = in.readLine();  
  78.             System.out.println(x);  
  79.             in.close();  
  80.         } catch (Exception e) {  
  81.         }  
  82.     }  
  83. }  
 

 

 

https:

Server端:

 

Java代码  收藏代码
  1. import java.net.*;  
  2. import java.io.*;  
  3.   
  4. import javax.net.ssl.*;  
  5.   
  6. /** 
  7.  * https 
  8.  *  
  9.  * @author jimmee 
  10.  * 
  11.  */  
  12.   
  13. public class MyHttpsServer {  
  14.     public static void main(String args[]) {  
  15.         int i = 0;  
  16.         try {  
  17.             System.setProperty("javax.net.ssl.keyStore""mykeystore");  
  18.             System.setProperty("javax.net.ssl.keyStorePassword""123456");  
  19.             SSLServerSocketFactory ssf = (SSLServerSocketFactory) SSLServerSocketFactory  
  20.                     .getDefault();  
  21.             ServerSocket ss = ssf.createServerSocket(443);  
  22.             System.out.println("Web Server OK ");  
  23.   
  24.             while (true) {  
  25.                 Socket s = ss.accept(); // 等待请求  
  26.                 PrintStream out = new PrintStream(s.getOutputStream());  
  27.                 BufferedReader in = new BufferedReader(new InputStreamReader(  
  28.                         s.getInputStream()));  
  29.                 String info = null;  
  30.                 while ((info = in.readLine()) != null) {  
  31.                     System.out.println("now got " + info);  
  32.                     if (info.equals(""))  
  33.                         break;  
  34.                 }  
  35.   
  36.                 System.out.println("now go");  
  37.                 out.println("HTTP/1.0 200 OK");  
  38.                 out.println("MIME_version:1.0");  
  39.                 out.println("Content_Type:text/html");  
  40.                 i++;  
  41.                 String c = "<html> <head></head><body> <h1> Hi,  this is " + i  
  42.                         + "</h1></Body></html>";  
  43.                 out.println("Content_Length:" + c.length());  
  44.                 out.println("");  
  45.                 out.println(c);  
  46.                 out.close();  
  47.                 s.close();  
  48.                 in.close();  
  49.             }  
  50.         } catch (IOException e) {  
  51.             System.out.println(e);  
  52.         }  
  53.     }  
  54. }  

 

 

client端:

 

Java代码  收藏代码
  1. import java.io.BufferedReader;  
  2. import java.io.InputStreamReader;  
  3. import java.net.URL;  
  4. import java.net.URLConnection;  
  5. import java.security.SecureRandom;  
  6. import java.security.cert.CertificateException;  
  7. import java.security.cert.X509Certificate;  
  8.   
  9. import javax.net.ssl.HostnameVerifier;  
  10. import javax.net.ssl.HttpsURLConnection;  
  11. import javax.net.ssl.SSLContext;  
  12. import javax.net.ssl.SSLSession;  
  13. import javax.net.ssl.TrustManager;  
  14. import javax.net.ssl.X509TrustManager;  
  15.   
  16. /** 
  17.  * https的client选择不验证证书,直接通信 
  18.  *  
  19.  * @author jimmee 
  20.  *  
  21.  */  
  22. public class MyHttpsClientNoValidate {  
  23.   
  24.     public static void main(String[] args) {  
  25.         // Create a trust manager that does not validate certificate chains  
  26.         TrustManager[] trustAllCerts = new TrustManager[] { new X509TrustManager() {  
  27.             public void checkClientTrusted(  
  28.                     java.security.cert.X509Certificate[] arg0, String arg1)  
  29.                     throws CertificateException {  
  30.             }  
  31.   
  32.             public void checkServerTrusted(  
  33.                     java.security.cert.X509Certificate[] arg0, String arg1)  
  34.                     throws CertificateException {  
  35.             }  
  36.   
  37.             public java.security.cert.X509Certificate[] getAcceptedIssuers() {  
  38.                 return new X509Certificate[0];  
  39.             }  
  40.         } };  
  41.           
  42.         // Ignore differences between given hostname and certificate hostname  
  43.         HostnameVerifier hv = new HostnameVerifier() {  
  44.             public boolean verify(String hostname, SSLSession session) {  
  45.                 return true;  
  46.             }  
  47.         };  
  48.   
  49.         // Install the all-trusting trust manager  
  50.         try {  
  51.             SSLContext sc = SSLContext.getInstance("SSL");  
  52.             sc.init(null, trustAllCerts, new SecureRandom());  
  53.             HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());  
  54.             HttpsURLConnection.setDefaultHostnameVerifier(hv);  
  55.               
  56.             URL url = new URL("https://127.0.0.1");  
  57.             URLConnection con = url.openConnection();  
  58.             BufferedReader in = new BufferedReader(new InputStreamReader(  
  59.                     con.getInputStream()));  
  60.             String x = in.readLine();  
  61.             System.out.println(x);  
  62.             in.close();  
  63.         } catch (Exception e) {  
  64.             e.printStackTrace();  
  65.         }  
  66.     }  

  1. }  
转载:http://jimmee.iteye.com/blog/2070990

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/463862.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

N32替换STM32,这些细节别忽略!

前言目前大形势影响&#xff0c;芯片价格日益上涨&#xff0c;采购周期变长&#xff0c;导致国产芯片替代进口芯片成为大趋势&#xff0c;该文章记录了使用国民技术的N32替换STM32的操作流程。话不多说&#xff0c;上步骤。一、工程配置1.安装硬件库硬件库为厂家提供的资料&…

五分钟读懂UML类图

平时阅读一些远吗分析类文章或是设计应用架构时没少与UML类图打交道。实际上&#xff0c;UML类图中最常用到的元素五分钟就能掌握&#xff0c;下面赶紧来一起认识一下它吧&#xff1a; 一、类的属性的表示方式 在UML类图中&#xff0c;类使用包含类名、属性(field) 和方法(meth…

只会纯硬件,让我有点慌

纯硬件产品在市面上现在很少了&#xff0c;大多都带有单片机&#xff0c;比如智能路灯&#xff0c;智能门禁&#xff0c;智能家居等等。为了提高竞争力&#xff0c;单片机相关知识的学习必不可少。给大家推荐一本龙顺宇老师的新书《深入浅出STC8增强型51单片机进阶攻略》。&…

NSLog的常用格式说明小释

NSLog的格式如下所示: % 对象%d, %i整数%u 无符整形%f 浮点/双字 %.nf 带有n小数点的浮点/双字%x, %X二进制整数%o 八进制整数%zu size_t %p 指针%e 浮点/双字 (科学计算) %g 浮点/双字%s C字符串%.*s Pascal字符串%c 字符%C unichar %lld 64位长整数(long long) %llu 无符64位…

感觉自己好傻

前几天&#xff0c;一个微信微信朋友找我聊天。他在一家公司工作了4年多&#xff0c;但是这四年基本没有什么技术上的提升&#xff0c;做的事情也一些打杂的事情&#xff0c;核心技术在芯片原厂&#xff0c;软件SDK也是别人写好的&#xff0c;他能做的就是对接客户&#xff0c;…

图形处理单元(GPU)的演进

CPU 和 GPU好久没有更新了&#xff0c;最近在阅读 CUDA 相关的一些论文&#xff0c;因为都是碎片化阅读&#xff0c;容易导致读过后&#xff0c;可能过一段时间又忘记掉&#xff0c;所以决定抽时间翻译翻译阅读的论文&#xff0c;一方面增强自己记忆&#xff0c;一方面与大家共…

TCP通信过程大讨论

转载地址&#xff1a;http://www.cricode.com/3568.html 本文通过两个图来梳理TCP-IP协议相关知识。TCP通信过程包括三个步骤&#xff1a;建立TCP连接通道&#xff0c;传输数据&#xff0c;断开TCP连接通道。如图1所示&#xff0c;给出了TCP通信过程的示意图。 图1 TCP 三次握手…

Android 自定义View以及ValueAnimator学习

2019独角兽企业重金招聘Python工程师标准>>> 看了ApiDemo里面的BoucingBall&#xff0c;觉得挺好的&#xff0c;所以特地学习了一下&#xff0c;将代码注释后贴到这里&#xff0c;以便以后学习。 class BallView extends View implements ValueAnimator.AnimatorUpd…

固件工程师到底是干什么?

大家好&#xff0c;我是写代码的篮球球痴可能大家还不知道&#xff0c;我是一个写固件的工程师&#xff0c;今天和一个微信朋友聊天&#xff0c;他问我工作几年了&#xff0c;我说我工作10年了&#xff0c;而且这10年我都一直在从事嵌入式固件相关的工作。他猛的觉得很不可思议…

如何实现按键的短按、长按检测?

在电子产品中经常用到按键&#xff0c;尤其是经常需要MCU判断短按和长按这两种动作&#xff0c;本篇我们来专门聊下这个话题。只谈理论太无聊&#xff0c;我们还是结合着实际应用来说明。之前写过一篇关于《CH573第一篇&#xff1a;实现自拍杆蓝牙遥控器1》的文章&#xff0c;例…

博士也会毕业吗?

怪我读书少&#xff0c;一直以来我都认为博士是一种很神奇的物种&#xff0c;他们能学会很多我们学不会的东西&#xff0c;那些奇奇怪怪的数学题&#xff0c;还有那种要背上几天的思想政治课文&#xff0c;以及要听懂那种像鸟儿一样呼唤的讲课&#xff0c;所以&#xff0c;我一…

国外出差见闻之印度

前段时间到印度的马德拉斯市出差了3个月(4月到6月)&#xff0c;今天终于有时间将自己的出差心得和见闻记录下来&#xff0c;可能以后就会忘记。下午16:00时在深圳坐车到香港机场&#xff0c;上车没多久会让填一个入境香港的单子&#xff0c;然后是过海关&#xff0c;过海关时会…

雷军的演讲以及产品发布

8月11号是小米的发布会&#xff0c;还有雷军的年度演讲。因为工作冲突我没看直播&#xff0c;晚上回来看了公众号文章和知乎上的内容讨论&#xff0c;也看了发布的新产品。雷军那个年代能够做上程序员一定是非常牛逼的人&#xff0c;而雷军是这些牛逼人的公司总经理&#xff0c…

轻松理解UML用例图时序图类图的教程

摘自https://zhuanlan.zhihu.com/p/29874146 写在前面 当你老大扔给你这样的图&#xff0c;或者你需要完成某些功能而去看文档的时候发现以下类似这样的图会不会不&#xff08;一&#xff09;知&#xff08;脸&#xff09;所&#xff08;懵&#xff09;措&#xff08;逼&#x…

[Winodows Phone 7控件详解]控件拾遗

1.Panorama控件和Pivot控件前面讲过&#xff0c;没有必要再重复一遍了。参见我的博文&#xff1a;http://www.cnblogs.com/DebugLZQ/archive/2012/03/19/2406284.html 2.DeepZoom DeepZoom 是silverlight的特色功能之一&#xff0c;也同样被加到了windows phone 7中来。这个功能…

这个工具替代Notepad++,我很满意

用过notepad的人并且还一直坚持使用它的人一定觉得它是一个非常优秀的软件&#xff0c;这个软件用来看日志&#xff0c;看代码和文档非常方便&#xff0c;而且里面还集成了一个HEX分析的工具&#xff0c;当然还有列模式等等。不吹牛啊&#xff0c;很多软件只做到了功能&#xf…

Kubectl 部署有状态应用(下)

接上文 《Kubectl 部署有状态应用&#xff08;上&#xff09;》创建完StatefulSet后&#xff0c;本文继续介绍StatefulSet 扩展、更新、删除等内容。 StatefulSet 中的 Pod 验证序数索引和稳定的网络身份 StatefulSet 中的 Pod 具有唯一的序数索引和稳定的网络身份。 查看 …

收集的50家国产MCU信息

全球MCU市场多为欧美、日本和台湾地区企业占据&#xff0c;仅欧企恩智浦、美企Microchip、美企ST、欧企英飞凌就占据超80%的份额&#xff0c;TI、Nuvoton、罗姆、三星、东芝五家企业占据11.4%&#xff0c;而中国大陆企业所占份额6.5%不到。这意味着&#xff0c;留给中国本土供应…

Silverlight实用窍门系列:63.Silverlight中的Command,自定义简单Command

在Silverlight中的MVVM模式下将前台页面和ViewModel界面交互分离开是通过本节所要讲述的Command实现的。我们自定义一个Command需要继承于ICommand接口并且实现这个接口。它有CanExecute()、Execute()方法和CanExecuteChanged事件组成。 CanExecute()&#xff1a;判断是否继续执…