《Java网络编程精解讲义15.ppt》由会员分享,可在线阅读,更多相关《Java网络编程精解讲义15.ppt(54页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、Java网络编程精解作者:孙卫琴作者:孙卫琴作者:孙卫琴作者:孙卫琴参考书籍:参考书籍:参考书籍:参考书籍:技术支持网址:技术支持网址:技术支持网址:技术支持网址:www.javathinker.orgwww.javathinker.org第15章 安全网络通信 参考Java网络编程精解的第15章n15.1 SSL简介n15.1.1 加密通信n15.1.2 安全证书n15.1.3 SSL握手n15.1.4 创建自我签名的安全证书n15.2 JSSE简介n15.3 创建基于SSL的安全服务器和安全客户 15.1 SSL简介nSSL(Server Socket Layer)是一种保证网络上的两个节
2、点进行安全通信的协议。nIETF(Internet Engineering Task Force)对SSL作了标准化,制订了RFC2246规范,并将其称为TLS(Transport Layer Security)。n从技术上讲,目前的TLS1.0与SSL3.0的差别非常微小。15.1 SSL简介建立在SSL协议上的HTTP被称为HTTPS协议。HTTP使用的默认端口为80,而HTTPS使用的默认端口为443。15.1 SSL简介n用户在网上商店购物,当他输入信用卡信息,进行网上支付交易时,存在以下不安全因素:n用户的信用卡信息在网络上传输时有可能被他人截获。n用户发送的信息在网络上传输时可能被
3、非法篡改,数据完整性被破坏。n用户正在访问的Web站点是个非法站点,专门从事网上欺诈活动,比如骗取客户的资金。nSSL采用加密技术来实现安全通信,保证通信数据的保密性和完整性,并且保证通信双方可以验证对方的身份。15.1.1 加密通信n加密技术的基本原理是:n数据从一端发送到另一端时,发送者先对数据加密,然后再把它发送给接收者。这样,在网络上传输的是经过加密的数据。n如果有人在网络上非法截获了这批数据,由于没有解密的密钥,就无法获得真正的原始数据。n接收者接收到加密的数据后,先对数据解密,然后再处理。15.1.1 加密通信15.1.2 安全证书n除了对数据加密通信,SSL还采用了身份认证机制,
4、确保通信双方都可以验证对方的真实身份。nSSL通过安全证书来证明客户或服务器的身份。当客户通过安全的连接和服务器通信时,服务器会先向客户出示它的安全证书,这个证书声明该服务器是安全的而且的确是这个服务器。n每一个证书在全世界范围内都是惟一的,其他非法服务器无法假冒原始服务器的身份。n可以把安全证书比作电子身份证。15.1.2 安全证书n获取安全证书有两种方式:n一种方式是从权威机构购买证书。n还有一种方式是创建自我签名的证书。15.1.2 安全证书1从权威机构获得证书n安全证书可以有效的保证通信双方的身份的可信性。安全证书采用加密技术制作而成,他人几乎无法伪造。安全证书由国际权威的证书机构(C
5、A,Certificate Authority)如VeriSign()和Thawte()颁发,它们保证了证书的可信性。n申请安全证书时,必须支付一定的费用。一个安全证书只对一个IP地址有效。15.1.2 安全证书n2创建自我签名证书n在某些场合,通信双方只关心数据在网络上可以安全传输,并不需要对方进行身份验证,在这种情况下,可以创建自我签名(self-assign)的证书,比如通过Sun公司提供的keytool工具就可以创建这样的证书。15.1.3 SSL握手n安全证书既包含了用于加密数据的密钥,又包含了用于证实身份的数字签名。n安全证书采用公钥加密技术。n公钥加密是指使用一对非对称的密钥进行
6、加密或解密。每一对密钥由公钥和私钥组成。公钥被广泛发布。私钥是隐密的,不公开。用公钥加密的数据只能够被私钥解密。反过来,使用私钥加密的数据只能被公钥解密。15.1.3 SSL握手n客户与服务器通信时,首先要进行SSL握手,SSL握手主要完成以下任务:n协商使用的加密套件。加密套件中包括一组加密参数,这些参数指定了加密算法和密钥的长度等信息。n验证对方的身份。此操作是可选的。n确定使用的加密算法。15.1.4 创建自我签名的安全证书nSun公司提供了制作证书的工具keytool。在JDK1.4以上版本中包含了这一工具,它的位置为:binkeytool.exe,此外,也可以到以下站点单独下载key
7、tool:http:/ mystore-keyalg RSA-keystore C:test.keys15.1.4 创建自我签名的安全证书nkeytool命令将生成包含一对非对称密钥和自我签名的证书,这个命令中的参数的意思为:ngenkey:生成一对非对称密钥。nalias:指定密钥对的别名,该别名是公开的。nkeyalg:指定加密算法,本例中采用通用的RSA算法。nkeystore:指定安全证书的存放路径。15.2 JSSE简介nJSSE封装了底层复杂的安全通信细节,使得开发人员能方便的利用它来开发安全的网络应用程序。nJSSE主要包括四个包:.ssl包:包括进行安全通信的类,比如SSLSe
8、rverSocket和SSLSocket类。包:包括安全套接字的工厂类,比如SSLServerSocketFactory和SSLSocketFactory类。njava.security.cert包:包括处理安全证书的类,如X509Certificate类。X.509是由国际电信联盟(ITU-T)制定的安全证书的标准。.ssl包:包括SUN公司提供的JSSE的实现类。15.2 JSSE简介nJSSE具有以下重要特征:n纯粹用Java语言编写。n可以出口到大多数国家。n提供了支持SSL2.0和SSL3.0的JSSE API,,并且提供了SSL 3.0 的JSSE实现。n提供了支持TLS1.0的J
9、SSE API和JSSE实现。n提供了用于创建安全连接的类,如SSLSocket、SSLServerSocket和SSLEngine。n支持加密通信。n支持客户端和服务器端的身份验证。n支持SSL会话。n支持一些常用的加密算法,比如RSA(加密长度2048位)、RC4(密钥长度128位)和DH(密钥长度1024位)。15.2 JSSE简介图15-3 JSSE API的主要类框图15.2 JSSE简介nJSSE中负责安全通信的最核心的类是SSLServerSocket类与SSLSocket类,它们分别是ServerSocket与Socket类的子类。nSSLSocket对象由SSLSocketF
10、actory创建,此外,SSLServerSocket的accept()方法也会创建SSLSocket。nSSLServerSocket对象由SSLServerSocketFactory创建。nSSLSocketFactory、SSLServerSocketFactory以及SSLEngine对象都由SSLContext对象创建。nSSLEngine类用于支持非阻塞的安全通信。15.2 JSSE简介n例程15-1的HTTPSClient类的createSocket()方法创建了采用SSL协议的SSLSocket对象。public void createSocket()throws Except
11、ion factory=(SSLSocketFactory)SSLSocketFactory.getDefault();socket=(SSLSocket)factory.createSocket(host,port);String supported=socket.getSupportedCipherSuites();socket.setEnabledCipherSuites(supported);15.2.1 KeyStore、KeyManager与TrustManager类n在进行安全通信时,要求客户端与服务器端都支持SSL或TCL协议。n客户端与服务器端可能都需要设置用于证实自身身份的
12、安全证书,还要设置信任对方的哪些安全证书。15.2.1 KeyStore、KeyManager与TrustManager类nKeyStore类用于存放安全证书。以下程序代码创建了一个KeyStore对象,它从test.keys文件中加载安全证书。String passphrase=654321;/JKS是SUN支持的KeyStore的类型KeyStore keyStore=KeyStore.getInstance(JKS);char password=passphrase.toCharArray();/password参数用于打开安全证书keyStore.load(new FileInputS
13、tream(test.keys),password);15.2.1 KeyStore、KeyManager与TrustManager类nKeyManager接口的任务是选择用于证实自身身份的安全证书,把它发送给对方。KeyManagerFactory负责创建KeyManager对象,例如:KeyManagerFactory keyManagerFactory=KeyManagerFactory.getInstance(SunX509);keyManagerFactory.init(keyStore,password);KeyManager keyManagers=keyManagerFacto
14、ry.getKeyManagers();15.2.1 KeyStore、KeyManager与TrustManager类nTrustManager接口的任务是决定是否信任对方的安全证书。nTruesManagerFactory负责创建TrustManager对象,例如:TrustManagerFactory trustManagerFactory=TrustManagerFactory.getInstance(SunX509);trustManagerFactory.init(keyStore);TrustManager trustManagers=trustManagerFactory.ge
15、tTrustManagers();15.2.2 SSLContext类nSSLContext类负责设置与安全通信有关的各种信息,比如使用的协议(SSL或者TLS),自身的安全证书以及对方的安全证书。SSLContext还负责构造SSLServerSocketFactory、SSLSocketFactory和SSLEngine对象。n以下程序代码创建并初始化了一个SSLContext对象,然后由它创建了一个SSLServerSocketFactory对象:SSLContext sslCtx=SSLContext.getInstance(TLS);/采用TLS协议sslCtx.init(kmf.g
16、etKeyManagers(),tmf.getTrustManagers(),null);SSLServerSocketFactory ssf=sslCtx.getServerSocketFactory();15.2.3 SSLServerSocketFactory类nSSLServerSocketFactory类负责创建SSLServerSocket对象:SSLServerSocket serverSocket=(SSLServerSocket)sslServerSocketFactory.createServerSocket(8000);/监听端口8000nSSLServerSocketF
17、actory对象有两种创建方法:n(1)调用SSLContext类的getServerSocketFactory()方法。n(2)调用SSLServerSocketFactory类的静态getDefault()方法。15.2.4 SSLSocketFactory类nSSLSocketFactory类负责创建SSLSocket对象:SSLSocket socket=(SSLSocket)sslSocketFactory.createSocket(localhost,8000);nSSLSocketFactory对象有两种创建方法:n(1)调用SSLContext类的getSocketFactor
18、y()方法。n(2)调用SSLSocketFactory类的静态getDefault()方法。15.2.5 SSLSocket类nSSLSocket类是Socket类的子类,因此两者的用法有许多相似之处。nSSLSocket类还具有与安全通信有关的方法:n1设置加密套件n2.处理握手结束事件n3.管理SSL会话n4客户端模式15.2.5 SSLSocket类1设置加密套件nSSLSocket类的getSupportedCipherSuites()方法返回一个字符串数组,它包含当前SSLSocket对象所支持的加密套件组。nSSLSocket类的setEnabledCipherSuites(St
19、ring suites)方法设置当前SSLSocket对象的可使用的加密套件组。n可使用的加密套件组应该是所支持的加密套件组的子集。15.2.5 SSLSocket类n以下代码仅仅启用了具有高加密强度的加密套件,这可以提高该通信端的安全性,禁止那些不支持强加密的通信端连接当前通信端:String strongSuites=SSL_DES_DSS_WITH_3DES_EDE_CBC_SHA,SSL_RSA_WITH_RC4_128_MD5,SSL_RSA_WITH_RC4_128_SHA,SSL_RSA_WITH_3DES_EDE_CBC_SHA;sslSocket.setEnabledCiph
20、erSuites(strongSuites);15.2.5 SSLSocket类2 用于处理握手结束事件nSSL握手需要花很长的时间,当SSL握手完成,会发出一个HandshakeCompletedEvent事件,该事件由HandshakeCompletedListener负责监听。nSSLSocket类的addHandshakeCompletedListener()方法负责注册HandshakeCompletedListener监听器。15.2.5 SSLSocket类nHandshakeCompletedEvent类提供了获取与握手事件相关的信息的方法:npublic SSLSession
21、 getSession()/获得会话npublic String getCipherSuite()/获得实际使用的加密套件npublic SSLSocket getSocket()/获得发出该事件的套接字nHandshakeCompletedListener接口的以下方法负责处理握手结束事件public void handshakeCompleted(HandshakeCompletedEvent event)15.2.5 SSLSocket类3.SSLSocket类用于管理SSL会话n为了提高安全通信的效率,SSL协议允许多个SSLSocket共享同一个SSL会话。n在同一个会话中,只有第一
22、个打开的SSLSocket需要进行SSL握手,负责生成密钥以及交换密钥,其余的SSLSocket都共享密钥信息。15.2.5 SSLSocket类nSSLSession接口表示SSL会话,它具有以下方法:nbyte getId()/获得会话ID。每个会话都有惟一的IDnString getCipherSuite()/获得实际使用的加密套件nlong getCreationTime()/获得创建会话的时间nlong getLastAccessedTime()/获得最近一次访问会话的时间。访问会话是指程序创建一个使用n该会话的SSLSocket。nString getPeerHost()/获得通信
23、对方的主机nint getPeerPort()/获得通信对方的端口nvoid invalidate()/使会话失效nboolean isValid()/判断会话是否有效15.2.5 SSLSocket类nSSLSocket的getSession()方法返回SSLSocket所属的会话。nSSLSocket的setEnableSessionCreation(boolean flag)方法决定SSLSocket是否允许创建新的会话。flag参数的默认值为true。n如果flag参数为true,那么对于新创建的SSLSocket,如果当前已经有可用的会话,就直接加入该会话,如果没有可用的会话,就创建
24、一个新的会话。n如果flag为false参数,那么对于新创建的SSLSocket,如果当前已经有可用的会话,就直接加入该会话,如果没有可用的会话,那么该SSLSocket无法与对方进行安全通信。15.2.5 SSLSocket类nSSLSocket的startHandshake()方法显式的执行一次SSL握手。该方法具有以下用途:n使得会话使用新的密钥。n使得会话使用新的加密套件。n重新开始一个会话。为了保证不重用原先的会话,应该先将原先的会话失效:socket.getSession().invalidate();socket.startHandshake();15.2.5 SSLSocket
25、类4客户端模式n由于多数情况下客户端无需向服务器证实自己的身份,因此当一个通信端无需向对方证实自己身份,就称它处于客户模式,否则称它处于服务器模式。nSSLSocket的setUseClientMode(boolean mode)方法用来设置客户模式或者服务器模式。n如果mode参数为true,就表示客户模式,即无需向对方证实自己的身份;n如果mode参数为false,就表示服务器模式,即需要向对方证实自己的身份。15.2.5 SSLSocket类n当SSLSocket处于服务器模式,还可以通过以下方法来决定是否要求对方提供身份认证:nsetWantClientAuth(boolean wan
26、t):当want参数为true,表示希望对方提供身份认证。如果对方未出示安全证书,连接不会中断,通信继续进行。nsetNeedClientAuth(boolean need):当need参数为true,表示要求对方必须提供身份认证。如果对方未出示安全证书,连接中断,通信无法继续。15.2.6 SSLServerSocket类nSSLServerSocket类是ServerSocket类的子类,因此两者的用法有许多相似之处。n此外,SSLServerSocket类还具有与安全通信有关的方法。这些方法与SSLSocket类中的同名方法具有相同的作用。15.2.6 SSLServerSocket类n
27、1设置加密套件的方法如下:nString getSupportedCipherSuites():返回一个字符串数组,它包含当前SSLServerSocket对象所支持的加密套件组。nvoid setEnabledCipherSuites(String suites):设置当前SSLServerSocket对象可使用的加密套件组。nString getEnabledCipherSuites():返回一个字符串数组,它包含当前SSLServerSocket对象可使用的加密套件组。15.2.6 SSLServerSocket类n2管理SSL会话的方法如下:nvoid setEnableSession
28、Creation(boolean flag):决定由当前SSLServerSocket对象创建的SSLSocket对象是否允许创建新的会话。nboolean getEnableSessionCreation():判断由当前SSLServerSocket对象创建的SSLSocket对象是否允许创建新的会话。15.2.6 SSLServerSocket类n3设置客户端模式的方法如下:nvoid setUseClientMode(boolean mode):当mode参数为true,表示客户端模式。nvoid setWantClientAuth(boolean want):当want参数为true,
29、表示希望对方提供身份认证。nvoid setNeedClientAuth(boolean need):当need参数为true,表示要求对方必须提供身份认证。15.2.7 SSLEngine类nSSLEngine类与SocketChannel类联合使用,就能实现非阻塞的安全通信。nSSLEngine类封装了与安全通信有关的细节,把应用程序发送的应用数据打包为网络数据,打包就是指对应用数据进行加密,加入SSL握手数据,把它变为网络数据。nSSLEngine类还能把接收到的网络数据展开为应用数据,展开就是指对网络数据解密。nSSLEngine类的wrap()方法负责打包应用数据,unwrap()方
30、法负责展开网络数据。15.2.7 SSLEngine类n在图15-4中,SocketChannel类负责发送和接收网络数据,SSLEngine类负责网络数据与应用数据之间的转换。15.2.7 SSLEngine类nSSLEngine类的wrap()以及unwrap()方法都返回一个SSLEngineResult对象,它描述执行wrap()或unwrap()方法的结果。nSSLEngineResult类的getHandshakeStatus()方法返回SSL握手的状态,如果取值为HandshakeStatus.NEED_TASK,表明握手没有完成,应该继续完成握手任务:if(result.get
31、HandshakeStatus()=HandshakeStatus.NEED_TASK)Runnable runnable;while(runnable=engine.getDelegatedTask()!=null)runnable.run();15.3 创建基于SSL的安全服务器和安全客户n例程15-4的EchoServer类创建了一个基于SSL的安全服务器,它处于服务器模式。nEchoServer类先创建了SSLContext对象,然后由它创建SSLServerSocketFactory对象,再由该工厂对象创建SSLServerSocket对象。n对于以下程序代码:System.out.
32、println(serverSocket.getUseClientMode()?客户模式:服务器模式);System.out.println(serverSocket.getNeedClientAuth()?需要验证对方身份:不需要需要验证对方身份);n打印结果为:服务器模式不需要验证对方身份15.3 创建基于SSL的安全服务器和安全客户n例程15-5的EchoClient类创建了一个基于SSL的安全客户,它处于客户模式。nEchoClient类先创建了一个默认的SSLSocketFactory对象,然后由它创建了SSLSocket对象。对于以下程序代码:System.out.println(
33、socket.getUseClientMode()?客户模式:服务器模式);n打印结果为:客户模式15.3 创建基于SSL的安全服务器和安全客户nEchoClient类依靠TrustManager来决定是否信任EchoServer出示的安全证书。nEchoClient类的SSLSocketFactory对象是按默认方式创建的。n默认的SSLSocketFactory对象使用默认的SSLContext对象,而默认的SSLContext对象使用默认的TrustManager对象,默认的TrustManager对象使用默认的KeyStore对象,默认的KeyStore对象首先根据系统属性.ssl.t
34、rustStore来加载可信任的安全证书。练习题1n问题问题:JSSE支持哪些协议?支持哪些协议?n选项选项:na)FTPnb)SSLnc)TLSnd)HTTPn答案答案:b,c练习题2n问题:问题:SSL协议位于哪个层?协议位于哪个层?n选项选项:na)网络层网络层nb)应用层应用层nc)传输层传输层nd)安全套节字层安全套节字层n答案答案:d练习题3n问题:以下哪些属于问题:以下哪些属于SSL协议的内容?协议的内容?n选项选项:na)验证通信对方的身份验证通信对方的身份nb)保证数据的可靠传输,数据不会丢失保证数据的可靠传输,数据不会丢失nc)对网络上传输的数据加密对网络上传输的数据加密n
35、d)保证不会接收到乱序的数据包保证不会接收到乱序的数据包n答案答案:a,c练习题4n问题:问题:以下哪些类的对象可以直接由以下哪些类的对象可以直接由SSLContextSSLContext创建?创建?n选项选项:na)SSLServerSocketFactorynb)SSLSocketFactorync)SSLEnginend)SSLSocketne)KeyStoren答案答案:a,b,c练习题5n问题:问题:在在SSLSSL协议中,什么叫客户模式协议中,什么叫客户模式?n选项选项:na)当一个通信端作为客户程序运行,就称它处于客户当一个通信端作为客户程序运行,就称它处于客户模式。模式。nb)
36、当一个通信端无需向对方证实自己身份,就称它处当一个通信端无需向对方证实自己身份,就称它处于客户模式。于客户模式。nc)当一个通信端要求对方必须提供身份验证,就称它当一个通信端要求对方必须提供身份验证,就称它处于客户模式。处于客户模式。nd)如果一个通信端处于服务器模式,那么另一端就处如果一个通信端处于服务器模式,那么另一端就处于客户模式。于客户模式。n答案答案:b练习题6n问题:问题:关于关于TrustManagerTrustManager,以下哪些说法正确?以下哪些说法正确?n选项选项:na)TrustManager用来证实自己的身份。用来证实自己的身份。nb)TrustManager用来验证对方的身份。用来验证对方的身份。nc)如果通信方如果通信方A要求验证通信方要求验证通信方B的身份时,通信方的身份时,通信方A的程序中必须创建的程序中必须创建TrustManager。nd)如果通信方如果通信方A要求验证通信方要求验证通信方B的身份时,通信方的身份时,通信方B的程序中必须创建的程序中必须创建TrustManager。n答案答案:b,c