资源描述:
第七章,Java2安全技术,-2-,简介安全限制和许可安全策略Policy辅助工具签名及发布,目标,-3-,简介Java中的安全,Java是网络上使用的编程语言,安全性是非常重要的,特别是Java平台的安全以及Java技术部署带来的安全问题,尤其值得认真考虑。Java中的安全包括两个方面1提供安全且易于构建的Java平台,能够以安全模式运行Java实现的应用程序。2提供用于编程语言的安全工具和服务,实现较广泛的安全。,-4-,Java平台提供的原始安全模型称为沙箱模型JDK1.0,该模型提供较窄环境沙箱来运行没有得到信任的代码。在沙箱模型中允许得到信任的本地代码访问重要资源,而没有经过信任的远程代码只能访问沙箱内的很少部分资源。在JDK1.1中引入签名Applet的概念,如果签名的密钥由接收Applet的客户端认为是可信任的,那么这个经过正确数字签名的Applet就可以当作可信任本地代码访问重要资源。这里签名Applet和它的签名以JAR格式传送。随着发展,在原来沙箱模型的基础上引入新的安全体系,形成Java2平台安全模型如图1所示。,简介Java2安全平台模型,-5-,从图1中可以看出,不管本地还是远程,签名还是未签名的代码都统一到类加载器处,咨询安全策略,然后决定代码能够访问的资源。Java2安全平台模型较之以前有了很大的改进,其主要特点如下,简介Java2安全平台模型,图1,-6-,1细粒度的访问控制。2易于配置的安全策略。3易于扩展的访问控制结构。4安全检查扩展到所有Java程序,包括应用程序和Applet。,简介Java2安全平台模型,-7-,图1中的多个沙箱模型可以看作有固定边界的保护域。所谓保护域是指一个对象集合,这些对象可以由安全策略中定义的一条规则直接访问。保护域分为系统域和应用程序域,受保护的资源,像文件系统、网络设施以及屏幕和键盘,只允许系统域进行访问,而应用程序域可以通过授权许可访问受保护资源。类加载器将本地或远程代码Applet载入的同时,策略文件给出域的划分和不同代码对不同域访问权限的许可,载入的类就根据域划分和权限许可来访问相应的域资源。图2为运行中类到域再到许可的映射。,简介Java2安全平台模型,-8-,图2类到域再到许可的映射,,简介Java2安全平台模型,-9-,安全限制和许可,本地的代码类访问系统资源时通常不会受到太大的限制,所以本章主要讨论从服务器下载到客户端的远程代码Applet访问客户端资源的情况。Applet访问客户端资源时,由于Java内嵌的平台安全性机制受到较大的限制,通常表现在无法读写客户端的文件,无法采集客户端音频。例如,当Applet实现的是客户端和服务器端进行语音聊天时,客户端采集音频就会受到限制,还有无法启动客户端的Socket进行传输等。下面看一个文件访问受到安全限制的例子。,-10-,【例】编写一个用来读取客户端文件的Applet,客户端的文件路径及文件名为E\a.txt,文件内容为“你好,这是客户端的测试文件”,如图3右部分所示。将读出的文件内容显示在文本区域内,如果访问出错,异常信息也显示在文本区域内。//程序文件名AppletSecurity.javaimportjava.awt.*;importjava.awt.event.*;importjava.applet.*;importjava.io.*;publicclassAppletSecurityextendsApplet{,安全限制和许可实例,-11-,TextFieldfileNameField;TextAreafileArea;publicvoidinit{LabellblNamenewLabel“文件名“;LabellblContextnewLabel“文件内容“;fileNameFieldnewTextField35;fileNameField.addActionListenernewActionListener{publicvoidactionPeredActionEvente{loadFilefileNameField.getText;}};fileAreanewTextArea10,35;,安全限制和许可实例,-12-,addlblName;addfileNameField;addlblContext;addfileArea;}publicvoidloadFileStringfileName{try{BufferedReaderreadernewBufferedReadernewFileReaderfileName;StringcontextnewString;,安全限制和许可实例,-13-,whilecontextreader.readLinenull{fileArea.appendcontext“\n“;}reader.close;}catchIOExceptionie{fileArea.append“IO错误“ie.getMessage;},安全限制和许可实例,-14-,catchSecurityExceptionse{fileArea.append“安全访问错误“se.getMessage;}}},安全限制和许可实例,-15-,程序编写后,编译生成相应的类,将类嵌入HTML文件,从本地服务器加载,在载入Applet的界面上输入文件名E\a.txt后按回车键,在界面的文本区域内并没有显示相应a.txt的内容,只是提示“accessdeniedjava.io.FilePermissionE\a.txtread”,表示访问拒绝,如图3左部分所示。,图3Applet访问文件出错显示和客户端文件内容,安全限制和许可实例,-16-,Java安全平台中受到的种种安全限制,在Java中都提供了一一对应的许可,例如对于读、写文件的限制,Java提供了java.io.FilePermission来许可对客户端文件的读、写等操作。下面看一下这些许可类。许可类代表对系统资源的访问权限。Java.security.permission类是抽象类,划分为多个子类来代表特定的访问。而不同的许可类属于不同的包,如FilePermission类属于java.io包,而SocketPermission类属于包。目前Java系统内嵌的主要的许可类如表1所示。,安全限制和许可许可类,-17-,表1Java内嵌的许可类,安全限制和许可许可类,-18-,建立这些类的对象就可以产生许可。例如,下面的代码用来产生许可读取/tmp目录下名为Hello的文件filePermnewjava.io.FilePermission“/tmp/Hello“,“read“;,,安全限制和许可许可类,-19-,安全策略Policy,1.keystore条目keystore用来存放密钥对和相关数字证书。数字证书像X.509证书链用来鉴别相应的公有密钥。keytool工具用来创建和管理keystore。Policy配置文件中指定keystore,用来查找grant条目中签名者的公有密钥。如果存在指明签名的grant条目,那么必须存在相应的keystore。Keystore条目的格式为keystore“url“,“type“,-20-,其中1keystore是保留字,表示keystore条目。2url指kestore的URL地址。3type指keystore的类型,用于定义keystore信息的存储和数据格式,以及保护keystore中的私有密钥和keystore完整性算法。通常情况下缺省类型为“JKS”。,安全策略Policy,-21-,2.grant条目policy对象中含有0到多条grant条目,指明远程代码访问特定资源的相关许可。grant条目的格式如下grantsignedBy“name“codeBase“url“{Permissionpermission-class-name“target-name“,“action-name“;Permissionpermission-class-name“target-name“,“action-name“;},安全策略Policy,-22-,其中1每个grant条目为由name签名且来源于codeBase的类的访问提供一系列许可permission-class-name。2grant为保留字,表示一条授权。3signedBy为保留字,指明签名者。4name为数字签名的作者名。5codeBase为保留字,指明代码来源。6url为指定代码的来源路径。,安全策略Policy,-23-,7Permission为保留期,指明许可名字及许可操作。8permission-class-name指许可类名。9target-name为受保护资源的名字,如文件目录。10action-name为对受保护资源进行操作的权限。,安全策略Policy,-24-,例如,下面为两条具体的grant条目,第一条表示允许lihua签名的网址http//192.100.100.438080/下的访问代码对temp目录的所有文件有读、写权限。第二条表示对本机java.home目录的子目录/lib/ext/下的所有代码授予任意访问受保护资源的权限。grantsignedBy“lihua“codeBase“http//192.100.100.438080/“{Permissionjava.io.FilePermission“tmp/*“,“read,wirte“;};grantcodeBase“file{java.home}/lib/ext/*“{permissionjava.security.AllPermission;};,,安全策略Policy,-25-,辅助工具密钥和证书管理工具,keytool为密钥和证书管理工具。它使得用户可以管理他们自己的公共密钥和私有密钥对以及相关的证书,用于在数字签名中进行数据完整性验证和身份验证。keytool将密钥对和证书存放在keystore中,keystore通常以文件的形式存在。创建keystore时需要为它设置密码,还要为其中的私有密钥设置密码。命令提示符状态下键入不带参数的命令keytool,可以看见它的用法,如图4所示。,-26-,图4keytool的用法,辅助工具密钥和证书管理工具,-27-,例如,在命令行提示符状态下键入如下命令行,生成UseImage.keystore文件,密钥和keystore的密码均为123456,显示结果如图5所示。keytool-genkey-aliasUseImage-keypass123456-keystoreUseImage.keystore-storepass123456其中1-genkey选项,表示生成新的密钥。2-alias别名选项,表示紧跟的参数为别名具体值UseImage。,辅助工具密钥和证书管理工具,-28-,3-keypass密钥的密码选项,表示紧跟的参数为密钥的密码具体值123456。4-keystore选项,表示紧跟的参数为生成的keysotre文件名称UseImage.keystore。5-storepasskeystore密码的选项,表示紧跟的参数为keystore文件的密码具体值123456。,辅助工具密钥和证书管理工具,-29-,图5生成文件UseImage.keystore,辅助工具密钥和证书管理工具,-30-,而要将公共密钥导入证书,则需要键入如下代码,生成UseImage.cer证书文件,结果如图6所示。keytool-export-aliasUseImage-fileUseImage.cer-keystoreUseImage.keystore-storepass123456,图6生成证书文件UseImage.cer,辅助工具密钥和证书管理工具,-31-,jarsigner用来对JAR文件进行数字签名和校验,这个过程基于keytool生成的keystore。在命令提示符状态下键入jarsigner后按回车键,可以看见用法及选项说明,如图7所示。,图7jarsigner工具的用法及选项,辅助工具签名和校验工具,-32-,常用的签名格式为jarsigner-keystorekeysotre-file-storepasskeystore-passwordjar-filealias其中1keystore-file为keytool生成的keystore文件。2keystore-password为keystore的密码。3jar-file文件为档案文件而且只能为档案文件。例如jarcvfUseImage.jarUseImage.classindex_01.gif;//生成JAR文件jarsigner-keystoreUseImage.keystore-storepassxueliangUseImage.jarUseImage//进行签名,辅助工具签名和校验工具,-33-,Policytool是图形用户界面工具,可帮助用户指定、生成、编辑一个安全策略。命令提示符状态下键入PolicyTool后按回车键,就可调出此图形界面。根据界面指示,可以实现一个policy文件的各种操作。下面来看一下系统默认的policy文件,将D\j2sdk1.4.0_01\jre\lib\security目录下的java.policy文件拷贝到E\_Work\Java\sample目录下,在命令行状态运行命令policytool,弹出“规则工具”对话框。单击“文件”菜单中的“打开”项,选择java.policy文件并打开,如图8所示。从图中可以看出允许两个CodeBase来源的远程代码。,辅助工具Policytool,-34-,图8使用policytool工具打开java.policy文件,辅助工具Policytool,-35-,选中第一个规则项目“CodeBase”file{java.home}/lib/ext/*“”,单击“编辑规则项目”按钮,弹出一个“规则项目”的窗口,如图9所示,可以看见签名项SignedBy为空,而权限一栏中为permissionjava.security.AllPermission;表示允许这个规则项目下的所有远程代码对系统的所有资源进行访问。,辅助工具Policytool,-36-,图9全部授权的权限列表,辅助工具Policytool,-37-,选中第二个规则项目“CodeBase”,单击“编辑规则项目”按钮,弹出如图10所示窗口。权限列表中可以看出对普通属性都有读的权限。这是客户端对所有远程代码的默认的安全限制列表。,辅助工具Policytool,-38-,图10所有远程代码访问的默认权限列表,辅助工具Policytool,-39-,这个默认的java.policy文件对应的源文件如下//StandardextensionsgetallpermissionsbydefaultgrantcodeBase“file{java.home}/lib/ext/*“{permissionjava.security.AllPermission;};//defaultpermissionsgrantedtoalldomains,辅助工具Policytool,-40-,grant{//Allowsanythreadtostopitselfusingthejava.lang.Thread.stop//thattakesnoargument.//Notethatthispermissionisgrantedbydefaultonlytoremain//backwardscompatible.//Itisstronglyrecommendedthatyoueitherremovethispermission//fromthispolicyfileorfurtherrestrictittocodesources//thatyouspecify,becauseThread.stopispotentiallyunsafe.,辅助工具Policytool,-41-,//See“permissionjava.lang.RuntimePermission“stopThread“;//allowsanyonetolistenonun-privilegedports.SocketPermission“localhost1024-“,“listen“;//“standard“properiesthatcanbereadbyanyonepermissionjava.util.PropertyPermission“java.version“,“read“;permissionjava.util.PropertyPermission“java.vendor“,“read“;permissionjava.util.PropertyPermission“java.vendor.url“,“read“;,辅助工具Policytool,-42-,permissionjava.util.PropertyPermission“java.class.version“,“read“;permissionjava.util.PropertyPermission“os.name“,“read“;permissionjava.util.PropertyPermission“os.version“,“read“;permissionjava.util.PropertyPermission“os.arch“,“read“;permissionjava.util.PropertyPermission“file.separator“,“read“;permissionjava.util.PropertyPermission“path.separator“,“read“;permissionjava.util.PropertyPermission“line.separator“,“read“;,辅助工具Policytool,-43-,permissionjava.util.PropertyPermission“java.specification.version“,“read“;permissionjava.util.PropertyPermission“java.specification.vendor“,“read“;permissionjava.util.PropertyPermission“java.specification.name“,“read“;permissionjava.util.PropertyPermission“java.vm.specification.version“,“read“;permissionjava.util.PropertyPermission“java.vm.specification.vendor“,“read“;permissionjava.util.PropertyPermission“java.vm.specification.name“,“read“;permissionjava.util.PropertyPermission“java.vm.version“,“read“;permissionjava.util.PropertyPermission“java.vm.vendor“,“read“;permissionjava.util.PropertyPermission“java.vm.name“,“read“;};,,辅助工具Policytool,-44-,签名及发布步骤,在user目录下建立AppletSecurity.java文件,源代码即为例10.1,编译后生成三个类AppletSecurity.class、AppletSecurity1.class和AppletSecurity2.class。1将生成的类文件打包成文档文件。jarcvfa.jar*.class,-45-,2为刚才创建的文件创建keystore。keytool-genkey-aliasa-keypass123456-keystorea.keystore-storepass1234563使用刚才生成的钥匙来对jar文件进行签名。jarsigner-keystorea.keystore-storepass123456a.jara4将公共钥匙导入到一个cer文件中。keytool-export-aliasa-filea.cer-keystorea.keystore-storepass123456,签名及发布步骤,-46-,5网页转换及修改。嵌入类的index.html写成,签名及发布步骤,-47-,使用htmlConverter工具,将index.html转换成使用插件的文件。源文件如下,签名及发布步骤,-48-,--,签名及发布步骤,-49-,通过IE访问index.html,在类加载过程中,弹出一个“Java安全警告”窗口,如下图所示。,证书的安全警告窗口,签名及发布结果,-50-,单击“授予该会话”按钮,则出现Applet界面,如图所示,载入的Applet界面,签名及发布结果,-51-,显示的文本内容,,签名及发布结果,在文件名栏敲入E\a.txt,然后按回车键以显示文本内容,如图所示。,-52-,练习,1.编写Applet,在客户端建立一个文件,测试Applet的安全限制和许可访问类,要求文件路径为“D\Hello.txt”,并存入数据“你好,欢迎来到Java世界”。编写的界面如图所示,文件名中写入路径,文件内容中写入数据,单击“存储”按钮,将数据存入客户端文件,单击“打开”按钮,又可以显示内容,将可能出现的异常输出到文本区域内。2.为习题1的Applet加入数字签名,并进行访问。,-53-,,用户界面,
展开阅读全文