📄 webϵͳ
字号:
<td width="43" height="18"><div align="right"><font color="82856B">04</font></div></td>
</tr>
<tr>
<td height="5" colspan="2" background="/images/line4.gif"></td>
</tr>
</table>
</div></td>
</tr>
<tr>
<td><table width="176" border="0" cellspacing="0" cellpadding="3" align="center">
<form name="form1" method="post" action="/script/search.asp" target="_blank">
<tr>
<td height="30" width="52"> <div align="right">关键字:</div></td>
<td height="30" width="112"> <input name="Key" type="text" class="text" id="MemberName22" size="12" maxlength="20" target=_blank>
</td>
</tr>
<tr>
<td width="52" height="30"> <div align="right">类 型:</div></td>
<td width="112" height="30"> <select name="SearchType" id="SearchType">
<option value="0" selected>--选择类型--</option>
<option value="1">文章教程</option>
<option value="2">教程/软件下载</option>
<option value="3">插件搜索</option>
</select></td>
</tr>
<tr>
<td colspan="2" height="2"> <div align="center">
<input name="Submit" type="submit" class="buttonface" value="查 询">
</div></td>
</tr>
</form>
</table></td>
</tr>
</table></td>
</tr>
</table>
<table width="770" border="0" align="center" cellpadding="0" cellspacing="0" bgcolor="#FFFFFF">
<tr>
<td height="1" background="/images/line.gif"></td>
</tr>
</table>
<table width="770" border="0" align="center" cellpadding="0" cellspacing="0" bgcolor="#FFFFFF">
<tr>
<td height="22"><table width="100%" border="0" align="center" cellpadding="0" cellspacing="0">
<tr>
<td height="22" bgcolor="#C60400"> 导航:<a href="/default.htm">首页</a>
--> <a href=/webdesign/default.htm class=navigatelink>网页制作</a> --> <a href=/webdesign/8/index_1.htm class=navigatelink>Java/JSP</a>
--> 正文</td>
</tr>
<tr>
<td height="1" background="/images/line.gif"></td>
</tr>
</table>
<TABLE width=100% height=22 border=0 align="center" cellPadding=0 cellSpacing=0>
<TBODY>
<TR>
<TD height=22><table width="98%" border="0" align="center" cellpadding="0" cellspacing="0">
<tr>
<td height="50"><div align="center"><B><FONT color=#990000 size=3>
Web系统中文档的数字签名问题
</FONT></B></div></td>
</tr>
<tr>
<td height="30" valign="top"><div align="center">来源:<FONT color=#669999>
赛迪网
</FONT> 作者:<FONT color=#669999>
Svetlin Nakov 著 陈娇娇
</FONT></div></td>
</tr>
<tr>
<td><table width="95%" border="0" align="center" cellpadding="0" cellspacing="0">
<tr>
<td valign="top"><span id="zoom" class="font10">
<P>假设我们正在开发一个信息系统,这个系统拥有基于Web的用户界面,通过因特网我们可以使用这个界面。这个系统的用户必须能够发送文档到服务器。而且这些文档可以是不同格式的文件——MS Word .DOC 文件、Adobe Acrobat .PDF 文件、MS Excel .XLS 文件、JPEG和GIF图像、文本文件等等。为了追踪发送者的标记并且保证没有人在他们发送之后修改文档,系统有必要为用户提供数字签名发送的文件。让我们讨论一下在实现这种系统的过程中所产生的问题。 </P>
<P>公匙加密方法 </P>
<P>为了数字签名的需要,系统可以使用公匙加密算法,并且为了校验签名该文档的用户的标记,使用数字证书是最方便的。 </P>
<P>使用自签发证书 </P>
<P>证书可以是自签发的(self-signed ),或者是由认证机构颁发的。如果用户给自己颁发自签发的证书并且是用它们来签名文档,那就不能保证某些恶意用户不给自己颁发另一个名字的证书并且即使它是其他用户他也能签名文档。我们应该找到更好的方法来避免这个安全漏洞。 </P>
<P>使用本地认证机构 </P>
<P>负责系统维护的人——系统管理员——发行数字证书,这是有可能的。有两种方法可以做这件事——要么系统管理员为用户生成公匙和私匙,要么他们自己生成。在第一种情况下很有可能系统管理员会滥用职权。保留用户亲自生成他们的公匙和私匙的可能性,在他们发送公匙和有关他们标记的信息给系统管理员之后,系统管理员相应的颁发证书。这种设计的缺陷就是无法保证用户不伪造它们的标记信息。唯一可做的就是每个用户亲自提交他的公匙并且管理员在仔细检查他的ID证件后才给他颁发证书。这种方案要更加可行一些,但是实际上管理员充当了认证机构的角色,并且他仍然能够滥用他的证书颁发权利。 </P>
<P>使用许可的认证机构 </P>
<P>为了管理证书的问题,我们可以使用许可的认证机构的服务。系统中的每个用户可以从认证机构处购买证书,并且认证机构能够保证证书确实属于他所颁发的用户。对应于任何证书的私匙只有他的所有者才能使用,其他人不能。这就保证了当用户使用许可的认证机构颁发的证书签名文档时,确实是他的签名。只有在恶意用户获得其他用户的私匙时才有可能伪造,而用户是要为私匙承担个人责任的。 </P>
<P>数字证书购买对于每个用户来说都有一定的费用,但是这是保证安全性的唯一可靠方法。通常除了证书之外,用户还会获得一个PFX文件,这个文件包含证书以及对应的私匙,私匙受密码保护。如果购买的结果是认证机构直接安装证书到客户端的Web浏览器上,那么用户就能够将它扩展成一个PFX文件(采用PKCS#12 的格式)并且从安装的那一刻起就可以用它来签名文档。我们假定拥有他们自己证书的用户也拥有受保护的密码存储(PFX文件),该密码存储保存着他们的私匙以及他们的证书。 </P>
<P>只在客户端的设备上签名是可能的 </P>
<P>签名需要访问签名用户的私匙。因为每个用户的私匙只有他自己才能访问的道,所以有必要让签名在他的PC上进行。否则用户就不得不发送他的私匙给服务器,这就面临着一个潜在的安全危险——密码可能在途中被盗。在用户的PC上对Web应用中的文档进行签名不是一件容易的事情,因为在他的配置中客户端只有一个标准的Web浏览器——他没有为签名文档配置内建的功能。 </P>
<P>在客户端的设备上数字签名的方法 </P>
<P>我们将分析在客户端的PC上签名文档的可能方法。我们还要考虑将签名过程与负责接收签过名的文档的Web 应用集成。 </P>
<P>使用外部签名工具 </P>
<P>一种可能的方法就是使用户在他们的PC上安装某些专门设计的软件,但是这个有一定的困难。一个就是签名软件必须有支持用户使用的不同操作系统的不同版本。而且,对这种软件做支持是很笨重的,因为对它的任何修改都会迫使用户下载和安装新版本。与系统的Web接口集成也是一件困难的任务,并且如果软件安装不好的话,用户用起来就会有麻烦。用户不想在他们的PC上安装该软件还有一个可能原因就是安全性,而且如果他们不使用它们自己的设备,他们就无法使用外部签名工具。 </P>
<P>上述原因使得我们不得不寻找另外一条解决在客户端的设备上数字签名问题的方法。 </P>
<P>使用客户端脚本技术 </P>
<P>使用JavaScript或者其他客户端脚本技术,如ActiveX、 Macromedia Flash、.NET Windows Forms Controls 或者 Java-applets,是可行的。 </P>
<P>JavaScript语言的问题就是他并不支持处理数字签名和证书所需的标准功能。除了他不能获得到安装在用户的Web浏览器上的证书的访问之外,他还不能访问外部的受保护的密码存储。而且JavaScript还不能访问本地的文件系统,从而不能读取应该被签名的文件。 </P>
<P>Macromedia Flash 技术也不支持数字签名和证书,而且它不能访问本地的文件系统,而这是必须的,因为在签名之前,文件必须读取。 </P>
<P>从技术上来说,ActiveX controls 提供了一个解决方案,但是他们只能作用于Microsoft Windows 上的Internet Explorer。意外地,除了IE之外一些其他的浏览器也支持ActiveX controls,但是ActiveX技术不能在非微软的操作系统上运行。这就将用户限制在那些使用MS Windows和IE的用户群之中。 </P>
<P>Windows Forms Controls 也只能作用于IE,并且它们还需要额外安装Microsoft .NET Framework。要求用户为了能够签名Web应用中的文档就使用IE、MS Windows 和.NET Framework,这是不能接受的。 </P>
<P>最后一个方案就是使用Java applets。他们的优点是他们能够作用于所有知名的浏览器,也能运行在所有的操作系统上。缺点就是他们不能访问他们正在运行的设备上的本地文件系统,但是使用签名的Java applets可以克服这个缺陷。我们来看看Java applets究竟能给我们提供 什么。 </P>
<P>Java Applets </P>
<P>Java applets 可编译成Java 程序,这个程序可作为对象嵌入到HTML文档中,并且浏览该文档时可被Web浏览器执行。嵌入applet到Web页中与嵌入图片非常相似,不同的是applets 不仅仅是图形图像。他们是为他们的图形用户界面使用它们所在页面的整个矩形区域的程序。 </P>
<P>Applets包含一个(或者几个)编译的Java 类,这些类保存在JAR文件中。与所有的Java程序一样,applets可被Java Virtual Machine (JVM) 执行,因此所有的Java激活的Web浏览器都有虚拟设备,这些虚拟设备要么内建,要么另外安装。当包含applet 的HTML 文档被打开时,浏览器装载它的虚拟设备并在其里面启动该applet。为了保证用户的安全性, applets不允许执行可能访问运行该applet的设备上的用户信息的操作。 通常applet不能访问本地文件系统,这使得为数字签名的目的而使用该技术变得有点困难。 </P>
<P>签名的 Java Applets </P>
<P>签名的Java Applets 为增强正规的applets 许可提供了一个机制。与所有其他的applets 一样,他们提供了JAR档案,这个档案包含一组编译的Java 类,但是除了这些之外他们还包含所有这些类的数字签名以及数字证书(连同它完整的认证链一起),通过数字证书可以校验这些签名。在签名的applet的执行之上,Web浏览器还显示来自用来签名applet的证书的信息,并且询问用户它是否相信该证书。如果用户信任它,applet无条件执行并且可以自由的完全访问他运行所在设备的本地文件系统。信任由未知软件开发商签名的applet,或者证书没有得到校验就签名的applet是非常危险的,因为这些applet可以获得对设备的自由访问并且能够执行所有的恶意代码 ,如病毒或者特洛伊。 </P>
<P>让我们一步步解决编写用于数字签名文档的Java-applet 过程中所存在的个别问题。 </P>
<P>用jarsigner签名Java Applets </P>
<P>为了访问本地文件系统applet必须签名。假设我们已经编写了Java-applet 的代码并且已经将他编译成文件Applet.jar。签名这个JAR文件是有必要的。为此我们可以使用工具jarsigner ,它是与JDK 1.4一起标准发行的。 如下所示: </P>
<P><BR><CCID_NOBR>
<TABLE cellSpacing=0 borderColorDark=#ffffff cellPadding=2 width=400 align=center borderColorLight=black border=1>
<TBODY>
<TR>
<TD class=code style="FONT-SIZE: 9pt" bgColor=#e6e6e6><PRE><CCID_CODE>jarsigner -storetype pkcs12 -keystore keystore.pfx -storepass store_password -keypass
private_key_password Applet.jar signFilesAlias</CCID_CODE></PRE></TD></TR></TBODY></TABLE> </P>
<P><BR>该命令使用私匙签名JAR文件Applet.jar,私匙是保存在受保护的名为signFilesAlias的密码存储keystore.pfx之内的,使用密码store_password 和private_key_password 可以相应的访问密码存储和私匙。Jarsigner工具支持两种类型的受保护的用于密码和证书的存储(密码存储)——Java Key Store (.JKS)和PKCS#12 (.PFX 文件)。为了使用它,我们必须有一个由认证机构(包含证书以及其相应私匙的PFX文件)颁发的证书或者我们必须生成我们自己的自签发证书。 </P>
<P>生成自签发证书 </P>
<P>我们可以使用工具keytool来生成我们自己的自签发证书。keytool也是与JDK 1.4一起标准发行的。如: </P>
<P>
<TABLE cellSpacing=0 borderColorDark=#ffffff cellPadding=2 width=400 align=center borderColorLight=black border=1>
<TBODY>
<TR>
<TD class=code style="FONT-SIZE: 9pt" bgColor=#e6e6e6><PRE><CCID_CODE>keytool -genkey -alias signFiles -keystore SignApplet.jks -keypass !secret -dname "CN=My Company"
-storepass !secret</CCID_CODE></PRE></TD></TR></TBODY></TABLE> </P>
<P><BR>该命令生成一个X.509 证书和一个相应的私匙,并且将他们保存在密码存储SignApplet.jks 的名signFiles 之下。在证书中,它的所有者写成"My Company",并使用密码"!secret" 来控制对密码存储和私匙的访问。keytool 工具默认存储格式为JKS (Java Key Store)。 </P>
<P>而且,我们可以采用如下方式用此证书来签发我们的applet : </P>
<P>
<TABLE cellSpacing=0 borderColorDark=#ffffff cellPadding=2 width=400 align=center borderColorLight=black border=1>
<TBODY>
<TR>
<TD class=code style="FONT-SIZE: 9pt" bgColor=#e6e6e6><PRE><CCID_CODE>jarsigner -keystore SignApplet.jks -storepass !secret -keypass !secret Applet.jar signFiles</PRE></TD></TR></TBODY></TABLE> </P>
<P><BR>该命令使用私匙签发applet Applet.jar。该私匙保存在用于访问密码"!secret"的密码存储SignApplet.jks的名"signFiles"之下。因此,我们可获得一个签名的JAR文件,该文件包含Applet.jar 检索到的所有文件格式,以及这些文件的数字签名和来自密码存储SignApplet.jks 的证书(注:密码存储SignApplet.jks具有完整的认证链)。如果编写的输出文件没有给出文件名,如例中所示,输入JAR文件也可用作输出JAR文件。 </P>
<P>嵌入Applets到HTML文档内 </P>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -