- 使用 JSSE API;
- 将 SSL 集成进您已有的客户机 - 服务器应用;
- 开发简单的 HTTP 服务器;
- 修改 HTTP 服务器,使之能处理 HTTPS 请求;
- 使用 J2SE 中的 keytool 程序产生您自己的证书;
- 开发、配置和运行一个安全的 HTTP 服务器。
SSL协议是由Netscape于1994年开发的,它允许客户机(通常是Web浏览器)和HTTP服务器通过安全的连接进行通信。作为在不安全的公网上所交换信息的保护手段,它提供加密、来源认证和数据完整性。当前存在多个SSL版本:SSL 2.0存在安全缺陷,现在已经极少使用;SSL 3.0得到了广泛的支持;最后,作为SSL 3.0的改进版本,传输层安全(TLS)被采纳为互联网标准,并被几乎所有新近的软件所支持。
加密保护数据不受未经授权的访问,这是通过在传输前将数据转换为表面上没有任何意义的数据形式来实现的。数据在一端被加密(客户机或服务器)、传送并由另一端解密,然后处理。
来源认证是检验数据发送者身份的一种方法。当浏览器或其它客户机第一次试图通过安全连接进行通信时,服务器以证书 的形式发送客户机一套凭证。
证书是由可信赖的机构,称之为认证中心 (CA)发布和验证的。证书代表着一个人的公开身份。它就象一个签名文件:我证明在文件中的公钥属于在该文件中命名的实体。签名:(认证中心)。知名的CA包括Verisign、Entrust和Thawte。请注意:当前SSL/TLS使用的证书是X.509证书。
数据完整性是指确保在传输过程中数据不被修改。
SSL和TCP/TP协议栈正如SSL的名称-安全套接口层所指出的,SSL连接与TCP的套接口连接类似。由于在协议栈中SSL连接恰恰位于TCP连接之上和应用层之下(如图1所示),因此,您可以认为SSL连接是安全的TCP连接。然而,需要注意的是,SSL并不支持诸如带外数据(out-of-bound)的TCP特性。
协商式加密
正是由于SSL的特性使得它成为安全的电子商务事务处理事实上的标准传输手段。SSL对协商式加密以及认证算法的支持就是其中的两个特性。SSL的设计者意识到并非所有的参与者都使用相同的客户端软件,因此并非所有的客户机将包括特定的加密算法。对服务器而言,也是如此。客户机与服务器是一个连接的两端。在它们最初的握手时,它们将协商所使用的加密/解密算法(加密套件)。如果双方没有共同的满足需要的算法,那么在这种情况下,连接的尝试将失败。
需要注意的是,尽管SSL允许客户机与服务器双方相互认证,但通常只有服务器是在SSL层中认证的。而客户机则通常是通过使用SSL保护的通道传递口令的方式,在应用层中认证的。这种模式在银行、证券交易以及其它安全的WEB应用中普遍使用。
图2图解说明了SSL完整的握手协议。它展示了在SSL握手过程中消息交换的顺序。
消息的含义:
1. ClientHello:客户机向服务器发送信息,诸如SSL协议版本、会话ID以及加密套件信息,如加密算法和所支持的密钥长度;
2. ServerHello:服务器选择客户机和服务器都支持的最佳的加密套件,并将信息发送给客户机;
3. Certificate:服务器向客户机发送包含了服务器公钥的证书。此消息是可选的,在要求服务器认证时需要使用。换句话说,它被用来向客户机确认服务器的身份;
4. Certificate Request:仅当服务器要求客户机认证自身时,此消息才被发送。大多数电子商务应用并不要求客户机对自己进行认证。
5. Server Key Exchange:如果包含了服务器公钥的证书不能满足密钥交换的需要,此消息被发送;
6. ServerHelloDone:此消息告知客户机,服务器已经完成了最初的协商过程;
7. Certificate:仅当服务器要求客户机认证自身时,此消息才被发送。
8. Client Key Exchange:客户机为客户机和服务器产生一个共享的秘密密钥(Secret key)。如果使用了RSA加密算法,客户机就使用服务器的公钥加密此秘密密钥,并发送给服务器。服务器使用它的私钥或秘密密钥解密此消息,并取出共享的秘密密钥。现在,客户机和服务器共享分布式安全的秘密密钥;
9. Certificate Verify:如果服务器被要求对客户端进行认证,此消息允许服务器完成认证过程;
10. Change Cipher Spec:客户机要求服务器切换到加密模式;
11. Finished:客户机通知服务器,它已做好安全通信的准备;
12. Change Cipher Spec:服务器要求客户机切换到加密模式;
13. Finished:服务器通知客户端,它已做好安全通信的准备。此消息标志着SSL握手完成了。
14. Encrypted Data:客户机与服务器可以开始通过安全通信通道进行加密信息交换。
JSSEJava安全套接口扩展(JSSE)是用100%纯JAVA实现的SSL和TLS协议的框架。它提供了用于数据加密、服务端认证、消息完整性以及可选的客户端认证的机制。JSSE引人注目的一点是:JSSE抽象了复杂的基础加密算法,从而使敏感的、危险的安全攻击的风险最小化。另外,它允许您将SSL无缝地集成进您的应用,从而使得安全应用的开发相当简单。JSSE框架具有支持众多不同的安全通讯协议的能力,这些协议包括SSL 2.0、3.0以及TLS 1.0。但是,J2SE V1.4.1实现了SSL 3.0和TLS 1.0。
使用JSSE编程
JSSE API通过提供扩展的网络套接口类、信任和密钥管理、以及封装了套接口创建行为的套接口工厂框架,来补充了java.security和java.net包。这些类是包含在javax.net和javax.net.ssl包中。
SSLSocket和SSLServerSocketjavax.net.ssl.SSLSocket是java.net.Socket类的子类。因此,它支持所有标准Socket方法,并增加了一些专用于安全套接口的方法。除用于创建服务器套接口外,javax.net.ssl.SSLServerSocket类似于SSLSocket类。
有两种方法创建SSLSocket实例:
1. 通过调用SSLSocketFactory类的实例的某个createSocket方法;
2. 通过SSLServerSocket的accept方法。
SSLSocketFactory和SSLServerSocketFactoryjavax.net.ssl.SSLSocketFactory类是创建安全套接口的对象工厂,javax.net.ssl.SSLServerSocketFactory 是创建服务端套接口的对象工厂。
可以通过以下两种方法得到SSLSocketFactory实例:
1. 调用SSLSocketFactory.getDefault()方法获取默认的工厂;
2. 使用指定配置行为,构建新的工厂。
注意:默认的工厂被配置为仅允许服务器认证。
增加已有的客户机/服务器应用的安全性将SSL集成进已有的客户机/服务器应用中,增加它们的安全性是很简单的:仅需少数几行JSSE代码。在下面的例子中,以黑体 突出显示的代码行展示了增加服务器安全性所必需的代码。
import java.io.*;
import javax.net.ssl.*;public class Server {
int port = portNumber;
SSLServerSocket server;try {
SSLServerSocketFactory factory = (SSLServerSocketFactory) SSLServerSocketFactory.getDefault(); server = (SSLServerSocket) factory.createServerSo





