




已阅读5页,还剩2页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
用SSL和JSSE API创建安全的网络应用程序李清勇 2002-6-10 14:12:30一、SSL概述我们从各式各样的文章中得知,SSL可以用于保密的传输,这样我们与web server之间传输的消息便是“安全的”。但是这种“安全”究竟是怎么实现的,最终又能实现哪些保密功能?让我们先简单学习一下SSL的相关内容。11 SSL的整体结构SSL是一个用来保证安全传输文件的协议。这种由Netscape公司开发的协议是通过在浏览器软件(比如Internet Explorer、Netacpe Navigator)和WWW服务器建立一条安全通道,从而实现在internet中传输保密的文件。在TCP/IP协议族中,SSL位于TCP层之上,应用层之下。这使它可以独立与应用层,从而使应用层协议可以直接建立在SSL上。其大致位置如下:如果利用SSL协议来访问网页,其步骤如下:用户:在浏览器的地址栏里输入HTTP层:将用户需求翻译成HTTP请求,如GET /index.htm HTTP/1.1Host SSL层: 借助下层协议的的信道安全的协商出一份加密密钥,并用此密钥来加密HTTP请求。TCP层:与web server的443端口建立连接,传递SSL处理后的数据。接收端与此过程相反(具体过程表述略)。SSL在TCP之上建立了一个加密通道,通过这一层的数据经过了加密,因此达到保密的效果。12 SSL协议的组成和协商过程SSL协议分为两部分:Handshake Protocol和Record Protocol。其中Handshake Protocol用来协商密钥,协议的大部分内容就是通信双方如何利用它来安全的协商出一份密钥,SSL握手协议准许服务器端与客户端在开始传输数据前,能够通过特定的加密算法相互鉴别。 Record Protocol则定义了传输的格式。在SSL层的协商过程中,SSL缺省只进行server端的认证,客户端的认证是可选的。以下是其流程图(摘自TLS协议):简单的说便是:SSL客户端(也是TCP的客户端)在TCP链接建立之后,发出一个ClientHello来发起握手,这个消息里面包含了自己可实现的算法列表和其它一些需要的消息,SSL的服务器端会回应一个ServerHello,这里面确定了这次通信所需要的算法,然后发过去自己的证书(里面包含了身份和自己的公钥)。Client在收到这个消息后会生成一个秘密消息,用SSL服务器的公钥加密后传过去,SSL服务器端用自己的私钥解密后,会话密钥协商成功,双方可以用同一份会话密钥来通信了。13 SSL协议的功能SSL主要解决以下三个安全性方面的重要论题:提供认证服务,认证服务保证会话实体身份的合法性。提供加密服务,SSL保证第三方不能破译在两个实体之间的通讯内容。保证数据的完整性。SSL使用MAC (message authentication code)保证两个实体之间的通讯内容没有被第三方篡改。SSL主要依靠公钥加密方法和私钥加密方法,它用私钥加密方法对应用程序之间的大块通讯内容进行加密。SSL提供理想的方案,因为私钥加密方法既安全又速度快。公钥加密比私钥加密速度要慢,但是对于认证和钥匙交换来说是更好的选择。二、JSSE API 学习了SSL协议的主要内容后,读者自然会问我们怎样实现SSL协议的复杂功能?下面我们就来学习怎样用JSSE在我们的应用程序中添加SSL技术。JSSE提供在你的应用程序上添加SSL的所有必要技术。它包括RSA (Rivest-Shamir-Adleman)加密支持,RSA加密技术是因特网上事实上的安全标准。它还实现了SSL 3.0 (当前的SSL标准)以及TLS (Transport Layer Security) 1.0它是SSL的下一代版本。JSSE当然还提供创建和使用安全套接字的API集。JAVA安全框架主要使用工厂(Factory)设计模式。Factory设计模式使用一个特殊的factory 对象构造实例,而不是直接调用他们的构造函数。在JSSE中,什么事情都是从工厂(Factory) 开始;这里有SSL套接字的工厂(Factory)和SSL 服务器套接字工厂(Factory)。因为通用套接字和服务器套接字是JAVA网络程序设计的基础,本文假定读者对这两个类很熟悉,知道它们的用途和区别。如果你不熟悉或是说没有概念的话,我建议你找一本关于Java网络编程的书籍学习一下再看本文。21 SSLSocketF.ssl.SSLSocketFactory类中的方法主要有三类。第一类包括一个静态方法,它返回缺省的SSL套接字工厂:static SocketFactory getDefault()。第二类包括四个方法,它们继承自.SocketFactory类,对应.Socket类中的四个主要构造函数。每一个方法都返回一个SSL套接字:Socket createSocket(String host, int port) Socket createSocket(String host, int port, InetAddress clientHost, int clientPort) Socket createSocket(InetAddress host, int port) Socket createSocket(InetAddress host, int port, InetAddress clientHost, int clientPort) Socket createSocket(Socket socket, String host, int port, boolean autoClose)第三类方法包括两个方法,它们返回缺省实现的SSL密码组件列表,和SSL支持的密码组件完全列表:String getDefaultCipherSuites() String getSupportedCipherSuites()密码组件是SSL中为实现一定安全性而定义的加密算法的组合。密码组件定义连接是否需要加密,是否核实通讯内容的完整性,以及认证怎样服务进行等。22 SSLServerSocketF.ssl.SSLServerSocketFactory类中的方法也主要有三类。第一类包括一个静态方法,它返回缺省的SSL服务器套接字工厂:static ServerSocketFactory getDefault()。下面这些方法返回SSL服务器套接字,对应于.ServerSocket类中的构造函数:ServerSocket createServerSocket(int port) ServerSocket createServerSocket(int port, int backlog) ServerSocket createServerSocket(int port, int backlog, InetAddress address)最后,SSLServerSocketFactory也含有这样的两方法,它们分别返回缺省实现的密码组件列表和实际支持的密码组件列表,分别是:String getDefaultCipherSuites() String getSupportedCipherSuites()可见,这些API函数都是很容易的。23 SSLSocket在.ssl.SSLSocket类中的东西很有意思。我假定读者对这个类的父类(socket类)提供的方法很熟悉,因此,这里主要关注与SSL相关的函数。与两个SSL工厂类一样,下面列出的两个方法分别返回SSL实现的和支持的密码组件。第三个方法设置实现的密码组件。应用程序可以使用第三个操作去提高或者降低它能允许的安全服务范围:String getEnabledCipherSuites() String getSupportedCipherSuites() void setEnabledCipherSuites(String suites)下面的两各方法决定套接字能否创建新的SSL sessions,它保存在连接之间的连接细节,比如公共密钥:boolean getEnableSessionCreation() void setEnableSessionCreation(boolean flag)下面两个方法决定套接字是否需要客户端认证。这个方法只有在调用服务器套接字模式才有意义。记住,针对SSL规格说明书,客户端认证是可选的。例如,很多Web应用服务就不需要客户端认证:boolean getNeedClientAuth() void setNeedClientAuth(boolean need)下面的这个方法把套接字从客户端模型变换成服务器端模型。这影响谁发动SSL握手和谁要先进行认证:boolean getUseClientMode() void setUseClientMode(boolean mode)方法void startHandshake()开始一个SSL握手。这有可能在一个已有的连接中开始一个新的握手,但并不普遍。方法SSLSession getSession()返回一个SSL会话。你很少需要直接使用SSL session。下面两个方法是添加和移走一个SSL 握手监听器对象。当一个套接字上SSL握手操作完成时,握手监听器对象会被通知。void addHandshakeCompletedListener(HandshakeCompletedListener listener) void removeHandshakeCompletedListener(HandshakeCompletedListener listener)24 SSLServerS.ssl.SSLServerSocket类与.ssl.SSLSocket类很相似;它不需要什么特别的注意。实际上,.ssl.SSLServerSocket类所包含的方法集合是.ssl.SSLSocket类中方法的子集。下表列出的前两个方法返回实现的和支持的SSL密码组件。第三个方法设置实现的密码组件:String getEnabledCipherSuites() String getSupportedCipherSuites() void setEnabledCipherSuites(String suites)下面两个方法控制服务器套接字是否能创建新的SSL会话:boolean getEnableSessionCreation() void setEnableSessionCreation(boolean flag)下面两个方法决定接受的套接字是否需要客户端认证:boolean getNeedClientAuth() void setNeedClientAuth(boolean flag)下面的方法把接受的套接字从客户端模式转换成服务器断模式:boolean getUseClientMode() void setUseClientMode(boolean flag)三、一个简单的例子为了让读者有个比较全面的了解,我在下面给出简单服务器和兼容的客户端程序的源代码。它是我们在很多网络教材中常见的回应程序的具有安全性的变体。在服务器中用JSSE创建一个安全服务套接字。它在服务器套接字中监听从安全客户端发来的连接请求。当运行这个服务器时,你必须指定使用的密钥库。密钥库包括服务器的证书。我在这里创建了一个简单的密钥库,它只包含一个证书。(见参考资料)import java.io.InputStream;import java.io.InputStreamReader;import java.io.BufferedReader;import java.io.IOException;import .ssl.SSLSocket;import .ssl.SSLServerSocket;import .ssl.SSLServerSocketFactory;publicclass EchoServerpublic static void main(String arstring)trySSLServerSocketFactory sslserversocketfactory =(SSLServerSocketFactory)SSLServerSocketFactory.getDefault();SSLServerSocket sslserversocket =(SSLServerSocket)sslserversocketfactory.createServerSocket(9999);SSLSocket sslsocket = (SSLSocket)sslserversocket.accept();InputStream inputstream = sslsocket.getInputStream();InputStreamReader inputstreamreader = new InputStreamReader(inputstream);BufferedReader bufferedreader = new BufferedReader(inputstreamreader);String string = null;while (string = bufferedreader.readLine() != null)System.out.println(string);System.out.flush();catch (Exception exception)exception.printStackTrace();用下面的命令开始这个服务器(richer 既是密钥库的文件名又是它的密码):java -D.ssl.keyStore=richer -D.ssl.keyStorePassword=richer EchoServer下面是客户端程序,它用JSSE实现和服务器的安全连接。为了运行这个客户程序你必须指定使用的证书库,它包括被信任的证书列表。我创建了一个简单的证书库,它只包含一个证书(见参考资料):import java.io.InputStream;import java.io.OutputStream;import java.io.InputStreamReader;import java.io.OutputStreamWriter;import java.io.BufferedReader;import java.io.BufferedWriter;import java.io.IOException;import .ssl.SSLSocket;import .ssl.SSLSocketFactory;publicclass EchoClientpublic static void main(String arstring)trySSLSocketFactory sslsocketfactory = (SSLSocketFactory)SSLSocketFactory.getDefault();SSLSocket sslsocket = (SSLSocket)sslsocketfactory.createSocket(localhost, 9999);InputStream inputstream = System.in;InputStreamReader inputstreamreader = new InputStreamReader(inputstream);BufferedReader bufferedr
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 安阳市2024-2025学年八年级下学期语文期中模拟试卷
- 阿拉善盟2025-2026学年八年级下学期语文月考模拟试卷
- 安徽省滁州市南谯区2023-2024学年高三上学期第二次月考化学考题及答案
- PSH的识别与护理课件
- 2025 年小升初清远市初一新生分班考试数学试卷(带答案解析)-(人教版)
- 广东省广州市2025年高中“古诗文积累与阅读竞赛”初赛试题(语文)
- 教师教学2025工作总结
- 社区消防知识培训课件信息
- 2024-2025学年山东省潍坊市寒亭区青岛版五年级下册期中测试数学试卷(含答案)
- 房子首付合同范本
- 证券行业风险管理信息系统建设方案
- 《你当像鸟飞往你的山》读书分享读书分享笔记
- 维护国家安全构建平安校园
- DB31-T 1308-2021 粉尘爆炸重大事故隐患治理工程验收规范
- 五育并举课题开题报告
- 养血生发胶囊与生活方式干预结合-洞察分析
- 第5周-七年级上册数学人教版(2024)每周测验(含答案)
- 完善校企合作的组织架构与制度保障策略
- 《颈肩痛与腰腿痛》课件
- 立邦刷新服务合同模板
- 《税费计算与申报》教学教案
评论
0/150
提交评论