《安全网络通信》由会员分享,可在线阅读,更多相关《安全网络通信(69页珍藏版)》请在金锄头文库上搜索。
1、Java网络程序设计,安全网络通信,SSL简介 JSSE简介 创建基于SSL的安全服务器和安全客户,主要内容,SSL简介,SSL(Server Socket Layer)是一种保证网络上的两个节点进行安全通信的协议。 IETF(Internet Engineering Task Force)对SSL作了标准化,制订RFC2246规范,并将其称为TLS(Transport Layer Security)。 从技术上讲,目前的TLS1.0与SSL3.0的差别非常微小。,SSL简介,建立在SSL协议上的HTTP被称为HTTPS协议。HTTP使用默认端口为80,而HTTPS使用默认端口为443。,SS
2、L简介,用户在网上商店购物,当输入信用卡信息,进行网上支付交易时,存在以下不安全因素: (1) 信用卡信息在网络上传输时有可能被他人截获。 (2)用户发送的信息在网络上传输时可能被非法篡改,数据完整性被破坏。 (3)用户正在访问非法Web站点,专门从事网上欺诈活动,比如骗取客户的资金。,SSL采用加密技术实现安全通信,保证通信数据的保密性和完整性,并且保证通信双方可以验证对方的身份。,加密通信,数据从一端发送到另一端时,发送者先对数据加密,然后再把它发送给接收者。这样,在网络上传输的是经过加密的数据。 如果有人在网络上非法截获这批数据,由于没有解密的密钥,就无法获得真正的原始数据。 接收者接收
3、到加密的数据后,先对数据解密,然后再处理。,加密通信示意图,安全证书,除了对数据加密通信,SSL还采用身份认证机制,确保通信双方都可以验证对方的真实身份。 SSL通过安全证书证明客户或服务器的身份。 当客户通过安全连接和服务器通信时,服务器会先向客户出示它的安全证书,这个证书声明该服务器是安全的而且的确是这个服务器。,安全证书,每一个证书在全世界范围内都是惟一的,其他非法服务器无法假冒原始服务器的身份。 可以把安全证书比作电子身份证。,获取安全证书的两种方式,方式一:从权威机构购买证书。 方式二:创建自我签名的证书。,从权威机构获得证书,安全证书可以有效的保证通信双方的身份的可信性。安全证书采
4、用加密技术制作,他人几乎无法伪造。 安全证书由国际权威的证书机构(CA,Certificate Authority)如VeriSign()和Thawte()颁发,它们保证证书的可信性。 申请安全证书时,必须支付一定的费用。一个安全证书只对一个IP地址有效。,公钥加密,安全证书既包含用于加密数据的密钥,又包含用于证实身份的数字签名。 安全证书采用公钥加密技术。 公钥加密是指使用一对非对称的密钥进行加密或解密。每一对密钥由公钥和私钥组成。 公钥被广泛发布。私钥是隐密的,不公开。用公钥加密的数据只能够被私钥解密。反过来,使用私钥加密的数据只能被公钥解密。,创建自我签名证书,某些场合下,通信双方只关心
5、数据在网络上可以安全传输,并不需要对方进行身份验证。 这种情况下,可以创建自我签名(self-assign)的证书,比如通过Sun公司提供的keytool工具就可以创建这样的证书。,制作证书的工具keytool,JDK1.4以上版本中包含这一工具,它的位置为:binkeytool.exe,此外,也可以到以下站点单独下载keytool:http:/ 通过keytool工具创建证书的命令为: keytool -genkey -alias mystore -keyalg RSA -keystore C:test.keys,keytool命令将生成包含一对非对称密钥和自我签名的证书,命令中参数的意思:
6、 genkey: 生成一对非对称密钥。 alias: 指定密钥对的别名,该别名是公开的。 keyalg: 指定加密算法,本例中采用通用的RSA算法。 keystore: 指定安全证书的存放路径。,SSL握手,客户与服务器通信时,首先要进行SSL握手。 SSL握手主要完成: (1)协商使用的加密套件。 加密套件中包括一组加密参数,这些参数指定加密算法和密钥的长度等信息。 (2)验证对方的身份。此操作是可选的。 (3)确定使用的加密算法。,SSL简介 JSSE简介 创建基于SSL的安全服务器和安全客户,主要内容,JSSE(Java Secure Socket Extension),JSSE封装底层
7、复杂的安全通信细节,使开发人员能方便的利用它开发安全的网络应用程序。,JSSE主要包括四个包: (1).ssl包:包括进行安全通信的类,如SSLServerSocket和SSLSocket类。 (2)包:包括安全套接字的工厂类,如SSLServerSocketFactory和SSLSocketFactory类。 (3)java.security.cert包:包括处理安全证书的类,如X509Certificate类。X.509是由国际电信联盟(ITU-T)制定的安全证书的标准。 (4).ssl包:包括SUN公司提供的JSSE的实现类。,JSSE具有以下特征,纯粹用Java语言编写。 可以出口到大
8、多数国家。 提供支持SSL2.0和SSL3.0的JSSE API,,并且提供SSL 3.0 的JSSE实现。 提供支持TLS1.0的JSSE API和JSSE实现。 提供用于创建安全连接的类,如SSLSocket、SSLServerSocket和SSLEngine。,JSSE具有以下特征,支持加密通信。 支持客户端和服务器端的身份验证。 支持SSL会话。 支持一些常用加密算法,比如RSA(加密长度2048位)、RC4(密钥长度128位)和DH(密钥长度1024位)。,JSSE API的主要类框图,JSSE中负责安全通信的最核心类是SSLServerSocket类与SSLSocket类,它们分别
9、是ServerSocket与Socket类的子类。 SSLSocket对象由SSLSocketFactory创建; SSLServerSocket的accept()方法也会创建SSLSocket。 SSLServerSocket对象由SSLServerSocketFactory创建。 SSLSocketFactory、SSLServerSocketFactory以及SSLEngine对象都由SSLContext对象创建。 SSLEngine类用于支持非阻塞的安全通信。,下列createSocket()方法创建采用SSL协议的SSLSocket对象。public void createSocke
10、t()throws Exception factory= (SSLSocketFactory)SSLSocketFactory.getDefault(); socket=(SSLSocket)factory.createSocket(host,port); Stringsupported= socket.getSupportedCipherSuites(); socket.setEnabledCipherSuites(supported);,C/S安全管理,在进行安全通信时,要求客户端与服务器端都支持SSL或TCL协议。 客户端与服务器端可能都需要设置用于证实自身身份的安全证书,还要设置信任对
11、方的哪些安全证书。,KeyStore类,存放安全证书。以下程序创建一个KeyStore对象,它从test.keys文件中加载安全证书。 String passphrase = “654321“; /JKS是SUN支持的KeyStore的类型 KeyStore keyStore = KeyStore.getInstance(“JKS“); char password = passphrase.toCharArray(); /password参数用于打开安全证书 keyStore.load(new FileInputStream(“test.keys“), password);,KeyManage
12、r类,选择证实自身身份的安全证书,把它发送给对方。 KeyManagerFactory负责创建KeyManager对象,如: KeyManagerFactory keyManagerFactory = KeyManagerFactory.getInstance(“SunX509“); keyManagerFactory.init(keyStore, password); KeyManager keyManagers= keyManagerFactory.getKeyManagers();,TrustManager类,决定是否信任对方的安全证书。 TruesManagerFactory负责创建T
13、rustManager对象,如: TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance(“SunX509“); trustManagerFactory.init(keyStore); TrustManager trustManagers= trustManagerFactory.getTrustManagers();,SSLContext类,设置与安全通信有关的各种信息,如使用的协议(SSL或者TLS),自身的安全证书以及对方的安全证书。 SSLContext还负责构造SSLServerSocketF
14、actory、SSLSocketFactory和SSLEngine对象。,以下程序创建并初始化一个SSLContext对象,然后由它创建一个SSLServerSocketFactory对象: SSLContext sslCtx = SSLContext.getInstance(“TLS“); /采用TLS协议 sslCtx.init(kmf.getKeyManagers(), tmf.getTrustManagers(), null); SSLServerSocketFactory ssf=sslCtx.getServerSocketFactory();,SSLServerSocketFact
15、ory类,负责创建SSLServerSocket对象: SSLServerSocket serverSocket = (SSLServerSocket) sslServerSocketFactory.createServerSocket(8000); /监听端口8000,SSLServerSocketFactory对象有两种创建方法: (1)调用SSLContext类的getServerSocketFactory()方法。 (2)调用SSLServerSocketFactory类的静态getDefault()方法。,SSLSocketFactory类,负责创建SSLSocket对象: SSLS
16、ocket socket =(SSLSocket) sslSocketFactory.createSocket(“localhost“,8000); SSLSocketFactory对象有两种创建方法: (1)调用SSLContext类的getSocketFactory()方法。 (2)调用SSLSocketFactory类的静态getDefault()方法。,SSLSocket类,SSLSocket类是Socket类的子类,因此两者用法有许多相似之处。 SSLSocket类具有与安全通信有关的方法: (1) 设置加密套件 (2) 处理握手结束事件 (3) 管理SSL会话 (4) 客户端模式,