Java 安全性编程实例 徐迎晓 编著 清华大学出版社 2 内 容 提 要 本书以大量精简的实例介绍了 Java 安全性编程方面的概念和技术,全书共计 9 章。 经过精心设计,每个小节的实例着重说明一个问题,又相互贯穿和联系。涉及 Java 加密和解密, 反编译和反反编译,对类、成员变量、方法的攻击和保护,消息摘要,消息验证码,数字签名,口令 保护,数字证书和证书链的生成、签发、检验和维护,SSL 和 HTTPS 客户及服务器程序、基于代码位 置和签发者的授权,签名 Java Applet,基于身份的验证和授权(JAAS)等。 全书的实例极为精简,只保留了能够说明问题的代码,而又可真正运行,便于 Java 入门者轻松掌 握安全性方面繁杂的概念。适合于适合于初步了解 Java 语法的学习者,也适合于安全技术的入门及高 校 Java 教学参考。 。 3 前 言 随着 Internet 的发展,安全性已经引起越来越大的关注。Java 自其诞生起就将安全性作 为主要考虑因素之一,随着 Java 的发展,更多的安全机制加入到 Java 中,在 Java 2 SDK 1.4 中更是集成了 JCE、JSSE、JAAS 等 Java 安全扩展平台。这些安全机制是开发基于企业级 Java 2 应用平台(J2EE)上安全的应用程序的基础。 很多安全性方面的书籍涉及大量难以理解的理论和概念,而缺乏浅显易懂的实例,使初 次进入安全领域的学习者望而生畏。本书以实例为基础,从实例导入基本概念和理论,引导 读者逐步进入安全领域。 本书以功能和实例为导向,每个小节一个实例完成一个小的功能和知识点。各个实例经 过精心简化,只保留最关键部分,因此本书的程序往往数行便可实现关键功能。读者可以方 便地进行扩充和加上自己的代码。 各个小节的实例像一块块积木,既有独立性又相互间关联,读者可以方便地利用这一块 块“积木”搭建出大型的应用。 本书共分 9 章,主要内容如下: 第一章 解决的主要问题 运行本书的程序需要哪些软件? 主要内容 介绍本书所使用的主要软件及其安装和配置 第二章 解决的主要问题——内容的安全性 数据在网上传递怎么样防止被黑客窃听到? 硬盘上的文件中有敏感数据,如何防止被黑客看到? 主要内容 本章解决的是数据内容的安全性,介绍 Java 的加密和解密技术。学完该章可以通 过 Java 编程对各种数据进行各种形式的加密。密码学也是安全机制的基础。 第三章 解决的主要问题——和源代码相关的安全性 编写好的程序给用户后,用户如果能反编译出源代码怎么办? 定义类、成员变量、方法时如何防止恶意或无意的攻击? 主要内容 本章解决的是和源代码相关的保护。包括源代码、类、成员变量、方法的保护。通 过常用的反编译工具加强对源代码保护的认识,使用混淆器和加密等方式对源代码 作了初步保护。同时演示了编写程序时如何考虑攻击者对类、成员变量、方法等方 面的攻击。 第四章 解决的主要问题——确定数据的完整性和所有者 网上下载了一个程序,如何确定它确实是某某公司开发的? 如何确定黑客没有将程序修改过? 某公司或人发来一个文件,后来他不承认发过这个文件怎么办? 主要内容 4 第四章起开始介绍和身份认证相关的技术。包括身份确定性、不可篡改性、不可否 认性等,该章介绍的消息摘要和签名技术可解决这些问题。 第五章、第六章 解决的主要问题——数字化身份的凭证 实际应用中如何方便地使用摘要和签名技术? 如何确定某个签名确实是某个人或机构的? 主要内容 第五章和第六章介绍基于摘要和签名技术的数字证书。这是 Java 安全中确定身份 的主要技术。其中第五章介绍了数字证书的创建、签发、验证和维护等,第六章介 绍了多个证书组成的证书链(CertPath)的创建和验证。 第七章 解决的主要问题——数据安全传输,服务器和用户身份的确定 客户机和服务器之间的通信如何自动进行加密传输? 客户机和服务器之间的通信如何相互确定身份? 浏览器访问一个站点,如何确定这个站点不是黑客的服务器? 主要内容 本章介绍介绍使用加密技术和证书机制的一个实际应用,基于 SSL 和 HTTPS 的编 程。学完本章可以编写自己的 SSL 和 HTTPS 客户及服务器程序。 第八章 解决的主要问题——基于代码来源的程序的安全运行 网上下载了一个程序,运行时会不会删除我的文件,或将某些文件泄漏给黑客? 编写了一个 Java Applet,如何让其能访问硬盘上的文件? 主要内容 本章介绍基于代码来源的程序的安全运行,可以基于运行时代码在哪个 URL、或 代码是谁签名的限制其可以访问哪些用户资源。还介绍了定义自己的权限以及签名 Java Applet。 第九章 解决的主要问题——身份验证和基于执行者身份的程序的安全运行 程序需要用户输入账号和口令到数据库登录,但以后可能需要改为智能卡验证。 程序需要访问某个用户资源,但只有用户以某些特殊身份登录时才需要该权限。 主要内容 本章介绍 Java 验证和授权服务(JAAS),可以方便地更换验证模块,并实现基于 身份的授权。 本书实例以帮助读者入门为目的,因此为了易于理解作了很多简化,如很多实例中口令 以字符串保存,各个实例的异常处理都作了简化。因此,在编写实际应用系统时不可照搬。 本书是作者是 SUN 认证讲师,多年从事 Java 的培训与研究。对于本书的各种意见和建 议请 E-mail 至 xyx@shu.edu.cn,作者提供网站 http://javabook.126.com 供读者交流。 徐迎晓 二〇〇三年一月于 上海大学 5 目 录 第 1 章运行环境设置.....................................................................................................................10 1.1 J2SE的安装和设置 ..........................................................................................................10 1.1.1 下载J2SE ...............................................................................................................10 1.1.2 安装J2SE ...............................................................................................................10 1.1.3 设置J2SE ...............................................................................................................12 2.1.4 J2SE的主要工具 ...................................................................................................13 1.2 反编译器的安装...............................................................................................................14 1.3 混淆器的安装..................................................................................................................16 第 2 章数据内容的保护—— 加密和解密...................................................................................17 2.1 一个简单的加密和解密程序——凯撒密码...................................................................17 2.2 对称密钥的生成和保存...................................................................................................19 2.2.1 对称密钥的生成及以对象序列化方式保存........................................................19 2.2.2 以字节保存对称密钥............................................................................................20 2.3 使用对称密钥进行加密和解密.......................................................................................22 2.3.1 使用对称密钥进行加密........................................................................................22 2.3.2 使用对称密钥进行解密........................................................................................24 2.4 基于口令的加密和解密...................................................................................................26 2.4.1 基于口令的加密....................................................................................................27 2.4.2 基于口令的解密....................................................................................................29 2.5 针对流的加密和解密.......................................................................................................31 2.5.1 针对输入流的解密和解密....................................................................................32 2.5.2 针对输出流的解密和解密....................................................................................34 2.6 加密方式的设定...............................................................................................................36 2.6.1 使用CBC方式的加密............................................................................................36 2.6.2 使用CBC方式的解密............................................................................................38 2.7 生成非对称加密的公钥和私钥......................................................................................40 2.8 使用RSA算法进行加密和解密......................................................................................42 2.8.1 使用RSA公钥进行加密........................................................................................42 2.8.2 使用RSA私钥进行解密........................................................................................44 2.9 使用密钥协定创建共享密钥..........................................................................................47 2.9.1 创建DH公钥和私钥..............................................................................................47 2.9.2 创建共享密钥........................................................................................................50 第 3 章Java源代码和类、变量 及方法的保护............................................................................53 3.1 Java反编译及混淆器的使用............................................................................................53 3.2 从网络资源加载节码文件...............................................................................................57 3.3 以任意方式加载字节码文件...........................................................................................61 3.4 加载加密的字节码文件..................................................................................................63 3.5 加载当前目录下的加密字节码文件..............................................................................66 3.6 Java类、成员变量和方法的保护....................................................................................69 3.6.1 类的保护................................................................................................................69 3.6.2 成员变量和方法的保护........................................................................................73 3.6.3 使用校验器............................................................................................................74 6 3.6.4 Reference类型私有成员变量的保护....................................................................76 3.6.5 保护常量...............................................................................................................79 第 4 章 数据完整性和所有者的确认——消息摘要和签名.......................................................82 4.1 使用消息摘要验证数据未被篡改...................................................................................82 4.1.1 计算消息摘要........................................................................................................83 4.1.2 基于输入流的消息摘要........................................................................................84 4.1.3 输入流中指定内容的消息摘要............................................................................86 4.1.4 基于输入流的消息摘要........................................................................................88 4.2 使用消息验证码...............................................................................................................90 4.3 使用数字签名确定数据的来源.......................................................................................92 4.3.1 使用私钥进行数字签名........................................................................................93 4.3.2 使用公钥验证数字签名........................................................................................95 4.4 使用消息摘要保存口令..................................................................................................97 4.4.1 使用消息摘要保存口令.......................................................................................98 4.4.2 使用消息摘要验证口令.......................................................................................99 4.4.3 攻击消息摘要保存的口令.................................................................................101 4.4.4 使用加盐技术防范字典式攻击.........................................................................104 4.4.5 验证加盐的口令.................................................................................................107 第 5 章 数字化身份的确定 ——数字证书.......................................................................111 5.1 数字证书的创建.............................................................................................................111 5.1.1 使用默认的密钥库和算法创建数字证书.........................................................111 5.1.2 使用别名.............................................................................................................113 5.1.3 使用指定的算法和密钥库和有效期.................................................................114 5.1.4 使用非交互模式.................................................................................................115 5.2 数字证书的显示.............................................................................................................116 5.2.1 使用Keytool直接从密钥库显示条目信息........................................................116 5.2.2 使用Keytool直接从密钥库显示证书详细信息................................................117 5.2.3 使用Keytool将数字证书导出到文件................................................................118 5.2.4 使用Keytool从文件中显示证书........................................................................119 5.2.5 在Windows中从文件显示证书..........................................................................120 5.2.6 Java程序从证书文件读取证书...........................................................................121 5.2.7 Java程序从密钥库直接读取证书.......................................................................123 5.2.8 Java程序显示证书指定信息(全名/公钥/签名等).........................................125 5.3 密钥库的维护.................................................................................................................128 5.3.1 使用Keytool删除指定条目.................................................................................128 5.3.2 使用Keytool修改指定条目的口令.....................................................................129 5.3.3 Java程序列出密钥库所有条目...........................................................................130 5.3.4 Java程序修改密钥库口令...................................................................................131 5.3.5 Java程序修改密钥库条目的口令及添加条目...................................................133 5.3.6 Java程序检验别名及删除条目...........................................................................135 5.4 数字证书的签发.............................................................................................................136 5.4.1 确定CA的权威性——安装CA的证书..............................................................136 5.4.2 验证CA的权威性——显示CA的证书..............................................................140 5.4.3 Java程序签发数字证书.......................................................................................141 7 5.4.4 数字证书签名后的发布.....................................................................................147 5.5 数字证书的检验.............................................................................................................149 5.5.1 Java程序验证数字证书的有效期.......................................................................149 5.5.2 使用Windows查看证书路径验证证书的签名..................................................151 5.5.3 Windows中卸载证书...........................................................................................152 5.5.4 Java程序使用CA公钥验证已签名的证书 .........................................................156 第 6 章 数字化身份 ——CertPath证书链...........................................................159 6.1 密钥库中创建并保存证书链的几种方法.....................................................................159 6.1.1 使用Keytool将已签名的数字证书导入密钥库................................................159 6.1.2 使用Java程序将已签名的数字证书导入密钥库..............................................163 6.2 几种获取CertPath证书链的方法..................................................................................165 6.2.1 根据证书文件生成CertPath类型的对象...........................................................166 6.2.2 从密钥库读取证书链生成CertPath类型的对象...............................................168 6.2.3 从HTTPS服务器获取证书链.............................................................................170 6.3 CertPath对象的证书显示和保存...................................................................................177 6.3.1 显示CertPath中的证书.......................................................................................177 6.3.2 保存CertPath中的证书.......................................................................................179 6.4 验证CertPath证书链......................................................................................................181 6.4.1 验证主体和签发者.............................................................................................182 6.4.2 验证签名.............................................................................................................184 6.4.3 CertPathValidator类基于TrustAnchor验证证书链.............................................186 6.4.4 CertPathValidator类基于密钥库验证证书链 .....................................................190 6.5 使用CertStore对象保存和提取证书.............................................................................194 6.5.1 创建CertStore对象 ..............................................................................................194 6.5.2 定义证书的选择标准..........................................................................................198 6.5.3 从CertStore中提取证书.......................................................................................201 6.6 证书的吊销....................................................................................................................203 6.6.1 查看证书吊销清单常规信息..............................................................................203 6.6.2 查看清单中被吊销的证书..................................................................................209 6.6.3 从CertStore对象中提取已吊销的证书...............................................................211 第 7 章 数据的安全传输和身份验证 ——SSL和HTTPS编程................................................216 7.1 最简单的SSL通信.........................................................................................................216 7.1.1 最简单的SSL服务器..........................................................................................216 7.1.2 最简单的SSL客户程序......................................................................................218 7.1.3 进一步设置信任关系.........................................................................................221 7.1.4 设置默认信任密钥库.........................................................................................222 7.1.5 通过KeyStore对象选择密钥库..........................................................................225 7.2 进一步的SSL客户和服务器程序的例子.....................................................................227 7.2.1 设计通信规则.....................................................................................................227 7.2.2 查看对方的证书等连接信息.............................................................................232 7.3 HTTPS客户及服务器程序.............................................................................................236 7.3.1 最简单的HTTPS服务器程序.............................................................................236 7.3.2 最简单的HTTPS客户程序.................................................................................243 7.3.3 基于Socket的HTTPS客户程序..........................................................................246 8 7.3.4 传输实际文件.....................................................................................................248 7.4 基于证书的客户身份验证.............................................................................................252 7.4.1 最简单的验证客户身份的HTTPS服务器程序.................................................252 7.4.2 编写客户程序连结需客户验证的HTTPS服务器.............................................255 第 8 章 程序运行的安全性 ——基于代码来源的授权...........................................................257 8.1 安全管理器的使用........................................................................................................257 8.1.1 使用默认的安全管理器限制应用程序..............................................................257 8.1.2 编写自己的安全管理器......................................................................................260 8.1.3 在程序中设置安全管理器..................................................................................263 8.2 使用策略文件基于代码位置进行授权.........................................................................264 8.2.1 允许所有代码具有所有权限..............................................................................264 8.2.2 允许所有代码具有特定的权限..........................................................................269 8.2.3 许所有代码具有多种不同权限..........................................................................271 8.2.4 针对指定目录中的代码的授权..........................................................................273 8.2.5 针对从网络下载的代码的授权..........................................................................278 8.3 使用策略文件基于代码的所有者进行授权.................................................................282 8.3.1 编程者对代码进行签名......................................................................................282 8.3.2 用户检验已签名的代码......................................................................................283 8.3.3 针对签名者进行授权..........................................................................................285 8.4 定义特权代码.................................................................................................................288 8.4.1 不同代码之间的调用和授权.............................................................................288 8.4.2 使用doPrivileged( )方法定义特权代码.............................................................293 8.4.3 使用匿名类定义特权代码.................................................................................297 8.5 权限的操作及定义自己的权限.....................................................................................301 8.5.1 策略文件权限的检测.........................................................................................302 8.5.2 最简单的权限定义.............................................................................................305 8.5.3 使用签名的权限.................................................................................................309 8.6 Applet的安全运行..........................................................................................................311 8.6.1 使用AppletViewer运行的Java Applet................................................................311 8.6.2 浏览器中使用Java Plug-in运行Java Applet ......................................................314 8.6.3 浏览器基于策略文件运行Java Applet ..............................................................320 8.6.4 浏览器运行RSA签名的Java Applet ..................................................................322 8.6.5 Java Plug-in的证书管理......................................................................................327 8.6.6 使用usePolicy权限加强RSA签名Applet的安全控制.......................................329 第 9 章 程序运行的安全性—— 基于用户身份的验证和授权(JAAS)..............................332 9.1 最简单的身份验证........................................................................................................332 9.1.1 最简单的登录......................................................................................................332 9.1.2 更换登录模块修改验证方式..............................................................................336 9.1.3 更换回调处理器修改登录界面..........................................................................338 9.1.4 使用非交互式验证..............................................................................................339 9.2 编写自己的登录模块.....................................................................................................342 9.2.1 简单的登录模块..................................................................................................342 9.2.2 完整的登录模块模板..........................................................................................350 9.2.3 使用模板编写自己的密钥库登录模块..............................................................358 9 9.3 使用堆叠式登录.............................................................................................................366 9.3.1 堆叠式登录及各个登录模块的相互关系..........................................................366 9.3.2 堆叠登录模块之间的信息共享..........................................................................370 9.4 编写自己的回调处理器.................................................................................................386 9.4.1 最简单的回调处理器..........................................................................................386 9.4.2 图形界面口令输入的安全性.............................................................................392 9.4.3 文本界面口令输入的安全性..............................................................................394 9.4.4 更加安全的文本界面口令输入方式.................................................................396 9.5 基于身份的授权.............................................................................................................399 9.5.1 使用策略文件的基于身份授权..........................................................................399 9.5.2 使用编程方式的基于身份授权..........................................................................405 9.5.3 比较doAsPrivileged( )和doAs( ) ........................................................................409 10 第 1 章运行环境设置 本章重点: 本章将介绍本书所使用的软件的安装和设置。其中最主要的软件是 J2SDK1.4,安装好 该软件后,将可以运行本书绝大部分程序。个别章节中使用的反编译器、混淆器等也在本章 作了介绍。 本章主要内容: z 安装和配置 J2SDK1.4 环境 z 安装反编译器 z 安装混淆器 1.1 J2SE 的安装和设置 J2SE的全称是 JavaTM 2 Software Development Kit, Standard Edition (Java 2 SDK, Standard Edition)。本节介绍其下载、安装、设置以及其中本书所使用的主要工具。 1.1.1 下载 J2SE 访问 http://java.sun.com,在出现的主页中显示了Java 2 平台的三种不同版本:Enterprise Edition(J2EE)、Standard Edition(J2SE)和Micro Edition(J2ME)。本节使用的是J2SE。 单击“Standard Edition(J2SE) ”链接,在出现的页面中单击“J2SE Downloads”链接, 进而选择版本。由于自 1.4.0 版本开始集成了各种安全机制和相关的 API,因此请选择 1.4.0 或以上的版本。本书以 1.4.0 版本为例。 双击 1.4.0 版本的链接,在出现的下载窗口(http://java.sun.com/j2se/1.4/download.html) 中选择“Windows (all languages, including English)”一行、SDK 一列中的“download”链 接 , 最随后出现的协议窗口中单击“Accept”按钮,出现最后的下载窗口,单击“Download j2sdk-1_4_0_03-windows-i586.exe”,则提示保存目录并开始下载软件。该软件大小为 37,118,676 bytes。 在上述过程中同时可下载 J2SE 的文档。在文档中包含了多个教程和 API 文档。 也可在一些FTP搜索引擎如 http://bingle.pku.edu.cn中输入“j2sdk-1_4”关键字搜索一些 国内的下载站点。 1.1.2 安装 J2SE J2SE安装过程如下: 11 (1) 开始安装 双击下载的 J2SE 安装程序,在出现的初始安装界面中单击“Next”按钮,出现许可协 议窗口,选择“Yes”接受协议。 (2) 选择安装目录 接着选择安装目录。不同版本的 J2SE 默认安装目录不同,对于 j2sdk-1_4_0_03-windows-i586.exe,默认安装目录是 c:\ j2sdk1.4.0_03,不妨单击“Browse” 按钮,重新设置安装目录为 c:\ j2sdk1.4.0。这样,本书叙述中对不同的改进版本就可以统一 使用 c:\ j2sdk1.4.0 代表 J2SE 的安装目录。继续单击“Next”按钮。 (3) 选择安装的组件 在接下来的窗口中选择欲安装的组件(如 图 1-1),如果硬盘空间足够的话不妨安装所 有组件。其中“Program Files”一项是必选的。“Java Source”组件提供了组成Java平台的所 有类的源代码。在本书有些章节中会对利用部分源代码来理解Java各种文档和教程中某些比 较含糊的地方。 图 1-1 选择所安装的组件 (4) 选择使用 Java Plug-in 的浏览器 在 图 1-1的窗口中单击“Next”按钮,出现 图 1-2所示的窗口。在 8.6 节中将在浏览器 中使用Java Plug-in来运行Java Applet,这里可选择所使用的浏览器类型。 12 图 1-2 选择使用 Java Plug-in 的浏览器 (5) 结束安装 继续单击 图 1-2中的“Next”按钮将开始实际的安装过程,最后单击“Finish”按钮结 束安装。 1.1.3 设置 J2SE 对 J2SE 的设置主要是设置环境变量,以方便使用安装目录下 bin 子目录中的各种工具。 由于 J2SE 的编译、运行多在 DOS 窗口进行,为了能在任何目录中使用 c:\j2sdk1.4.0\bin 目 录下的工具,可在 Windows 9X 操作系统 C:盘根目录的 autoexec.bat 中加入如下一行: set path=c:\j2sdk1.4.0\bin;%path% 则以后每次打开 DOS 窗口时,会自动将 c:\j2sdk1.4.0\bin 目录加入搜索路径(第一次设 置时需重新启动计算机才生效)。在 DOS 中执行一个程序时,如果当前目录没有该程序,会 自动到 c:\j2sdk1.4.0\bin 等目录查找。 如果使用的是Windows 2000 或Windows XP,可打开“控制面板”,双击其中的“系统”, 在系统特性窗口单击“高级”选项卡,进而单击“环境变量”按钮。在出现的环境变量窗口 中,在“系统变量”中选择“Path”,单击“编辑”按钮,在弹出的“编辑系统变量”的窗 口中变量值最后加上“; c:\j2sdk1.4.0\bin”。如 图 1-3所示。 13 图 1-3 设置系统变量 单击多次“确定”后,无需重新启动计算机,则每次打开 DOS 窗口时将自动将 c:\j2sdk1.4.0\bin 目录加入搜索路径。 2.1.4 J2SE 的主要工具 Java 2 SDK 的主要工具安装在 c:\j2sdk1.4.0\bin 目录,这些工具主要功能如下,本书主 要使用了其中的 javac、java、jar、keytool、policytool、Jarsigner、HtmlConverter 和 appletviewer 工具。 基本工具: javac Java 编程语言的编译器。本书各章的程序都是在 DOS 窗口中通过执行 “javac 文件名”来编译 Java 程序的。文件名必须以.java 为后缀,编译以 后生成.class 为后缀的字节码文件。 java 用于执行 Java 应用程序。本书各章的程序大都通过在 DOS 窗口输入“java 字节码文件名称”来运行 javac 编译好的程序。输入命令时,字节码文件名 称的后缀不输入。 javadoc 用于生成 API 文档。在编写程序时将注释语句写在“/**”和“*/”之间, 则其内容便可被 javadoc 识别,执行“javadoc *.java”,自动生成 API 文 档。 appletviewer 没有 Web 浏览器时可用来运行和调试 Java Applet 程序,本书 8.6 节使用了 该工具。 jar 管理 jar 文件。本书多次使用该工具将 Java 程序打包成为一个文件,并进 而进行进一步的处理。 jdb Java 调试器 javah C 头文件和存根的生成器,用于编写本地文件。 javap 类分解器。可显示字节码文件的包、标记为 public 及 protected 的变量和方 14 法等信息。 extcheck 检测 jar 文件的版本冲突 RMI 工具: rmic 生成远程对象的架构和存根。执行后可根据给定的字节码文件 XX.class 可 生成 XX__Stub.class 和 XX_Skel.class 文件部署在 RMI 系统中。 rmiregistry 提供远程对象的注册服务。RMI 客户程序可通过该服务找到远程对象。 rmid 启动激活系统后台程序。 serialver 返回类的 serialVersionUID 国际化工具: native2ascii 将本地编码的文本转换为 Unicode 编码 安全工具 keytool 管理密钥库和证书。本书自第 5 章起大量使用该工具。 Jarsigner 对 jar 文件进行签名,并验证 jar 文件的签名。本书第 8 章使用它为 jar 文 件签名,实现基于代码所有者的授权。 policytool 管理策略文件的图形界面工具。本书第 8 章开始使用它进行各种授权操作 Java IDL and RMI-IIOP 工具 tnameserv 提供访问名字服务 idlj 根据给定的 IDL 文件生成 Java 绑定,使 Java 程序可以使用 CORBA 功能 orbd 在 CORBA 环境中使客户透明地定位和执行服务器上 persistent 对象 servertool 应用程序编写者注册、取消注册、启动、关闭 persistent 服务器的命令行工 具。 Java Plug-in 工具 unregbean 用于取消 Java Bean 组件的注册 HtmlConverter 修改调用 Applet 的 HTML 网页,将其中的