« | September 2025 | » | 日 | 一 | 二 | 三 | 四 | 五 | 六 | | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | | | | | |
| 公告 |
暂无公告... |
Blog信息 |
blog名称:天地无用 日志总数:55 评论数量:43 留言数量:1 访问次数:194165 建立时间:2008年4月17日 |

| |
密码术基础(续1)(转) 软件技术
kkk888929 发表于 2008/4/21 13:50:51 |
第七章 证实您的身份
■概述 在本章中,我们将讨论数字证书,这是确定消息发送方身份的第二个级别。我们将研究认证中心以及它们所起的作用。我们还将研究密钥、证书资源库和管理工具(keytool 和密钥库(keystore)),并讨论CertPath API —一组被设计用于构建和验证证书路径的函数。
■什么是数字证书? 正如您可能注意到的,什么是数字签名?中描述的数字签名方式有一个问题。它证实消息是由特定的发送方发送的,但我们怎么才能知道发送方确实是她所说的那个人呢?如果某人实际上是Amanda,却自称Alice,并对一条消息进行了签名,那会怎么样呢?我们可以通过使用数字证书来改进安全性,它将一个身份标识连同公钥一起进行封装,并由称为认证中心或CA 的第三方进行数字签名。 从实际意义上来说,认证中心是验证某个实体的身份并用CA 私钥对该实体的公钥和身份进行签名的组织。消息接收方可以获取发送方的数字证书并用CA 的公钥验证(或解密)该证书。这可以证实证书是否有效,并允许接收方抽取发送方的公钥来验证其签名或向他发送加密的消息。浏览器和JDK 本身都带有内置的来自几个CA 的证书及其公钥。 JDK 1.4 支持X.509 数字证书标准。
■理解keytool 和密钥库 Java 平台将密钥库用作密钥和证书的资源库。从物理上讲,密钥库是缺省名称为.keystore 的文件(有一个选项使它成为加密文件)。密钥和证书可以拥有名称(称为别名),每个别名都由唯一的密码保护。密钥库本身也受密码保护;您可以选择让每个别名密码与主密钥库密码匹配。 Java 平台使用keytool 来操作密钥库。这个工具提供了许多选项;下列示例演示了(keytool 示例)生成公钥对和相应的证书、以及通过查询密钥库查看结果的基本方法。 可以用keytool 将密钥以X.509 格式导出到文件中,由认证中心对该文件签名,然后将其重新导入到密钥库中。 还有一个用来保存认证中心(或其它可信的)证书的特殊密钥库,它又包含了用于验证其它证书有效性的公钥。这个密钥库称为truststore。Java 语言在名为cacerts 的文件中提供了缺省的truststore。如果您搜索这个文件名,就会发现至少两个这样的文件。您可以使用下列命令显示其内容: keytool -list -keystore cacerts Use a password of "changeit" ■keytool 示例 在本示例中,使用缺省密钥库.keystore,我们用RSA 算法生成别名为JoeUserKey 的自签名的证书,然后查看所创建的证书。我们将在代码签名的概念中使用这个证书来对一个JAR 文件进行签名。 D:\IBM>keytool -genkey -v -alias JoeUserKey -keyalg RSA Enter keystore password: password What is your first and last name? [Unknown]: Joe User What is the name of your organizational unit? [Unknown]: Security What is the name of your organization? [Unknown]: Company, Inc. What is the name of your City or Locality? [Unknown]: User City What is the name of your State or Province? [Unknown]: MN What is the two-letter country code for this unit? [Unknown]: US Is CN=Joe User, OU=Security, O="Company, Inc.", L=User City, ST=MN, C=US correct? [no]: y Generating 1,024 bit RSA key pair and self-signed certificate (MD5WithRSA) for: CN=Joe User, OU=Security, O="Company, Inc.", L=User City, ST=MN, C=US Enter key password for <JoeUserKey> (RETURN if same as keystore password): [Saving .keystore] D:\IBM>keytool -list -v -alias JoeUserKey Enter keystore password: password Alias name: JoeUserKey Creation date: Apr 15, 2002 Entry type: keyEntry Certificate chain length: 1 Certificate[1]: Owner: CN=Joe User, OU=Security, O="Company, Inc.", L=User City, ST=MN, C=US Issuer: CN=Joe User, OU=Security, O="Company, Inc.", L=User City, ST=MN, C=US Serial number: 3cbae448 Valid from: Mon Apr 15 09:31:36 CDT 2002 until: Sun Jul 14 09:31:36 CDT 2002 Certificate fingerprints: MD5: 35:F7:F7:A8:AC:54:82:CE:68:BF:6D:42:E8:22:21:39 SHA1: 34:09:D4:89:F7:4A:0B:8C:88:EF:B3:8A:59:F3:B9:65:AE:CE:7E:C9
■CertPath API 证书路径API 是JDK 1.4 的新特性。它们是一组用于构建和验证证书路径或证书链的函数。这是在诸如SSL/TLS 的协议(请参阅什么是安全套接字层/传输层安全性?)和JAR 文件签名验证中是隐式地完成的,但有了这个支持后,就可以在应用程序中显式地完成了。 正如什么是数字证书?中所提到的,CA 可以用自己的私钥对证书签名,因此,如果接收方持有的CA 证书具有签名验证所需要的公钥,则它可以验证已签名证书的有效性。 在本例中,证书链由两个环节组成—信任锚(CA 证书)环节和已签名证书环节。自我签名的证书仅有一个环节的长度—信任锚环节就是已签名证书本身。 证书链可以有任意环节的长度,所以在三节的链中,信任锚证书CA 环节可以对中间证书签名;中间证书的所有者可以用自己的私钥对另一个证书签名。CertPath API 可以用来遍历证书链以验证有效性,也可以用来构造这些信任链。 证书虽然有期限,但有可能在过期之前泄露,因此必须检查证书撤销列表(Certificate Revocation Lists (CRL))以切实保证已签名证书的完整性。可以在CA 网站查看这些列表,也可以使用CertPath API 以编程方式进行操作。 特定API 和代码示例不在本教程讨论范围之中,但除了API 文档之外,Sun 还提供了一些代码示例。
第八章 信任代码
■概述 在本章中,我们将研究代码签名的概念,主要讨论管理JAR 文件证书的工具Jarsigner。
■代码签名的概念 JAR 文件在Java 平台上相当于ZIP 文件,允许将多个Java 类文件打包到一个具有.jar 扩展名的文件中。然后,可以对这个JAR 文件进行数字签名,以证实其中的类文件代码的来源和完整性。该JAR 文件的接收方可以根据发送方的签名决定是否信任该代码,并可以确信该内容在接收之前没有被篡改过。JDK 提供了带有这种功能的jarsigner 工具。 在部署中,可以通过在策略文件中放置访问控制语句根据签名者的身份分配对机器资源的访问权。
■jarsigner 工具 jarsigner 工具将一个JAR 文件、一个私钥和相应的证书作为输入,然后生成JAR 文件的签名版本作为输出。它为JAR 文件中的每个类计算消息摘要,然后对这些摘要进行签名以确保文件的完整性并标识文件的拥有者。 在applet 环境中,HTML 页面引用已签名JAR 文件中包含的类文件。当浏览器接收这个JAR 文件时,会对照任何安装的证书或认证中心的公用签名检查该JAR 文件的签名以验证其有效性。如果未找到现有的证书,则会向用户显示一个提示屏幕,给出证书详细信息并询问用户是否打算信任该代码。
■代码签名示例 在本示例中,我们首先从.class 文件创建JAR 文件,然后通过在用于签名的密钥库中指定证书的别名来对JAR 文件签名。然后,我们对已签名的JAR 文件运行验证检查。 D:\IBM>jar cvf HelloWorld.jar HelloWorld.class added manifest adding: HelloWorld.class(in = 372) (out= 269)(deflated 27%) D:\IBM>jarsigner HelloWorld.jar JoeUserKey Enter Passphrase for keystore: password D:\IBM>jarsigner -verify -verbose -certs HelloWorld.jar 137 Mon Apr 15 12:38:38 CDT 2002 META-INF/MANIFEST.MF 190 Mon Apr 15 12:38:38 CDT 2002 META-INF/JOEUSERK.SF 938 Mon Apr 15 12:38:38 CDT 2002 META-INF/JOEUSERK.RSA 0 Mon Apr 15 12:38:00 CDT 2002 META-INF/ smk 372 Mon Apr 15 12:33:02 CDT 2002 HelloWorld.class X.509, CN=Joe User, OU=Security, O="Company, Inc.", L=User City, ST=MN, C=US (joeuserkey) s = signature was verified m = entry is listed in manifest k = at least one certificate was found in keystore i = at least one certificate was found in identity scope jar verified.
■代码签名示例执行 下面是用于该程序的HTML: <HTML> <HEAD> <TITLE> Hello World Program </TITLE> </HEAD> <BODY> <APPLET CODE="HelloWorld.class" ARCHIVE="HelloWorld.jar" WIDTH=150 HEIGHT=25> </APPLET> </BODY> </HTML> 当在将Java 插件用作Java 虚拟机的浏览器中执行这个示例时,会弹出一个对话框询问用户是否希望安装和运行由“Joe User”分发的已签名的applet,并告知用户发布者的可靠性是由“Company,Inc.”验证的,但安全性结论是由一家未获信任的公司发出的。该安全性证书还未过期并仍然有效。它警告:“Joe User”断言该内容是安全的,仅当您相信“Joe User”所作的断言时才应该安装或查看其内容。向用户提供了下列选项: ·准许这个会话 ·拒绝 ·始终准许 ·查看证书
第九章 SSL/TLS:保护C/S通信
■概述 在本章中,我们将研究安全套接字层(Secure Sockets Layer)(及其替代品,传输层安全性(Transport Layer Security))的构件,该协议用于为客户机认证服务器。我们提供一些代码示例作为说明。
■什么是安全套接字层/传输层安全性? 安全套接字层(SSL)和取代它的传输层安全性(TLS)是用于在客户机和服务器之间构建安全的通信通道的协议。它也用来为客户机认证服务器,以及(不太常用的)为服务器认证客户机。该协议在浏览器应用程序中比较常见,浏览器窗口底部的锁表明SSL/TLS 有效。 TLS 1.0 和SSL 3.1 一样。 SSL/TLS 使用本教程中已经讨论过的三种密码术构件的混合体,但这一切都是对用户透明的。以下是该协议的简化版本: 当使用SSL/TLS(通常使用https:// URL)向站点进行请求时,从服务器向客户机发送一个证书。客户机使用已安装的公共CA 证书通过这个证书验证服务器的身份,然后检查IP 名称(机器名)与客户机连接的机器是否匹配。 客户机生成一些可以用来生成对话的私钥(称为会话密钥)的随机信息,然后用服务器的公钥对它加密并将它发送到服务器。服务器用自己的私钥解密消息,然后用该随机信息派生出和客户机一样的私有会话密钥。通常在这个阶段使用RSA 公钥算法。 然后,客户机和服务器使用私有会话密钥和私钥算法(通常是RC4)进行通信。使用另一个密钥的消息认证码来确保消息的完整性。
■SSL/TLS 代码样本 在本示例中,我们编写了一个使用SSL 服务器套接字的HTTPS 守护程序进程,该进程在浏览器与它连接时返回HTML 流。本示例还演示了如何在支持SSL 部署的特殊密钥库中生成机器证书。 在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(); } } } }
■HTTPS 服务器样本执行 在本示例中,我们创建了一个HTTPS 服务器守护程序,该守护程序等待客户机浏览器的连接并返回“Hello, World!”。浏览器通过https://localhost:8080 连接到该守护程序。 我们首先创建一个机器证书。名称必须与运行守护程序的计算机的机器名匹配;在本例中是localhost。此外,我们不能使用先前所用的同一.keystore。必须专门为机器证书创建一个单独的密钥库。在本例中,它的名称是sslKeyStore。 D:\IBM>keytool -genkey -v -keyalg RSA -alias MachineCert -keystore sslKeyStore Enter keystore password: password What is your first and last name? [Unknown]: localhost What is the name of your organizational unit? [Unknown]: Security What is the name of your organization? [Unknown]: Company, Inc. What is the name of your City or Locality? [Unknown]: Machine Cert City What is the name of your State or Province? [Unknown]: MN What is the two-letter country code for this unit? [Unknown]: US Is CN=localhost, OU=Security, O="Company, Inc.", L=Machine Cert City, ST=MN, C=US correct? [no]: y Generating 1,024 bit RSA key pair and self-signed certificate (MD5WithRSA) for: CN=localhost, OU=Security, O="Company, Inc.", L=Machine Cert City, ST=MN, C=US Enter key password for <MachineCert> (RETURN if same as keystore password): [Saving sslKeyStore] 然后,我们指定特殊的密钥库及其密码,启动该服务器守护程序进程: D:\IBM>java -Djavax.net.ssl.keyStore=sslKeyStore -Djavax.net.ssl.keyStorePassword=password HTTPSServerExample 在等待数秒之后,启动一个浏览器并使它指向https://localhost:8080,然后会提示您是否要信任该证书。选择“yes”应该显示“Hello World!”,接着单击Internet Explorer 上的锁会给出证书的详细信息。
第十章 结束语和参考资料
■结束语 本教程介绍了可以用来提供众多应用程序安全性解决方案的主要密码术构件。您已经熟悉了此类Java 安全性主题: ·使安全编程更方便的内置特性(无指针、字节码验证器、对applet 和应用程序资源访问权的细颗粒度控制、用于所有主要密码术构件的大量的库函数,以及SSL)。 ·安全编程技术(密码的正确存储和删除和智能序列化)。 ·JDK 1.4 中新集成的特性(JCE、JSSE、JAAS、JGSS 和CertPath API)。 ·第三方提供的丰富的安全性特性。 我们还了解了下列概念: ·消息摘要 ·消息认证码 ·私钥密码术 ·公钥密码术 ·数字签名 ·数字证书 ·认证中心和路径 ·代码签名 ·SSL/TLS 您现在应该可以很轻松地研究Java 安全性的更多详细信息(请参阅参考资料一章),并学习下一篇教程Java security,Part 2:Authentication and authorization。
■参考资料
下载 ·下载本教程中使用的完整源代码和类。 ·有关本教程中使用的第三方提供程序库,请参阅BouncyCastle(http://www.bouncycastle.org)。
文章、教程和其它在线参考资料 ·Sun 的Java Security 网站(http://java.sun.com/security)是Java 安全性的权威资料来源。 ·阅读Brad Rubin 在本系列中的第二篇教程“Javasecurity,Part 2:Authentication and authorization”(developerWorks,2002 年7 月,http://www-106.ibm.com/developerworks/education/r-jsec2.html)。 ·Michael Yuan 在文章“Securing your J2ME/MIDP apps”(developerWorks,2002 年7 月,http://www-106.ibm.com/developerworks/library/j-midpds.html)中演示了如何在无线设备上使用Bouncy Castle Crypto API 对XML 文档进行数字签名和验证。 ·Greg Travis 在其教程“Using JSSE for secure socket communication”(developerWorks,2002 年4 月,http://www-106.ibm.com/developerworks/education/r-jsse.html)中提供了对JSSE 的实践性研究。
书籍 ·要获取对Web 安全性和Java 技术的完整讨论,请参阅Web Security, Privacy, and Commerce,第2 版(http://www.oreilly.com/catalog/websec2/),Simson Garfinkel 和Gene Spafford 著,O'Reilly 出版,2002 年。 ·如果您想更多地关注Java 安全性,请参阅Professional Java Security(http://www.amazon.com/exec/obidos/ASIN/1861004257/104-8739833-1347930),Jess Garms 和Daniel Somerfield 著,Wrox Press 出版,2001 年。 ·另一本用于了解Java 安全性的重要参考资料是Java Security(http://www.amazon.com/exec/obidos/ASIN/0596001576),Scott Oaks 著,O'Reilly & Associates 出版,2001 年。 ·从Secrets and Lies:Digital Security in a Networked World(http://www.counterpane.com/sandl.html,Bruce Schneier 著,2000 年)中找出人们为了生存和竞争需要知道哪些关于安全性的知识。 ·Applied Cryptography,第2 版(http://www.counterpane.com/applied.html),(Bruce Schneier 著,1995)这本书自夸拥有新的算法、关于Clipper Chip 和密钥托管(key escrow)的更多信息、数十个新协议、关于PGP 的更多信息、关于密钥管理和操作方式的详细信息以及新的源代码,如果真是这样,它应该成为安全性方面书籍的赢家。
其它参考资料 ·IBM Java Security Research 页面(http://www.research.ibm.com/javasec/)详细描述了正在进行中的各种安全性项目。 ·访问Tivoli 开发者园地(http://www-106.ibm.com/developerworks/tivoli/)以获取构建和维护您的电子商务安全性方面的帮助。 ·developerWorks 安全特别专题(http://www-106.ibm.com/developerworks/security/)向开发人员提供了涵盖一般安全性主题的实用技术信息。 ·请参与由Paul Abbott 主持的developerWorks Java安全论坛。 ·您可以在developerWorks Java 技术专区(http://www-106.ibm.com/developerworks/java/)找到关于Java 编程的各个方面的数百篇文章。 ·请参阅developerWorks 教程页面,以便从developerWorks 获取与Java 技术相关的免费教程的完整清单。 |
|
|