Secure Sockets Laye安全套接字层(SSL)是使用最广泛的Web协议实现方案。SSL使用组合加密过程提供一个安全的网络通信。本节介绍SSL和加密过程。
SSL提供了一个安全增强的标准TCP/IP套接字协议用于网络通信。在“TCP/IP协议栈与SSL”下图所示,安全套接字层是传输层和应用层之间。应用程序最常用的SSL协议是超文本传输协议(HTTP),互联网网页的协议。其他的应用,如网络新闻传输协议(NNTP),Telnet,轻量级目录访问协议(LDAP),交互邮件访问协议(IMAP)、文件传输协议(FTP),可以使用SSL以及。
SSL是Netscape 1994的开发,并与互联网社区的投入,已经发展成为一个标准。现在是国际标准化组织的控制下,互联网工程任务组(IETF)。在1999年1月IETF已经更名为SSL传输层安全(TLS),并发布了1.0规范。TLS 1.0是对应SSL3.0协议的最新版本。SSL 3.0 和TLS 1.0之间的差异很小。
一、为什么使用SSL?
在网络上传输敏感信息可能有三个以下问题:- 你不能总是确信与你交流的实体是真正的你认为它。
- 网络数据可以被截获,所以它可能被未经授权的第三方获取,例如:黑客
- 如果攻击者可以拦截数据,攻击者可以在发送到接收者之前修改数据。
注意,身份验证和加密都是可选的,依赖于两个实体之间协商的cipher suites 。
最明显的例子,当你使用SSL在电子商务交易。在电子商务交易中,假装你可以保证与你正在通信的服务器的身份是愚蠢的。这将是很容易让人创建一个虚假的网站,承诺提供更好的服务如果你输入你的信用卡卡号(其实就是伪网站)。SSL允许你的客户验证服务器的身份。它也允许服务器来验证客户端的身份,虽然在互联网交易,这是很少做。
一旦客户端和服务器确认了对方的身份,SSL通过加密算法保证了隐私性和数据完整性。这就允许敏感信息在互联网上安全传输,如信用卡号码。
SSL提供认证、隐私和数据完整性,它不提供不可抵赖(non-repudiation)服务。不可抵赖意味着发送消息的实体,不能稍后否认发送过它们。当数字签名与一个消息相关联时,该通信可以被证实的。SSL不单独提供不可抵赖。
二、SSL如何工作-How SSL Works
(1)Cryptographic Processes
私钥和公钥都取决于使用约定密钥或密钥对。key是字符串被加密算法使用,对数据进行加密和解密。密钥就像锁的钥匙:只有正确的钥匙才能打开锁。
在两个通信方之间安全传输密钥不是件小事。公钥证书允许一方安全地传输公钥,同时确保接收方公钥的真实性。公钥证书在后面的章节中描述。
在随后的加密过程的描述中,我们使用如下约定:我们用Alice爱丽丝和Bob鲍伯的名字对两个通信方进行标记。我们称为未经授权的第三方,也被称为attacker,查利。
Secret Key Cryptography
使用密钥加密,通信双方,Alice和Bob,使用相同的密钥进行加密和解密的消息。在任何加密的数据通过网络发送之前,Alice和Bob必须有密钥,必须同意加密算法,密钥和算法讲于加密和解密。
秘密密钥加密也称为对称密码,因为同一密钥用于对数据进行加密和解密。众所周知的秘密密钥的加密算法,包括数据加密标准(DES),triple-strength DES(3DES),Rivest Cipher (RC2),和Rivest Cipher 4(RC4)。
Public Key Cryptography
让我们假设Bob使用公钥密码向Alice发送一个消息。Alice有一个公钥和一个私钥,所以她把她的私钥在一个安全的地方,并发送她的公钥给Bob。Bob使用Alice的公钥对消息加密。Alice稍后可以用她的私钥解密消息。
如果Alice用自己的私钥加密消息加密并发送消息给Alice,Bob可以肯定,他接收到的数据来自Alice;如果Bob能够解密数据用爱丽丝的公钥,消息必定被爱丽丝用他私人密钥加密,只有Alice's拥有她自己的私人密钥。问题是,任何其他人也可以读取消息,因为爱丽丝的公钥是公开的。虽然这种场景不适用安全的数据通信,它提供了数字签名的基础。数字签名是一个公钥证书的组件,并用于SSL客户端或服务器进行身份验证。公钥证书和数字签名在后面的章节中描述。
公开密钥密码也被称为非对称密码,因为不同的密钥被用来加密和解密的数据。一个众所周知的公共密钥加密算法通常使用的SSL是Rivest Shamir Adleman(RSA)算法。另一个公开密钥算法使用的SSL是专为秘密密钥交换是Diffie Hellman(DH)算法。公钥加密需要大量的计算,使得它非常慢。因此,它通常只用于加密小块数据,如密钥,而不是加密数据通信的大部分。
A Comparison Between Secret Key and Public Key Cryptography
私钥加密和公钥加密都有优点和缺点。私钥加密,数据可以很快速加密和解密,但由于通信双方必须共享相同的密钥信息,交换密钥可以是一个问题。公钥加密,密钥交换是不是一个问题,因为公钥不需要被保密,但用于加密和解密数据的算法需要大量的计算,因此非常慢。
公钥证书Public Key Certificates
Once the CA is confident that the applicant represents the organization it says it represents, the CA signs the certificate attesting to the validity of the information contained within the certificate.
公钥证书可以被认为是等同于数字通行证。由受信机构签发,并为发信人提供身份证明。发行公钥证书的可信组织称为证书颁发机构(CA)。CA可以比作公证人。要从CA获得证书,必须提供身份证明。一旦CA确信申请人代表它所说的组织,CA签发证书,证明有效的信息包含在证书中。
公钥证书包含多个字段,包括:
- Issuer - 发行人是颁发证书的CA. 如果用户信任颁发证书CA ,而且证书有效,则用户可以信任证书
- Period of validity - 证书有失效日期, 此日期是在验证证书有效性时应检查的一段信息
- Subject - 主题字段包含证书表示的实体信息.
- Subject's public key -最主要的信息,证书的公钥. 所有的其他字段确保此密钥的有效性
- Signature - 证书是由CA签发的证书数字签名。使用CA的私钥创建签名并确保证书的有效性
如果Bob接收到Alice的公钥是有效的公开证书,Bob讲不会被愚弄发送秘密信息给伪装成Alice的Charlie
很多证书有可能在被一个证书链链接。当使用证书链时,第一个证书总是发送者的。链中的最终证书是根CA的证书CA是一个被广泛信任的公共证书颁发机构。几个根CA的信息通常存储在客户端的Internet浏览器中。此信息包括CA的公钥。众所周知,CAs包括VeriSign,Entrust,和GTE CyberTrust.。
Cryptographic Hash Functions
加密哈希算法是一个类似于checksum。主要的区别是checksum被设计检查数据中意外变化,加密哈希算法是用来检测故意的改变。当数据由加密哈希算法处理时,生成一个称为哈希的小串位。对消息的微小更改通常会使生成的哈希值发生较大变化。加密哈希算法不需要加密密钥。两个哈希算法通常用于SSL中是:Message Digest 5 (MD5) 和Secure Hash Algorithm (SHA)。SHA是由美国国家科学技术研究所(NIST)提出。
Message Authentication Code
消息验证码(MAC)类似于一个加密哈希,它是基于一个私钥。
如果Alice想确认Charlie不篡改她发给Bob的消息,她可以给她的消息计算HMAC和追加的HMAC她的原始消息。然后她就用和Bob分享的密钥加密包含HMAC的消息。当Bob解密消息并计算HMAC,他将能够区分消息在传输过程中是否被修改过。在SSL中HMAC是用于传输数据的安全。
Digital Signatures
(2)The SSL Process
Communication using SSL begins with an exchange of information between the client and the server.
使用SSL在客户端和服务器。这种信息交流被称为SSL握手。
- 协调 cipher suite
- 身份认证(可选)
- 用约定的加密机制建立信息安全
Negotiating the Cipher Suite
Authenticating the Server
(3)The SSL Protocol
“SSL Messages”图片展示了在SSL握手交换消息的顺序。每个SSL消息都被如下图描述:
客户端发送服务器信息包括SSL支持最高版本和一系列的密码套件支持。
- Client hello - 客户端向服务端发送它支持的SSL版本和一些了它支持的cipher suites
- Server hello - 服务端选择最高版本的SSL和最好切大家都支持的cipher suite,并且把这些消息发送给客户端
- Certificate - 服务器发送客户端证书或证书链。证书链通常开始与服务器的公共密钥证书,以证书颁发机构的根证书。这一消息是可选的,但用来服务器认证。
- Certificate request -如果服务器需要认证客户端,服务器发送认证请求。在互联网上这个消息很少发。
- Server key exchange - 服务器发送客户端密钥交换消息, when the public key information sent in 3) above is not sufficient for key exchange.
- Server hello done - 服务器告诉客户段,完成初步协同的消息。
- Certificate - 如果服务端在4)请求客户端证书,客户端发送它证书链,正如服务端所所做的在消息3。
- Client key exchange - 客户端生成用于创建用于对称加密的密钥信息。例如RSA,然后客户端加密(用服务器的公钥)这个密钥信息,并将其发送给服务器。
- Certificate verify - 这个消息被发送时,客户端提供证书以上。其目的是让服务器完成认证客户端的过程。当这个消息被使用,客户端发送的信息进行数字签名,它使用加密哈希函数。当服务器解密这些信息与用户的公共密钥,服务器能够对客户端进行身份验证。
- Change cipher spec - 客户端发送一个消息告诉服务器更改加密模式
- Finished - 客户端告诉服务器,它已经准备好安全的数据交流.
- Change cipher spec -服务器发送一个消息告诉客户端更改加密模式
- Finished - 服务端告诉客户端它已经准备好安全的数据交流
- Encrypted data - 客户端和服务器使用对称加密算法和Hash算法在消息1和2协商好的进行通信
- Close Messages - 在链接的最后,每一方都会发送一个close_notify消息通知同伴,连接关闭
如果在SSL会话过程中产生的参数都保存过,这些参数有时可以重新用于未来的SSL会话。节约SSL会话参数允许加密通信更快速开始。
Cipher Suite Choice and Remote Entity Verification
当使用原始的SSLSockets/SSLEngines类时你应该在发送任何数据前检查点对方的的证书。SSLSocket and SSLEngine 类没有自动地确认URL中的hostname匹配对方证书中的hostname,。应用可以用URL欺骗如果主机未验证的开发。。
例如https协议需要hostname确认。应用程序可以使用HostnameVerifier 覆盖默认HTTPS hostname 规则。更多信息见HttpsURLConnection。