金色坐标

关注互联网应用和搜索引擎技术

« Google新网上工具绘画流感地图—搜索引擎的社会化应用使用ATi显卡要注意时常更新驱动 »

JDK1.4信息传递安全性之SSL/TLS

虽然JDK最新版本已经有了JDK5和JDK6,但是在目前已经成熟的企业级应用中,JDK1.4所占的比例仍然是巨大的。JDK1.4在信息传递的安全性保证方面,主要有以下概念:

1,消息摘要:这是一种与消息认证码结合使用以确保消息完整性的技术;
2,私钥加密:被设计用来确保消息机密性的技术;
3,公钥加密:允许通信双方不必事先协商秘钥即可共享秘密消息的技术;
4,数字签名:证明另一方的消息确定来自正确通信方的位模式;
5,数字证书:通过让第三方认证机构认证消息,向数字签名添加另一级别安全性的技术;
6,代码签名:由可信的实体将签名嵌入被传递的代码中的概念;
7,SSL/TLS:在客户机和服务器之间建立安全通信通道的协议。传输层安全性(Transport Layer Security (TLS))是安全套接字层(Secure Sockets Layer (SSL))的替代品。

7.SSL/TLS

安全套接字层(SSL)和取代它的传输层安全性(TLS)是用于在客户机和服务器之间构建安全的通信通道的协议。它也用来为客户机认证服务器,以及(不太常用的)为服务器认证客户机。该协议在浏览器应用程序中比较常见,浏览器窗口底部的锁表明正在使用SSL/TLS。

TLS 1.0 和 SSL 3.1 是一样的。

SSL/TLS 实际上使用的是已经讨论过的三种密码术构件的混合体,但这一切都是对用户透明的。以下是该协议的简化版本:

(1)当使用 SSL/TLS(通常使用 https:// URL)向站点进行请求时,从服务器向客户机发送一个证书。客户机使用已安装的公共 CA 证书(根证书)通过这个证书验证服务器的身份,然后检查 IP 名称(机器名)与客户机连接的机器是否匹配。

(2)客户机生成一些可以用来生成对话的私钥(称为会话密钥)的随机信息,然后用服务器的公钥对它加密并将它发送到服务器。服务器用自己的私钥解密消息,然后用该随机信息派生出和客户机一样的私有会话密钥。通常在这个阶段使用 RSA 公钥算法。

(3)然后,客户机和服务器使用私有会话密钥和私钥算法(通常是 RC4)进行通信。使用另一个密钥的消息认证码来确保消息的完整性。

SSL/TLS 代码样本

在本示例中,我们编写了一个使用 SSL 服务器套接字的 HTTPS 守护程序进程,该进程在浏览器与它连接时返回 HTML 流。在 Java 编程中,只需要做一件事:使用 SSL 服务器套接字工厂(Server SocketFactory)代替套接字工厂(Socket Factory),代码如下:
 
SSLServerSocketFacctory sslf =
  (SSLServerSocketFactor)SSLServerSocketFactory.getDefault();
ServerSocket serverSocket = sslf.createServerSocket(PORT);

下面列出了完整的代码示例:

import java.io.*;
import java.net.*;
import javax.net.ssl.*;
//
// Example of an HTTPS server to illustrate SSL certificate and socket
public class HTTPSServerExample {

  public static void main(String[] args) throws IOException {

    //
    // create an SSL socket using the factory and pick port 8080
    SSLServerSocketFactory sslsf =
      (SSLServerSocketFactory)SSLServerSocketFactory.getDefault();
    ServerSocket ss = sslsf.createServerSocket(8080);
    //
    // loop forever
    while (true) {
      try {
        //
        // block waiting for client connection
        Socket s = ss.accept();
        System.out.println( "Client connection made" );
        // get client request
        BufferedReader in = new BufferedReader(
          new InputStreamReader(s.getInputStream()));
        System.out.println(in.readLine());
        //
        // make an HTML response
        PrintWriter out = new PrintWriter( s.getOutputStream() );
        out.println("<HTML><HEAD><TITLE>HTTPS Server Example</TITLE>" +
                    "</HEAD><BODY><H1>Hello World!</H1></BODY></HTML>\n");
        //
        // Close the stream and socket
        out.close();
        s.close();
      } catch (Exception e) {
          e.printStackTrace();
      }
    }
  }
}

上面的程序在运行时必须指定keystore和keystorepassword。

D:\IBM>java -Djavax.net.ssl.keyStore=sslKeyStore
                      -Djavax.net.ssl.keyStorePassword=password HTTPSServerExample




原创文章,如转载请注明:转载自金色坐标 [ http://www.kingxy.com/ ]

本文链接地址:http://www.kingxy.com/archives/22.html

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

订阅博客

  • 订阅我的博客:订阅我的博客
  • 通过Google订阅本站
  • 通过bloglines订阅本站
  • 通过抓虾订阅本站
  • 通过yahoo订阅本站

Search

Google

最新评论及回复

最近发表

金色坐标博客——京ICP备09009094号

本站采用创作共用版权协议, 要求署名、非商业用途和保持一致. 转载本站内容必须也遵循“署名-非商业用途-保持一致”的创作共用协议.
KingXY Blog - This site is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 2.5 License.