安全网络通信

上传人:hs****ma 文档编号:574456460 上传时间:2024-08-16 格式:PPT 页数:69 大小:342.50KB
返回 下载 相关 举报
安全网络通信_第1页
第1页 / 共69页
安全网络通信_第2页
第2页 / 共69页
安全网络通信_第3页
第3页 / 共69页
安全网络通信_第4页
第4页 / 共69页
安全网络通信_第5页
第5页 / 共69页
点击查看更多>>
资源描述

《安全网络通信》由会员分享,可在线阅读,更多相关《安全网络通信(69页珍藏版)》请在金锄头文库上搜索。

1、Java网络程序设计网络程序设计安全网络通信安全网络通信 lSSL简介简介lJSSE简介简介l创建基于创建基于SSL的安全服务器和安全客户的安全服务器和安全客户主要内容SSL简介lSSL(Server Socket Layer)是一种保证)是一种保证网络上的网络上的两个节点进行安全通信两个节点进行安全通信的协议。的协议。lIETF(Internet Engineering Task Force)对)对SSL作了标准化,制订作了标准化,制订RFC2246规范,并将其称为规范,并将其称为TLS(Transport Layer Security)。)。l从技术上讲,目前的从技术上讲,目前的TLS1.

2、0与与SSL3.0的差别非常的差别非常微小。微小。SSL简介建立在建立在SSL协议上的协议上的HTTP被称为被称为HTTPS协议。协议。HTTP使用默认端口为使用默认端口为80,而,而HTTPS使用默认端使用默认端口为口为443。SSL简介l用户在网上商店购物,当输入信用卡信息,进行网用户在网上商店购物,当输入信用卡信息,进行网上支付交易时,存在以下不安全因素:上支付交易时,存在以下不安全因素:(1) 信用卡信息在网络上传输时有可能被他人截获。信用卡信息在网络上传输时有可能被他人截获。(2)用户发送的信息在网络上传输时可能被非法篡改,用户发送的信息在网络上传输时可能被非法篡改,数据完整性被破坏

3、。数据完整性被破坏。(3)用户正在访问非法用户正在访问非法Web站点,专门从事网上欺诈站点,专门从事网上欺诈活动,比如骗取客户的资金。活动,比如骗取客户的资金。SSL采用采用加密技术加密技术实现安全通信,保证通信数实现安全通信,保证通信数据的保密性和完整性,并且保证通信双方可以据的保密性和完整性,并且保证通信双方可以验证对方的身份。验证对方的身份。加密通信l数据从一端发送到另一端时,发送者先对数据加密,数据从一端发送到另一端时,发送者先对数据加密,然后再把它发送给接收者。这样,在网络上传输的然后再把它发送给接收者。这样,在网络上传输的是经过加密的数据。是经过加密的数据。l如果有人在网络上非法截

4、获这批数据,由于没有解如果有人在网络上非法截获这批数据,由于没有解密的密钥,就无法获得真正的原始数据。密的密钥,就无法获得真正的原始数据。l接收者接收到加密的数据后,先对数据解密,然后接收者接收到加密的数据后,先对数据解密,然后再处理。再处理。加密通信示意图示意图安全证书l除了对数据加密通信,除了对数据加密通信,SSL还采用还采用身份认证身份认证机制,机制,确保通信双方都可以验证对方的真实身份。确保通信双方都可以验证对方的真实身份。lSSL通过安全证书通过安全证书证明客户或服务器的身份证明客户或服务器的身份。当客户通过安全连接和服务器通信时,服务器会先当客户通过安全连接和服务器通信时,服务器会

5、先向客户出示它的安全证书,这个证书声明该服务器向客户出示它的安全证书,这个证书声明该服务器是安全的而且的确是这个服务器。是安全的而且的确是这个服务器。安全证书l每一个证书在全世界范围内都是惟一的,其他非每一个证书在全世界范围内都是惟一的,其他非法服务器无法假冒原始服务器的身份。法服务器无法假冒原始服务器的身份。l可以把安全证书比作电子身份证。可以把安全证书比作电子身份证。获取安全证书获取安全证书的两种方式l方式一:从权威机构购买证书。方式一:从权威机构购买证书。l方式二:创建自我签名的证书。方式二:创建自我签名的证书。从权威机构获得证书l安全证书可以有效的保证通信双方的身份的可信性。安全证书可

6、以有效的保证通信双方的身份的可信性。安全证书采用加密技术制作,他人几乎无法伪造。安全证书采用加密技术制作,他人几乎无法伪造。l安全证书由国际权威的证书机构(安全证书由国际权威的证书机构(CA,Certificate Authority)如)如VeriSign()和()和Thawte()颁发,它()颁发,它们保证证书的可信性。们保证证书的可信性。l申请安全证书时,必须支付一定的费用。一个安全申请安全证书时,必须支付一定的费用。一个安全证书只对一个证书只对一个IP地址有效。地址有效。公钥加密l安全证书既包含用于安全证书既包含用于加密数据的密钥加密数据的密钥,又包含用于,又包含用于证实身份的数字签名

7、证实身份的数字签名。l安全证书采用安全证书采用公钥加密公钥加密技术。技术。l公钥加密公钥加密是指使用是指使用一对非对称的密钥进行加密或解一对非对称的密钥进行加密或解密密。每一对密钥由公钥和私钥组成。每一对密钥由公钥和私钥组成。公钥被广泛发布。私钥是隐密的,不公开。用公钥公钥被广泛发布。私钥是隐密的,不公开。用公钥加密的数据只能够被私钥解密。反过来,使用私钥加密的数据只能够被私钥解密。反过来,使用私钥加密的数据只能被公钥解密。加密的数据只能被公钥解密。创建自我签名证书l某些场合下,通信双方只关心数据在网络上可以某些场合下,通信双方只关心数据在网络上可以安全传输,并不需要对方进行身份验证。安全传输

8、,并不需要对方进行身份验证。这种情况下,可以创建这种情况下,可以创建自我签名自我签名(self-assign)的)的证书,比如通过证书,比如通过Sun公司提供的公司提供的keytool工具就可以工具就可以创建这样的证书。创建这样的证书。制作证书的工具keytoollJDK1.4以上版本中包含这一工具,它的位置为:以上版本中包含这一工具,它的位置为:binkeytool.exe,此外,也可以到,此外,也可以到以下站点单独下载以下站点单独下载keytool: l通过通过keytool工具创建证书的命令为工具创建证书的命令为:keytool -genkey -alias mystore -keyal

9、g RSA -keystore C:test.keys keytool命令将生成包含一对非对称密钥和自命令将生成包含一对非对称密钥和自我签名的证书,命令中参数的意思:我签名的证书,命令中参数的意思:lgenkey: 生成一对非对称密钥。生成一对非对称密钥。lalias: 指定密钥对的别名,该别名是公开的。指定密钥对的别名,该别名是公开的。lkeyalg: 指定加密算法,本例中采用通用的指定加密算法,本例中采用通用的RSA算法。算法。lkeystore: 指定安全证书的存放路径。指定安全证书的存放路径。SSL握手l客户与服务器通信时,首先要进行客户与服务器通信时,首先要进行SSL握手握手。lSS

10、L握手主要完成:握手主要完成:(1)协商使用的加密套件协商使用的加密套件。加密套件中包括一组加密参数,这些参数指定加密加密套件中包括一组加密参数,这些参数指定加密算法和密钥的长度等信息。算法和密钥的长度等信息。(2)验证对方的身份验证对方的身份。此操作是可选的。此操作是可选的。(3)确定使用的加密算法确定使用的加密算法。lSSL简介简介lJSSE简介简介l创建基于创建基于SSL的安全服务器和安全客户的安全服务器和安全客户主要内容JSSE(Java Secure Socket Extension)lJSSE封装底层复杂的安全通信细节,使开发人员能封装底层复杂的安全通信细节,使开发人员能方便的利用

11、它开发安全的网络应用程序。方便的利用它开发安全的网络应用程序。lJSSE主要包括四个包:主要包括四个包:(1).ssl包:包括进行安全通信的类,如包:包括进行安全通信的类,如SSLServerSocket和和SSLSocket类。类。(2)包:包括安全套接字的工厂类,如包:包括安全套接字的工厂类,如SSLServerSocketFactory和和SSLSocketFactory类。类。 (3)java.security.cert包:包括处理安全证书的类,包:包括处理安全证书的类,如如X509Certificate类。类。X.509是由国际电信联盟是由国际电信联盟(ITU-T)制定的安全证书的标

12、准。)制定的安全证书的标准。(4).ssl包:包括包:包括SUN公司提供的公司提供的JSSE的的实现类。实现类。JSSE具有以下特征具有以下特征l纯粹用纯粹用Java语言编写。语言编写。l可以出口到大多数国家。可以出口到大多数国家。 l提供支持提供支持SSL2.0和和SSL3.0的的JSSE API,,并且提供,并且提供SSL 3.0 的的JSSE实现。实现。l提供支持提供支持TLS1.0的的JSSE API和和JSSE实现。实现。l提供用于创建安全连接的类,如提供用于创建安全连接的类,如SSLSocket、SSLServerSocket和和SSLEngine。JSSE具有以下特征具有以下特征

13、l支持加密通信。支持加密通信。 l支持客户端和服务器端的身份验证。支持客户端和服务器端的身份验证。 l支持支持SSL会话。会话。 l支持一些常用加密算法,比如支持一些常用加密算法,比如RSA(加密长度(加密长度2048位)、位)、RC4(密钥长度(密钥长度128位)和位)和DH(密钥长度(密钥长度1024位)。位)。 JSSE API的主要类框图的主要类框图lJSSE中负责安全通信的最核心类是中负责安全通信的最核心类是SSLServerSocket类与类与SSLSocket类,它们分别是类,它们分别是ServerSocket与与Socket类的子类。类的子类。lSSLSocket对象对象由由S

14、SLSocketFactory创建创建; SSLServerSocket的的accept()方法也会创建方法也会创建SSLSocket。lSSLServerSocket对象由对象由SSLServerSocketFactory创创建。建。 lSSLSocketFactory、SSLServerSocketFactory以及以及SSLEngine对象都由对象都由SSLContext对象创建。对象创建。lSSLEngine类用于支持非阻塞的安全通信。类用于支持非阻塞的安全通信。l下列下列createSocket()方法创建采用方法创建采用SSL协议的协议的SSLSocket对象。对象。 public

15、 void createSocket()throws Exceptionfactory=(SSLSocketFactory)SSLSocketFactory.getDefault();socket=(SSLSocket)factory.createSocket(host,port);Stringsupported=socket.getSupportedCipherSuites();socket.setEnabledCipherSuites(supported); C/S安全管理安全管理l在进行安全通信时,要求客户端与服务器端都支持在进行安全通信时,要求客户端与服务器端都支持SSL或或TCL协议

16、。协议。l客户端与服务器端可能都需要设置用于证实自身身客户端与服务器端可能都需要设置用于证实自身身份的安全证书,还要设置信任对方的哪些安全证书。份的安全证书,还要设置信任对方的哪些安全证书。KeyStore类类l存放安全证书存放安全证书。以下程序创建一个。以下程序创建一个KeyStore对象,对象,它从它从test.keys文件中加载安全证书。文件中加载安全证书。String passphrase = 654321;/JKS是是SUN支持的支持的KeyStore的类型的类型KeyStore keyStore = KeyStore.getInstance(JKS); char password

17、= passphrase.toCharArray();/password参数用于打开安全证书参数用于打开安全证书keyStore.load(new (test.keys), password); KeyManager类类l选择选择证实自身身份的安全证书证实自身身份的安全证书,把它发送给对方。,把它发送给对方。KeyManagerFactory负责创建负责创建KeyManager对象,如:对象,如:KeyManagerFactory keyManagerFactory = KeyManagerFactory.getInstance(SunX509);keyManagerFactory.init(

18、keyStore, password);KeyManager keyManagers= keyManagerFactory.getKeyManagers();TrustManager类类l决定是否信任对方的安全证书决定是否信任对方的安全证书。lTruesManagerFactory负责创建负责创建TrustManager对象,对象,如:如:TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance(SunX509);trustManagerFactory.init(keyStore);TrustManage

19、r trustManagers= trustManagerFactory.getTrustManagers();SSLContext类类l设置与安全通信有关的各种信息设置与安全通信有关的各种信息,如使用的协议,如使用的协议(SSL或者或者TLS),自身的安全证书以及对方的安),自身的安全证书以及对方的安全证书。全证书。SSLContext还负责构造还负责构造SSLServerSocketFactory、SSLSocketFactory和和SSLEngine对象。对象。l以下程序创建并初始化一个以下程序创建并初始化一个SSLContext对象,然后对象,然后由它创建一个由它创建一个SSLServ

20、erSocketFactory对象:对象:SSLContext sslCtx = SSLContext.getInstance(TLS); /采用采用TLS协议协议sslCtx.init(kmf.getKeyManagers(), tmf.getTrustManagers(), null);SSLServerSocketFactory ssf=sslCtx.getServerSocketFactory();SSLServerSocketFactory类类l负责创建负责创建SSLServerSocket对象:对象:SSLServerSocket serverSocket =(SSLServerS

21、ocket) sslServerSocketFactory.createServerSocket(8000); /监听端口监听端口8000lSSLServerSocketFactory对象有两种创建方法:对象有两种创建方法:(1)调用)调用SSLContext类的类的getServerSocketFactory()方法。方法。(2)调用)调用SSLServerSocketFactory类的静态类的静态getDefault()方法。方法。SSLSocketFactory类类l负责创建负责创建SSLSocket对象:对象:SSLSocket socket =(SSLSocket)sslSocket

22、Factory.createSocket(localhost,8000);lSSLSocketFactory对象有两种创建方法:对象有两种创建方法:(1)调用)调用SSLContext类的类的getSocketFactory()方法。方法。(2)调用)调用SSLSocketFactory类的静态类的静态getDefault()方法。方法。SSLSocket类类lSSLSocket类是类是Socket类的子类,因此两者用类的子类,因此两者用法有许多相似之处。法有许多相似之处。lSSLSocket类具有与安全通信有关的方法类具有与安全通信有关的方法:(1) 设置加密套件设置加密套件(2) 处理握手

23、结束事件处理握手结束事件(3) 管理管理SSL会话会话(4) 客户端模式客户端模式设置加密套件设置加密套件lSSLSocket类的类的getSupportedCipherSuites()方法返方法返回一个字符串数组,包含当前回一个字符串数组,包含当前SSLSocket对象所支对象所支持的加密套件组。持的加密套件组。lSSLSocket类的类的setEnabledCipherSuites(String suites)方法设置当前方法设置当前SSLSocket对象的可使用加密对象的可使用加密套件组。套件组。l可使用的加密套件组应该是所支持的加密套件组的可使用的加密套件组应该是所支持的加密套件组的子

24、集。子集。l以下代码启用具有以下代码启用具有高加密强度的加密套件高加密强度的加密套件,可以提,可以提高该通信端的安全性,禁止那些不支持强加密的通高该通信端的安全性,禁止那些不支持强加密的通信端连接当前通信端:信端连接当前通信端: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. setEnabledCipherSuites(strongSuites) ;处理握

25、手结束事件处理握手结束事件lSSL握手需要花费很长时间,当握手需要花费很长时间,当SSL握手完成,会握手完成,会发出一个发出一个HandshakeCompletedEvent事件,该事事件,该事件由件由HandshakeCompletedListener负责监听。负责监听。lSSLSocket类的类的addHandshakeCompletedListener()方法负责注册方法负责注册HandshakeCompletedListener监监听器。听器。lHandshakeCompletedEvent类提供获取与握手事件相类提供获取与握手事件相关的信息的方法:关的信息的方法:(1)public

26、SSLSession getSession() /获得会话获得会话(2)public String getCipherSuite() /获得实际使用的获得实际使用的加密套件加密套件(3)public SSLSocket getSocket() /获得发出该事件的获得发出该事件的套接字套接字lHandshakeCompletedListener接口的以下方法负责处接口的以下方法负责处理握手结束事件理握手结束事件: public void handshakeCompleted (HandshakeCompletedEvent event)SSLSocket类用于管理类用于管理SSL会话会话:l为了

27、提高安全通信的效率,为了提高安全通信的效率,SSL协议允许多个协议允许多个SSLSocket共享同一个共享同一个SSL会话。会话。l在同一个会话中,只有第一个打开的在同一个会话中,只有第一个打开的SSLSocket需要进行需要进行SSL握手,负责生成密钥握手,负责生成密钥以及交换密钥,其余的以及交换密钥,其余的SSLSocket都共享密钥都共享密钥信息。信息。lbyte getId() /获得会话获得会话ID。每个会话都有惟一的。每个会话都有惟一的IDlString getCipherSuite() /获得实际使用的加密套件获得实际使用的加密套件llong getCreationTime()

28、/获得创建会话的时间获得创建会话的时间llong getLastAccessedTime() /获得最近一次访问会话的时间。访问会话是指程序获得最近一次访问会话的时间。访问会话是指程序创建一个使用该会话的创建一个使用该会话的SSLSocket。lString getPeerHost() /获得通信对方的主机获得通信对方的主机lint getPeerPort() /获得通信对方的端口获得通信对方的端口lvoid invalidate() /使会话失效使会话失效lboolean isValid() /判断会话是否有效判断会话是否有效SSLSession接口接口表示表示SSL会话会话lSSLSock

29、et的的getSession() 返回返回SSLSocket所属会话。所属会话。lSSLSocket的的setEnableSessionCreation(boolean flag) 决定决定SSLSocket是否允许创建新会话。是否允许创建新会话。flag参数默认参数默认值为值为true。(1)如果如果flag为为true,对于新创建的,对于新创建的SSLSocket,如果,如果当前已经有可用会话,就直接加入该会话,如果当前已经有可用会话,就直接加入该会话,如果没有可用会话,就创建一个新会话。没有可用会话,就创建一个新会话。(2)如果如果flag为为false,对于新创建的,对于新创建的SSL

30、Socket,如果,如果当前已经有可用会话,就直接加入该会话,如果当前已经有可用会话,就直接加入该会话,如果没有可用会话,那么该没有可用会话,那么该SSLSocket无法与对方进行无法与对方进行安全通信。安全通信。lSSLSocket的的startHandshake() 显式执行一次显式执行一次SSL握握手。该方法用途:手。该方法用途:(1)使得会话使用新的密钥。使得会话使用新的密钥。(2)使得会话使用新的加密套件。使得会话使用新的加密套件。(3)重新开始一个会话。为了保证不重用原先的会话,重新开始一个会话。为了保证不重用原先的会话,应该先将原先的会话失效:应该先将原先的会话失效:socket

31、.getSession().invalidate();socket.startHandshake();客户端模式l多数情况下客户端无需向服务器证实自己的身份。多数情况下客户端无需向服务器证实自己的身份。当一个通信端无需向对方证实自己身份当一个通信端无需向对方证实自己身份,就称,就称它处它处于客户模式于客户模式,否则称,否则称它处于服务器模式它处于服务器模式。lSSLSocket的的setUseClientMode(boolean mode) 设置设置客户模式或者服务器模式。客户模式或者服务器模式。l如果如果mode参数为参数为true,表示客户模式,即无需向,表示客户模式,即无需向对方证实自己

32、的身份;对方证实自己的身份;l如果如果mode参数为参数为false,表示服务器模式,即需要,表示服务器模式,即需要向对方证实自己的身份。向对方证实自己的身份。l当当SSLSocket处于服务器模式处于服务器模式,通过以下方法决定是,通过以下方法决定是否要求对方提供身份认证:否要求对方提供身份认证:(1)setWantClientAuth(boolean want):当当want参数为参数为true,表示希望对方提供身份认证。,表示希望对方提供身份认证。如果对方未出示安全证书,连接不会中断,通信如果对方未出示安全证书,连接不会中断,通信继续进行。继续进行。(2)setNeedClientAut

33、h(boolean need):当当need参数为参数为true,表示要求对方必须提供身份认,表示要求对方必须提供身份认证。如果对方未出示安全证书,连接中断,通信证。如果对方未出示安全证书,连接中断,通信无法继续。无法继续。lSSLServerSocket类是类是ServerSocket类的子类,因类的子类,因此两者的用法有许多相似之处。此两者的用法有许多相似之处。lSSLServerSocket类还具有与安全通信有关的方法。类还具有与安全通信有关的方法。这些方法与这些方法与SSLSocket类中的同名方法具有相同的类中的同名方法具有相同的作用。作用。lString getSupportedC

34、ipherSuites():返回一个字符串数组,它包含当前返回一个字符串数组,它包含当前SSLServerSocket对象所支持的加密套件组。对象所支持的加密套件组。lvoid setEnabledCipherSuites(String suites):设置当前设置当前SSLServerSocket对象可使用的加密套件组。对象可使用的加密套件组。lString getEnabledCipherSuites():返回一个字符串数组,它包含当前返回一个字符串数组,它包含当前SSLServerSocket对象可使用的加密套件组。对象可使用的加密套件组。设置加密套件的方法设置加密套件的方法管理SSL会

35、话lvoid setEnableSessionCreation(boolean flag):决定由当前决定由当前SSLServerSocket对象创建的对象创建的SSLSocket对象是否允许创建新的会话。对象是否允许创建新的会话。lboolean getEnableSessionCreation():判断由当前判断由当前SSLServerSocket对象创建的对象创建的SSLSocket对象是否允许创建新的会话。对象是否允许创建新的会话。设置客户端模式lvoid setUseClientMode(boolean mode):当当mode参数为参数为true,表示客户端模式。,表示客户端模式。

36、lvoid setWantClientAuth(boolean want):当当want参数为参数为true,表示希望对方提供身份认证。,表示希望对方提供身份认证。lvoid setNeedClientAuth(boolean need):当当need参数为参数为true,表示要求对方必须提供身份认,表示要求对方必须提供身份认证。证。SSLEngine类类lSSLEngine类与类与SocketChannel类联合使用,实现类联合使用,实现非阻塞的安全通信非阻塞的安全通信。lSSLEngine类封装与安全通信有关的细节,把应用类封装与安全通信有关的细节,把应用程序发送的应用数据程序发送的应用数

37、据打包打包为网络数据。(为网络数据。(打包打包是是对应用数据进行加密,加入对应用数据进行加密,加入SSL握手数据,把它变握手数据,把它变为网络数据为网络数据。lSSLEngine类能把接收到的网络数据类能把接收到的网络数据展开展开为应用数为应用数据。(据。(展开展开是指对网络数据解密)是指对网络数据解密)lSSLEngine类的类的wrap()方法负责打包应用数据,方法负责打包应用数据,unwrap()方法负责展开网络数据。方法负责展开网络数据。l在图在图3中,中,SocketChannel类负责发送和接收网络数类负责发送和接收网络数据,据,SSLEngine类负责网络数据与应用数据之间的类负

38、责网络数据与应用数据之间的转换。转换。图图3lSSLEngine类的类的wrap()以及以及unwrap()方法都返回一方法都返回一个个SSLEngineResult对象,它描述执行对象,它描述执行wrap()或或unwrap()方法的结果。方法的结果。lSSLEngineResult类的类的getHandshakeStatus() 返回返回SSL握手状态,如果取值为握手状态,如果取值为HandshakeStatus.NEED_TASK,表明握手没有完,表明握手没有完成,应该继续完成握手任务:成,应该继续完成握手任务:if(result.getHandshakeStatus() = Hands

39、hakeStatus.NEED_TASK) Runnable runnable; while(runnable = engine.getDelegatedTask() != null) runnable.run(); lSSL简介简介lJSSE简介简介l创建基于创建基于SSL的安全服务器和安全客户的安全服务器和安全客户主要内容创建基于创建基于SSL的安全服务器和安全客户的安全服务器和安全客户lSSL编程使用客户机编程使用客户机/服务器模式,二者之服务器模式,二者之间的通信使用间的通信使用SSL协议进行加密。协议进行加密。l本节先通过最简单的程序介绍服务器和客本节先通过最简单的程序介绍服务器和客

40、户程序之间如何通过户程序之间如何通过SSL进行加密通信。进行加密通信。 示例示例1:简单的简单的SSL服务器程序服务器程序l接受客户程序建立连接,并以加密方式向客接受客户程序建立连接,并以加密方式向客户程序发送一串字符。户程序发送一串字符。(MySSLServer.java)lSSL服务器程序运行时需要指定密钥库,以服务器程序运行时需要指定密钥库,以便向客户程序证明自己的身份。本实例演示便向客户程序证明自己的身份。本实例演示通过编程指定密钥库和通过通过编程指定密钥库和通过java命令选项指命令选项指定密钥库的两种运行方式。定密钥库的两种运行方式。 编程思路编程思路 基于基于Socket编程:编

41、程:(1)创建)创建ServerSocket对象,传入端口号,对象,传入端口号,(2)执行)执行ServerSocket对象的对象的accept( ) 获取获取Socket类类型的对象,并侦听端口以等待客户程序的请求连接。型的对象,并侦听端口以等待客户程序的请求连接。(3)通过)通过Socket类型的对象获得输入和输出流,通过类型的对象获得输入和输出流,通过输入和输出流和客户程序进行通信。输入和输出流和客户程序进行通信。SSL编程与基于编程与基于Socket编程不同:编程不同:(1)其)其ServerSocket对象通过一个特殊对象对象通过一个特殊对象SSLServerSocketFactor

42、y类型对象创建;类型对象创建;(2)输入和输出流将自动按照)输入和输出流将自动按照SSL协议指定的协议指定的方法交换密钥并对数据进行加密。方法交换密钥并对数据进行加密。(3)需要指定包含证书的密钥库,以便客户程)需要指定包含证书的密钥库,以便客户程序确定序确定SSL服务器是否可靠。服务器是否可靠。 Step1:设置密钥库及口令设置密钥库及口令System.setProperty( .ssl.keyStore,mykeystore);System.setProperty( .ssl.keyStorePassword,wshr.ut);分析:通过分析:通过System类的类的setProperty

43、( )可以设置系统参数。可以设置系统参数。第一个参数是系统参数名称,第二个参数是为系统参数第一个参数是系统参数名称,第二个参数是为系统参数设置的值。设置的值。作为作为SSL服务器程序,主要需要设置两个系统参数:服务器程序,主要需要设置两个系统参数:.ssl.keyStore指定密钥库的名称,指定密钥库的名称,.ssl.keyStorePassword指定密钥库的密码。指定密钥库的密码。 Step2:创建创建SSLServerSocketFactory类型的对象类型的对象 SSLServerSocketFactory ssf= (SSLServerSocketFactory) SSLServer

44、SocketFactory.getDefault( );分析:执行分析:执行.ssl包中包中SSLServerSocketFactory类静态方法类静态方法getDefault( ),经,经过强制转换获得过强制转换获得SSLServerSocketFactory类型对象,类型对象,将用它获取将用它获取ServerSocket对象。对象。 Step3:创建创建ServerSocket类型的对象类型的对象ServerSocket s= ssf.createServerSocket(5432); 分析:上一步得到分析:上一步得到SSLServerSocketFactory对象的对象的createSe

45、rverSocket()获得获得ServerSocket类型对象,方法参数中指定一个整类型对象,方法参数中指定一个整数作为端口号,其值一般在数作为端口号,其值一般在1 65535之间,其中临时之间,其中临时使用的端口号可取使用的端口号可取1024 65535之间的整数。之间的整数。Step4:等待客户程序连接等待客户程序连接 Socket s=ss.accept( );分析:执行上一步得到的分析:执行上一步得到的ServerSocket对象的对象的accept(),程序将在此处挂起,等,程序将在此处挂起,等待客户程序建立连接。该方法返回的待客户程序建立连接。该方法返回的Socket类型的对类型

46、的对象可用于和客户程序之间的通信。象可用于和客户程序之间的通信。的的Step5:建立输出流建立输出流PrintStream out = new PrintStream(s.getOutputStream( );out.println(“hello,Im 007!);分析:上一步得到的分析:上一步得到的Socket对象对象getOutputStream()得到输出流,通过得到输出流,通过该输出流发送的信息将加密传递该输出流发送的信息将加密传递给客户程序给客户程序。这里使用输出流创建。这里使用输出流创建PrintStream类型对类型对象。象。如果服务器程序同时处理客户程序发如果服务器程序同时处理

47、客户程序发来字符串,可以通过来字符串,可以通过Socket对象对象getInputStream()得到得到输入流,从输入流读取客户发来的信息。输入流,从输入流读取客户发来的信息。的的示例示例2:简单的简单的客户端客户端程序程序l它和运行服务器程序的建立连接,接受其发它和运行服务器程序的建立连接,接受其发来的字符串并自动对其进行解密。来的字符串并自动对其进行解密。(MySSLClient.java) 编程思路编程思路 基于基于Socket的客户端编程:的客户端编程:(1) 得到得到Socket类型的对象;类型的对象;(2)通过)通过Socket类型的对象获得输入和输出流,通过类型的对象获得输入和

48、输出流,通过输入和输出流和服务器程序进行通信。输入和输出流和服务器程序进行通信。SSL客户端编程与客户端编程与Socket客户端编程不同:客户端编程不同:(1)其)其Socket对象通过一个特殊对象对象通过一个特殊对象SSLServerSocketFactory类型对象创建;类型对象创建;Step1:设置客户程序信任的密钥库设置客户程序信任的密钥库System.setProperty( .ssl.trustStore,clienttrust);分析:客户端欲和分析:客户端欲和SSL服务器通信,则必须信任服务器通信,则必须信任SSL服服务器程序所使用的数字证书。因此客户程序应该将所信务器程序所使

49、用的数字证书。因此客户程序应该将所信任的证书放在一个密钥库中(本实例任的证书放在一个密钥库中(本实例“运行程序运行程序”部分部分给出了如何创建这样的密钥库)。这里假定客户程序信给出了如何创建这样的密钥库)。这里假定客户程序信任的证书放在文件名为任的证书放在文件名为clienttrust的密钥库中。的密钥库中。Step2:创建创建SSLSocketFactory类型的对象类型的对象 SSLSocketFactory ssf= (SSLSocketFactory) SSLSocketFactory.getDefault( );分析:执行分析:执行.ssl包中包中SSLSocketFactory类的

50、静态方法类的静态方法getDefault( ),经过强,经过强制转换获得制转换获得SSLSocketFactory类型的对象,后面将用类型的对象,后面将用它获取它获取Socket对象。对象。Step3:创建创建Socket类型对象,连接服务器程序类型对象,连接服务器程序Socket s = ssf.createSocket(127.0.0.1, 5432);分析:上一步得到分析:上一步得到SSLSocketFactory对象的对象的createSocket()和服务器指定端口建立连接。第和服务器指定端口建立连接。第一个参数是服务器一个参数是服务器IP地址或域名,如果只有一台计算地址或域名,如果

51、只有一台计算机,使用机,使用“127.0.0.1”作为服务器的作为服务器的IP地址,或地址,或“Localhost”作为服务器的域名。第二个参数即服务作为服务器的域名。第二个参数即服务器程序指定的端口号。器程序指定的端口号。Step4:建立输出流建立输出流BufferedReader in = new BufferedReader( new InputStreamReader(s.getInputStream( );分析:执行分析:执行Socket对象对象getInputStream() 得到输入流,通过该输入流读取服得到输入流,通过该输入流读取服务器程序发送来的信息并自动解密。这里使用输入流

52、务器程序发送来的信息并自动解密。这里使用输入流创建创建BufferedReader类型对象,以便通过类型对象,以便通过readLine( )语句读取字符串。语句读取字符串。如果服务器程序同时处理客户程序发如果服务器程序同时处理客户程序发来字符串,可以通过来字符串,可以通过Socket对象对象getOutputStream()得得到输出流,从输出流向服务器客户发送信息。到输出流,从输出流向服务器客户发送信息。的的练习题1l问题:JSSE支持哪些协议?l选项:la) FTPlb) SSLlc) TLSld) HTTPl答案: b,c练习题2l问题:SSL协议位于哪个层?l选项:la)网络层lb)应

53、用层lc)传输层ld)安全套节字层l答案: d练习题3l问题:以下哪些属于SSL协议的内容?l选项:la) 验证通信对方的身份lb) 保证数据的可靠传输,数据不会丢失lc) 对网络上传输的数据加密ld) 保证不会接收到乱序的数据包l答案: a,c练习题4l问题:以下哪些类的对象可以直接由SSLContext创建?l选项:la)SSLServerSocketFactorylb)SSLSocketFactorylc)SSLEngineld)SSLSocketle)KeyStorel答案: a,b,c练习题5l问题:在SSL协议中,什么叫客户模式?l选项:la) 当一个通信端作为客户程序运行,就称它

54、处于客户模式。lb) 当一个通信端无需向对方证实自己身份,就称它处于客户模式。lc) 当一个通信端要求对方必须提供身份验证,就称它处于客户模式。ld) 如果一个通信端处于服务器模式,那么另一端就处于客户模式。l答案: b练习题6l问题:关于TrustManager,以下哪些说法正确?l选项:la) TrustManager用来证实自己的身份。lb) TrustManager用来验证对方的身份。lc) 如果通信方A要求验证通信方B的身份时,通信方A的程序中必须创建TrustManager。ld) 如果通信方A要求验证通信方B的身份时,通信方B的程序中必须创建TrustManager。l答案: b,c

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 办公文档 > 工作计划

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号