【Java安全技术探索之路系列:Java可扩展安全架构】之十三:JSSE(三):JSSE编程模型

作者:郭嘉
邮箱:[email protected]
博客:http://blog.csdn.net/allenwells
github:https://github.com/AllenWell

【Java安全技术探索之路系列:Java可扩展安全架构】章节目录

【Java安全技术探索之路系列:Java可扩展安全架构】之一:Java可扩展安全架构开篇
【Java安全技术探索之路系列:Java可扩展安全架构】之二:JCA(一):JCA架构介绍
【Java安全技术探索之路系列:Java可扩展安全架构】之三:JCA(二):JCA类和接口
【Java安全技术探索之路系列:Java可扩展安全架构】之四:JCA(三):JCA编程模型
【Java安全技术探索之路系列:Java可扩展安全架构】之五:JCE(一):JCE架构介绍
【Java安全技术探索之路系列:Java可扩展安全架构】之六:JCE(二):JCE类和接口
【Java安全技术探索之路系列:Java可扩展安全架构】之七:JCE(三):JCE编程模型
【Java安全技术探索之路系列:Java可扩展安全架构】之八:JCP(一):JCP架构介绍
【Java安全技术探索之路系列:Java可扩展安全架构】之九:JCP(二):JCP类和接口
【Java安全技术探索之路系列:Java可扩展安全架构】之十:JCP(三):JCP编程模型
【Java安全技术探索之路系列:Java可扩展安全架构】之十一:JSSE(一):JSSE架构介绍
【Java安全技术探索之路系列:Java可扩展安全架构】之十二:JSSE(二):JSSE类和接口
【Java安全技术探索之路系列:Java可扩展安全架构】之十三:JSSE(三):JSSE编程模型
【Java安全技术探索之路系列:Java可扩展安全架构】之十四:JAAS(一):JAAS架构介绍
【Java安全技术探索之路系列:Java可扩展安全架构】之十五:JAAS(二):JAAS类和接口
【Java安全技术探索之路系列:Java可扩展安全架构】之十六:JAAS(三):JAAS编程模型
【Java安全技术探索之路系列:Java可扩展安全架构】之十七:JGSS(一):JGSS架构介绍
【Java安全技术探索之路系列:Java可扩展安全架构】之十八:JGSS(二):JGSS类和接口
【Java安全技术探索之路系列:Java可扩展安全架构】之十九:JGSS(三):JGSS编程模型
【Java安全技术探索之路系列:Java可扩展安全架构】之二十:SASL(一):SASL架构介绍
【Java安全技术探索之路系列:Java可扩展安全架构】之二十一:SASL(二):SASL类和接口
【Java安全技术探索之路系列:Java可扩展安全架构】之二十二:SASL(三):SASL编程模型

一 使用SSL的安全套接字连接

使用SSL的客户端和服务器通信场景:

该场景用J2SE默认的密钥库和信任库存储证书。SSL服务器使用包含其私钥和对应的公钥的密钥库。SSL客户端使用存储在信任库中的服务器证书来验证通信对等体的真实性。

1.1 JSSE客户端通信

使用SSL与服务器通信的客户端应用在创建 SSL套接字时所涉及的编程步骤如下:

  1. 注册JSSE提供者。
  2. 创建一个SSLSocketFactory实例。
  3. 创建一个SSLSocket以指定主机名和端口。
  4. 创建流来向服务器安全地发送数据和安全地接受来自服务器的数据。
  5. 关闭流。

1.2 JSSE服务器端通信

创建一个用作服务器并能用安全套接字同客户端通信的应用涉及以下编程步骤:

  1. 注册JSSE提供者。
  2. 创建一个SSLServerSocket工厂实例。
  3. 创建一个服务器SSL套接字并指定其端口。
  4. 侦听客户端SSL连接。
  5. 创建流来安全地向客户端发送数据和接收来自客户端的数据。
  6. 关闭流。
  7. 关闭套接字。

二 相互认证

安全通信中的相互认证使客户端能对服务端进行认证,从而使客户端验证服务器的真实性,进而信任服务器的提供的数据。

在相互认证的过程中,客户端和服务器相互交换各自的证书,从而在它们之间建立一条可信的信道。当SSL客户端套接字连接到SSL服务器时,它将从服务器那里收到一个认证证书,客户端套接字根据其信任库中的一组证书来验证该证书;然后客户端再将自己的认证证书发送给服务器,服务器根据其信任库中的一组证书来验证客户端的证书。如果验证成功,便建立了安全通信。要在客户端验证服务器的证书和在服务器端验证客户端的证书,必须预先将服务器的证书导人客户端的信任库,并将客户端的证书导人服务
器的信任库。

在JSSE中,可以通过设置SSLServerSocket.setNeedClientAuth(true)来启用基于客户端的相互认证,以便对服务器进行认证。要执行客户端认证,可以通过设置SSLServerSocket. setWantClientAuth(true)来要求客户端提供对等体的证书。

三 使用JSSE的HTTP over SSL

HTTP over SSL(HTTPS)允许使用SSL/TLS建立安全的HTTP通信。在JSSE中,创建F=PS连接的过程与创建HTTP连接相似,只是在建立连接之前,必须先注册JSSE提供者及与其相关的HTTPS协议处理器,并配置SSL参数。

四 代理隧道

当通信双方通过Internet进行通信时,代理隧道可以提供更高的通信安全。的数据进行加密,那么攻击者便能轻易地发起攻击,进而从分组中获取通信端点、如果没有对通信层和交换发送方月妾收方的信息和会话内容。代理隧道提供的机制允许通过代理服务器访问防火墙后面的资源。代理服务器对外部攻击者隐藏了其子网中通信主机的地址,从而可以保护通信免受攻击。

JSSE支持代理隧道,以便能够访问防火墙后面的应用,但该操作只能使用HTTP通过代理服务器来进行。要启用代理隧道,JSSE要求应用将https.ProxyHost和https.ProxyPort指定为系统属性。要在连接某些指定的主机时不使用代理,需要将http.nonProxyHosts添加为系统属性。

五 使用JSSE的主机名验证

主机名验证是一种有助于防止中间人攻击的机制,它能够验证通过SSL连接上的主机是否是预期的(授权)通信方或可信的主机。当客户端或服务器实例是其他服务器的SSL客户端时,主机名验证器便非常有用。在SSL握手过程中,如果URL的主机名和标识的主机名不一致,将回调验证机制以判断是否允许连接。

在基于JSSE的SSL通信中,要启用主机名验证,可以设置**HttpsURLConnection.setHostnameVerifier
(HostnameVerifier hnv)**。

六 SSLEngine和非阻断IO

在J2SE 5.0中,JSSE新增了新的抽象类,该抽象类允许应用以独立于传输的方式使用SSL/TLS协议,从而使应用无需选择最符合其需求的传输、1/O和线程模型。进而允许应用使用各种1/O类型,如非阻断I/O(轮询)、选择性非阻断I/O、套接字和传统的输入/输出流、本地字节缓冲区或字节数组等。

6.1 SSLEngine

SSLEngine是通过对一个已初始化的SSLContext调用SSLContext. createSSLEngine()而创建。在调用wrap()unwrap()或beginHandshake()之前,必须设置所有的配置参数。上述方法都会触发首次握手。数据通过引擎的移动是通过调用wrap()(出站数据)或unwrap()(入站数据)完成的。根据SSLEngine的状态,wrap()调用可能消耗源缓冲区中的应用数据,同时也可能在目标缓冲区中生成网络数据。出站数据可能包含应用数据和/或握手数据。对unwrap()的调用将检查源缓冲区中的数据,如果数据是握手信息,就进行握手操作;如果数据是应用信息,就把应用数据放置到目标缓冲区。底层SSL/TLS算法的状态将决定何时消耗数据、何时生成数据。

你可能感兴趣的:(安全技术,-,移动安全)