`

Java SSL/TLS 安全通讯协议(SSLSocket)

    博客分类:
  • java
阅读更多
简介: 本文主要介绍了网络安全通讯协议 SSL/TLS 和 Java 中关于安全通讯的实现部分。并通过一个简单的样例程序实现,来展示如何在 Java 平台上正确建立安全通讯。





在人类建立了通信系统之后,如何保证通信的安全始终是一个重要的问题。伴随着现代化通信系统的建立,人们利用数学理论找到了一些行之有效的方法来保证数字通信的安全。简单来说就是把两方通信的过程进行保密处理,比如对双方通信的内容进行加密,这样就可以有效防止偷听者轻易截获通信的内容。目前 SSL(Secure Sockets Layer) 及其后续版本 TLS(Transport Layer Security)是比较成熟的通信加密协议,它们常被用于在客户端和服务器之间建立加密通信通道。各种开发语言都给出 SSL/TLS
协议的具体实现,Java 也不例外。在 JDK 中有一个 JSSE(javax.net.ssl)包,提供了对 SSL 和 TLS 的支持。通过其所提供的一系列 API,开发者可以像使用普通 Socket 一样使用基于 SSL 或 TLS 的安全套接字,而不用关心 SSL 和 TLS 协议的细节,例如握手的流程等等。这使得利用 Java 开发安全的 SSL/TLS 服务器或客户端非常容易,本文将通过具体的例子来说明如何用 Java 语言来开发 SSL/TLS 应用。



SSL/TLS 协议的介绍



SSL/TLS 协议(RFC2246 RFC4346)处于 TCP/IP 协议与各种应用层协议之间,为数据通讯提供安全支持。



从协议内部的功能层面上来看,SSL/TLS 协议可分为两层:



1. SSL/TLS 记录协议(SSL/TLS Record Protocol),它建立在可靠的传输层协议(如 TCP)之上,为上层协议提供数据封装、压缩、加密等基本功能。



2. SSL/TLS 握手协议(SSL/TLS Handshake Protocol),它建立在 SSL/TLS 记录协议之上,用于在实际的数据传输开始前,通讯双方进行身份认证、协商加密算法、交换加密密钥等初始化协商功能。



从协议使用方式来看,又可以分成两种类型:



1. SSL/TLS 单向认证,就是用户到服务器之间只存在单方面的认证,即客户端会认证服务器端身份,而服务器端不会去对客户端身份进行验证。首先,客户端发起握手请求,服务器收到握手请求后,会选择适合双方的协议版本和加密方式。然后,再将协商的结果和服务器端的公钥一起发送给客户端。客户端利用服务器端的公钥,对要发送的数据进行加密,并发送给服务器端。服务器端收到后,会用本地私钥对收到的客户端加密数据进行解密。然后,通讯双方都会使用这些数据来产生双方之间通讯的加密密钥。接下来,双方就可以开始安全通讯过程了。



2.SSL/TLS 双向认证,就是双方都会互相认证,也就是两者之间将会交换证书。基本的过程和单向认证完全一样,只是在协商阶段多了几个步骤。在服务器端将协商的结果和服务器端的公钥一起发送给客户端后,会请求客户端的证书,客户端则会将证书发送给服务器端。然后,在客户端给服务器端发送加密数据后,客户端会将私钥生成的数字签名发送给服务器端。而服务器端则会用客户端证书中的公钥来验证数字签名的合法性。建立握手之后过程则和单向通讯完全保持一致。



SSL/TLS 协议建立通讯的基本流程如图 1 所示,





图 1. SSL/TLS 基本流程图










步骤 1.ClientHello – 客户端发送所支持的 SSL/TLS 最高协议版本号和所支持的加密算法集合及压缩方法集合等信息给服务器端。

步骤 2.ServerHello – 服务器端收到客户端信息后,选定双方都能够支持的 SSL/TLS 协议版本和加密方法及压缩方法,返回给客户端。

(可选)步骤 3.SendCertificate – 服务器端发送服务端证书给客户端。

(可选)步骤 4.RequestCertificate – 如果选择双向验证,服务器端向客户端请求客户端证书。
步骤 5.ServerHelloDone – 服务器端通知客户端初始协商结束。

(可选)步骤 6.ResponseCertificate – 如果选择双向验证,客户端向服务器端发送客户端证书。

步骤 7.ClientKeyExchange – 客户端使用服务器端的公钥,对客户端公钥和密钥种子进行加密,再发送给服务器端。

(可选)步骤 8.CertificateVerify – 如果选择双向验证,客户端用本地私钥生成数字签名,并发送给服务器端,让其通过收到的客户端公钥进行身份验证。

步骤 9.CreateSecretKey – 通讯双方基于密钥种子等信息生成通讯密钥。

步骤 10.ChangeCipherSpec – 客户端通知服务器端已将通讯方式切换到加密模式。

步骤 11.Finished – 客户端做好加密通讯的准备。

步骤 12.ChangeCipherSpec – 服务器端通知客户端已将通讯方式切换到加密模式。

步骤 13.Finished – 服务器做好加密通讯的准备。

步骤 14.Encrypted/DecryptedData – 双方使用客户端密钥,通过对称加密算法对通讯内容进行加密。

步骤 15.ClosedConnection – 通讯结束后,任何一方发出断开 SSL 连接的消息。



除了以上的基本流程,SSL/TLS 协议本身还有一些概念需要在此解释说明一下。



Key:Key 是一个比特(bit)字符串,用来加密解密数据的,就像是一把开锁的钥匙。



对称算法(symmetric cryptography):就是需要双方使用一样的 key 来加密解密消息算法,常用密钥算法有 Data Encryption Standard(DES)、triple-strength DES(3DES)、Rivest Cipher 2 (RC2)和 Rivest Cipher 4(RC4)。因为对称算法效率相对较高,因此 SSL 会话中的敏感数据都用通过密钥算法加密。

非对称算法(asymmetric cryptography):就是 key 的组成是公钥私钥对 (key-pair),公钥传递给对方私钥自己保留。公钥私钥算法是互逆的,一个用来加密,另一个可以解密。常用的算法有 Rivest Shamir Adleman(RSA)、Diffie-Hellman(DH)。非对称算法计算量大比较慢,因此仅适用于少量数据加密,如对密钥加密,而不适合大量数据的通讯加密。

公钥证书(public key certificate):公钥证书类似数字护照,由受信机构颁发。受信组织的公钥证书就是 certificate authority(CA)。多证书可以连接成证书串,第一个是发送人,下一个是给其颁发证书实体,往上到根证书是世界范围受信组织,包括 VeriSign, Entrust, 和 GTE CyberTrust。公钥证书让非对称算法的公钥传递更安全,可以避免身份伪造,比如 C 创建了公钥私钥,对并冒充 A 将公钥传递给 B,这样
C 与 B 之间进行的通讯会让 B 误认是 A 与 B 之间通讯。

加密哈希功能(Cryptographic Hash Functions):加密哈希功能与 checksum 功能相似。不同之处在于,checksum 用来侦测意外的数据变化而前者用来侦测故意的数据篡改。数据被哈希后产生一小串比特字符串,微小的数据改变将导致哈希串的变化。发送加密数据时,SSL 会使用加密哈希功能来确保数据一致性,用来阻止第三方破坏通讯数据完整性。SSL 常用的哈希算法有 Message Digest 5(MD5)和 Secure Hash
Algorithm(SHA)。

消息认证码(Message Authentication Code):消息认证码与加密哈希功能相似,除了它需要基于密钥。密钥信息与加密哈希功能产生的数据结合就是哈希消息认证码(HMAC)。如果 A 要确保给 B 发的消息不被 C 篡改,他要按如下步骤做 –A 首先要计算出一个 HMAC 值,将其添加到原始消息后面。用 A 与 B 之间通讯的密钥加密消息体,然后发送给 B。B 收到消息后用密钥解密,然后重新计算出一个 HMAC,来判断消息是否在传输中被篡改。SSL用 HMAC 来保证数据传输的安全。

数字签名(Digital Signature):一个消息的加密哈希被创建后,哈希值用发送者的私钥加密,加密的结果就是叫做数字签名。
分享到:
评论

相关推荐

    基于 MINA 的 TLS/SSL NIO Socket 实现(二)

    NULL 博文链接:https://sariel.iteye.com/blog/470383

    Java SSL安全通讯

    javax.net.ssl.SSLSocket类的使用。 下载cer.zip文件后解压,得到cer文件夹,该目录下有运行脚本,其中Test文件夹为java项目源码,直接导出到Eclipse。 SSLServer主类在com.csii.ssl包下,其它pack下的内容都用不到...

    smart-socket 开源的Java AIO框架.rar

    smart-socket是一款国产开源的 Java AIO 通信框架,支持 TCP、UDP、SSL/TLS 。 高性能、高并发、低延迟、低能耗 代码量极少,可读性强。核心代码不到 1500 行,工程结构、包层次清晰。 学习门槛低,二次开发只需...

    smart-socket是一款国产开源的Java AIO通信框架.rar

    Smart-Socket是一款国产开源的 Java AIO 通信框架,支持 TCP、UDP、SSL/TLS 。 作为一款极简、易用、高性能的通信框架,现已广泛运用于物联网、证券、电力、电商等诸多领域。 二、Smart-Socket的优势有哪些? 1.高...

    MINA NIO 高性能异步并发网络通讯框架

    利用 Mina 可以高效地完成以下任务: <br>TCP/IP 和 UDP/IP 通讯 串口通讯 VM 间的管道通讯 SSL/TLS JXM 集成 IoC 容器集成( Spring 、 Pico 等) 状态机 <br>据官方评测, APR 的...

    react-native-tcp-socket:使用客户端SSLTLS支持对适用于Android,iOS和macOS的本机TCP套接字API进行React

    使用客户端SSL / TLS支持对Android,iOS和macOS的本机TCP套接字API进行React。 它允许您创建TCP客户端和服务器套接字,以模仿Node的API功能(有关更多信息,请参见可用的 )。 目录 SSL客户端 原料药 TcpSocket ...

    syslog.jar

    Syslog4j 是一个 Syslog 协议(RFC 3164)的 Java 语言实现,用来通过 UDP/IP, TCP/IP, TCP/IP over SSL/TLS, Unix Syslog, 和 Unix Socket 等协议进行日志记录。

    Android代码-TlsLibrary

    This library provides an API for creating basic SSL/TLS connections with standard Java Secure Socket Extension, JSSE. The Library is implemented in Kotlin. The Kotlin API is implemented with a "type-...

    XML.rar_Communicating_XML EncryptedData_java xml socket_ssl_ssl

    Secure Socket Layer (SSL) and Transport Layer Security (TLS) are the current standards for communicating information securely over the internet. With TLS, all data being transmitted from point A to ...

    smart-socket AIO通信框架-其他

    smart-socket是一款国产开源的Java AIO框架,支持 TCP、UDP、SSL/TLS,追求代码量、性能、稳定性、接口设计各方面都达到极致。 如果smart-socket对您有一丝帮助,请Star一下我们的项目并持续关注; 如果您对smart-...

    JAVA开发以CA证书Socket SSL方式连接XX抗菌药物系统

    JAVA开发以CA证书Socket SSL方式连接XX抗菌药物系统的demo程序,避免掉坑。如必须TLS1.2以上,CA证书为2023年官网下载,最新版请到官网自行下载后更新。

    smart-socket AIO框架 v1.5.4

    为您提供smart-socket AIO框架下载,smart-socket是一款国产开源的Java AIO框架,支持 TCP、UDP、SSL/TLS,追求代码量、性能、稳定性、接口设计各方面都达到极致。 如果smart-socket对您有一丝帮助,请Star一下我们...

    java7帮助文档

    Various enhancements related to SSL/TLS have been added to Java Secure Socket Extension. Collections The TransferQueue interface has been added, which is a refinement of the BlockingQueue interface....

    java多线程tcpsocketserver源码-netty-learning:网络学习

    安全SSL/TLS 支持 建筑学 核 事件模型 通用通信 API 支持零复制的富字节缓冲区 io.netty.buffer, io.netty.common, io.netty.resolver, io.netty.resolver.dns 协议支持 HTTP 和 WebSocket 安全证书 谷歌原型缓冲区 ...

    J-IM即时通讯系统-其他

    主要特点:1、高性能(单机可支持几十万至百万人同时在线)2、轻量、可扩展性极强3、支持集群多机部署4、支持SSL/TLS加密传输5、消息格式极其简洁(JSON)6、一端口支持可插拔多种协议(Socket自定义IM协议、Websocket、...

    tls-channel:一个Java库,可通过SSLEngine实现ByteChannel接口,从而为Java应用程序启用易于使用的(类似于套接字的)TLS

    TLS频道TLS通道是一个通过 (传输层安全性)连接实现接口的库。 它将所有加密操作委托给标准Java TLS实现: ; 有效地将其隐藏在易于使用的流API后面,从而可以以最小的复杂性来证券化JVM应用程序。 换句话说,一个...

    axis-ssl:Axis 1.4 动态 SSL 配置

    axisConfig.setProtocol("TLS") //default SSL axisConfig.setAlgorithm("SunX509") //default KeyManagerFactory.getDefaultAlgorithm() //and TrustManagerFactory.getDefaultAlgorithm() axisConfig....

    SMTP-Java源代码

    - Swing开发,CardLayout, Custom UI, Layout技巧 - Swing开发中如何实现MVC - SMTP协议,Socket编程技巧 - SSL, TLS简单原理知识

    android-async-tls-socket:简单易用的异步套接字从 Android 手机建立 TLS 连接

    android-async-tls-socket 简单易用的异步套接字从 Android 手机建立 TLS 连接。 由于缺乏在 Android 上实现这一目标的简单快速方法而感到沮丧,而 Android 的重点似乎只放在 https 上。 而 SSLEngine 似乎有点...

    HttpClient总结.doc

    借助Java Secure Socket Extension (JSSE),HttpClient全面支持Secure Sockets Layer (SSL)或IETF Transport Layer Security (TLS)协议上的HTTP。

Global site tag (gtag.js) - Google Analytics