想要用applet进行本地串口操作,已经对打包后的jar文件进行了数字签名,连安全策略也改了,可还是会出现 java.security.AccessControlException: access denied (java.util.PropertyPermission javax.comm.properties read)的问题.怎么会这样呢?
还想请教一下,在客户端还需要对安全策略进行修改吗?
对不起没有分了,还请大家帮帮忙,万分谢谢~~

解决方案 »

  1.   

    以前做过一个通过串口连接PDA进行数据传输的applet,具体怎么做忘记了。
    我看能否找到以前的代码
      

  2.   

    要使用RSA算法进行数字签名,才能保证赋予Applet所有权限。
      

  3.   

    不好意思,想起来了,本来也是希望能直接通过串口与PDA通讯的,后来由于其它原因没有直接通过串口而采用了其它的方式,呵呵。
      

  4.   

    RSA算法进行数字签名???
    要怎么做呢~?能否大概讲一下~?谢谢~~
      

  5.   

    hehecafe(我喜欢从高处跳下来的感觉) 还是很谢谢你~
      

  6.   

    假设你要签名的jar文件名叫hello.jarbash-3.00$ keytool -genkeypair -alias helloworld -keyalg RSA -keysize 1024 -keypass helloworld -keystore keystore.db -storepass helloworld
    What is your first and last name?
      [Unknown]:  Hello
    What is the name of your organizational unit?
      [Unknown]:  World
    What is the name of your organization?
      [Unknown]:  FBI
    What is the name of your City or Locality?
      [Unknown]:  New York
    What is the name of your State or Province?
      [Unknown]:  New York
    What is the two-letter country code for this unit?
      [Unknown]:  US
    Is CN=Hello, OU=World, O=FBI, L=New York, ST=New York, C=US correct?
      [no]:  yesbash-3.00$ jarsigner -keystore keystore.db -storepass helloworld -keypass helloworld hello.jar  helloworldWarning:
    The signer certificate will expire within six months.按照上面的命令就产生了一个用RSA数字签名过的hello.jar
    具体的keytool和jarsigner的命令可以参看Java Document帮助。
      

  7.   

    rehte() 我照你说的方法做了,可是.....抛出的异常变成了java.security.AccessControlException: access denied (java.io.FilePermission C:\PROGRA~1\Java\JRE15~1.0_1\lib\javax.comm.properties read)
    相应的,我又去修改了下安全策略文件,添加了
    grant codeBase "file:/C:/Program Files/Java/jre1.5.0_10/lib-" {
      permission java.security.AllPermission;
    };
    结果还是不行.....是不是我的安全策略文件改的有问题?
      

  8.   

    不要使用任何policy文件,试一试。
      

  9.   

    不使用任何policy文件??
    对不起,我不太明白你的意思?
      

  10.   

    你的policy文件放在哪儿的?怎么指定它的?是不是修改了jre/lib/security/java.security文件?
      

  11.   

    你用浏览器运行你的applet吧,你的html页面怎么写的?怎么嵌入你的applet的?
      

  12.   

    我说的policy文件就是指的是你的所谓安全策略文件啊
      

  13.   

    我这不知怎的,装了两个jre.....系统调用一个,用户两个都调用了....我就把两边的policy文件都改了....至于java.security文件我倒没注意....这就去看....
    嵌入代码如下:
    <APPLET   
            ARCHIVE = "appjar.jar"
            CODE="appjar.theone"
            NAME="pplet" 
            HEIGHT=100 WIDTH=100 >
    </APPLET>
      

  14.   

    不要改任何系统安全策略文件,那是用来控制java平台的安全的,你改了它当然不能进行任何操作了!
    把所有的改动都还原!
    html代码不要动,就那个样,然后你在试试。
      

  15.   

    我说的policy文件就是指的是你的所谓安全策略文件啊
    我的意思是,我不明白怎么个不使用法?是指不改它么?
      

  16.   

    改回去后,异常又变回了.....
    java.security.AccessControlException: access denied (java.util.PropertyPermission javax.comm.properties read)
      

  17.   

    所有的安全策略文件都不要动,原来啥样就是啥样,不要做任何改动。
    恢复到你刚装完jdk时的模样。
      

  18.   

    将用户目录下的.java.policy也删除了。
    就是c:\document and settings\<user name>\下面的以java.policy文件都删除。
      

  19.   

    你指的是这个里面的东西么?
    C:\Documents and Settings\Administrator\Application Data\Sun\Java\Deployment
    我用java的控制面板删除了,是这样么?如果只是C:\Documents and Settings\Administrator的话,我没有发现有.java.policy文件.
    结果依旧.....
      

  20.   

    假设你的java安装在JAVA_HOME下,你有没有修改:
    JAVA_HOME/jre/lib/security/java.policy
    或者任何其他相关的
    jre/lib/security/java.policy?
    这些文件都是java平台的安全策略文件不能修改。
    如果实在不行,建议你将你的操作系统上的所有java安装都删除干净了,包括那个java目录,然后在重新安装一个jdk,然后,什么都不要动运行你的applet,试一试。
      

  21.   

    你下载applet时,有没有问你是否接受某个证书之类的对话框?正确的话应该有一个询问的对话框,然后你选择是,然后才运行,如果没有这个现象,说明的你的jar没有更新。
      

  22.   

    有啊~当然有~~
    并且我刚还特地又重新给jar签了一次名,结果依旧.....
      

  23.   

    晕,难到是java的一个bug?
    理论上来说,如果想使得Applet拥有所有权限,只要使用RSA证书签名,然后用户接受这个证书,任何其他地方都不用做修改就可以的。
      

  24.   

    刚刚我在java控制面板里把启用跟踪打开,发现证书验证最后结束时有一点可疑.
    如下:
    security: 使用 Internet Explorer ROOT 证书无法成功验证证书
    security: 无可用的时间标记信息
    basic: 模态已推进
    basic: push sun.awt.windows.WToolkit@bb6ab6
    basic: 模态已推进
    basic: 模态已弹出
    basic: pop sun.awt.windows.WToolkit@bb6ab6
    security: 用户只对此会话的代码授予权限
    security: 正在将证书添加到部署会话证书库中
    security: 已将证书添加到部署会话证书库中
    security: 正在将证书保存至部署会话证书库
    security: 已将证书保存至部署会话证书库会不会是这里的问题?
      

  25.   

    对了,你使用的java是那个版本?是不是Sun的JDK?还是Microsoft JVM还是IBM的、还是BEA的?
      

  26.   

    版本信息如下:
    版本 1.5.0 (build 1.5.0_10-b03)
    版权所有 2006 Sun Microsystems, Inc.
      

  27.   

    你能不能把你的jdk重装一遍,清理一下环境?
      

  28.   

    我明白为什么不行了!
    你的applet肯定调用其他的类库了,而其他的类库是没有经过RSA签名的。需要保证你的applet本身、以及它所调用的第三方类库都要经过RSA签名才行!
      

  29.   

    只对applet所在的jar签名只会保证这个jar包所包含的所有的类拥有所有权限,而不能保证它所引用的其他的类库也同样拥有权限,其他的类库仍然只有沙箱的权限,所以要把你所有用到的jar都进行RSA签名,过程和前面一样。问题不是jdk产生的。
      

  30.   

    但看上面你的html代码好像没有第三方类库啊?不应该啊,你难道使用到的所有的类都打包进了一个jar中?
      

  31.   

    - -
    无论怎样,都等我JDK装完了再说吧.....
      

  32.   

    有在jar中的class文件中调用comm的jar文件,操作串口嘛~
    但是,它应该是作为本地文件被访问的呀~?
      

  33.   

    对了,当我把JDK卸了以后,发现JB依然可以运行.也就是说,JB运行是靠它自带的JDK的吧?那既然有JDK,为什么jar文件却不能用了(图标为不可用)?
      

  34.   

    所有被访问的类所在的jar包都要使用RSA签名,除了Java平台的系统类(比如String)之外。其中复杂的道理临时也和你说不清楚。
      

  35.   

    JB使用 的是自己的jdk,它没有在系统上注册(主要是注册表某些键值),所以浏览器和操作系统感知不到它。
      

  36.   

    可是,难道要把comm相关的那3个文件也都打进包里??
    还是说只要comm.jar??我觉得应该是通过applet调用客户端的comm相关文件,来进行串口操作.
    你觉得呢?
      

  37.   

    如果只是资源文件,就不用了,另外comm.jar要RSA签名。
      

  38.   

    你要对comm.jar和appjar.jar分别签名,不用将comm.jar打包进你那个applet.jar
    并且将你的html代码写成:
    <APPLET
    ARCHIVE = "appjar.jar,comm.jar"
    CODE="appjar.theone"
    NAME="pplet"
    HEIGHT=100 WIDTH=100 >
    </APPLET>
      

  39.   

    装好了,试了一下,异常又变了...
    public static boolean appjar.PortOP.open() throws javax.comm.UnsupportedCommOperationException,java.io.IOException,javax.comm.NoSuchPortException
    可以理解为关于沙盒限制的问题已经解决了么......?
    可是,同时我在测试的另一个文件读取(同样通过applet)程序,依然不行....
    ...我觉得我快疯了....
      

  40.   

    从异常来看,沙箱问题已经解决了。凡是java.security.AccessControlException: access denied都是沙箱安全策略问题。这个问题是你自己的程序的问题了,我没有办法解决。
      

  41.   

    那3个文件就是commAPI安装时要装的comm.jar ,javax.comm.properties ,和一个dll文件.只有装了这3个文件,才能使用java进行串口操作.
      

  42.   

    那个文件读取一样是java.security.AccessControlException: access denied的问题....
    还有,现在我的jarsinger不能用了.....= =||
    不管了,我要回家了....饿了....
    可不可以加我的QQ呢?32053666
    非常感谢你的帮助~~
      

  43.   

    知道你的问题所在了,你需要将dll和javax.comm.properties打包进你的comm.jar中,当然打入的位置要看具体你的comm.jar怎么调用和使用dll和javax.comm.properties文件的。
      

  44.   

    我没有qq,也累死我了,我有gmail:
    [email protected]
      

  45.   

    同情你,不过你的java编程经验也太少了...
    这些本来属于比较基础的问题啊
      

  46.   

    没错,我的经验确实太少了.我才毕业(确切的说还没毕业),才刚实习.什么也不懂,麻烦你了.
    我想你也许没有用过comm吧?它是java的扩展API,我不能也不会改它....- -
    必须放在JDK下面啊~如果你有兴趣的话,可以去下面这个网页里看看它的简介.
    http://www.fixbase.com.cn/bbs/simple/index.php?t1170.html
    另外,问题依然没解决.....昨天我看错了....对不起.....
      

  47.   

    它这个页面的安装方法不适合于Applet部署,难道你的每个用户还要装完JRE后,然后把这些东西下载了拷贝到相应目录去?肯定不行,他的方法只适合于独立应用程序使用,对于Applet这种下载代码运行的程序是不行的,是无法部署到客户端的。
    应该有其他方法实现的。
      

  48.   

    http://java.sun.com/products/javacomm/reference/faqs/index.html
    这上面解释了一些comm的FAQ:
    Q: Can I use the Java communications API in applets?A: Yes in signed applets, but no in unsigned applets (most cases). Since we do not allow unsigned applets access to any communications port under the JDK1.1 security model, you can not use the Java communications API with unsigned applets. We do plan to be compliant to JDK1.2 security model in later releases, which might allow trusted applet access to ports. 
      

  49.   

    目前的javax.comm还不兼容JDK1.2的安全模型,只适合于JDK1.1的沙箱安全模型。
    但我想如果你这样:
    1.安装一个JDK
    2.将jar拷贝到jre/lib/ext,dll拷贝到jre/bin,还有javax.comm.properties拷贝到jre/lib目录下,注意把你机器能发现的jre的这三个目录都拷贝了,我恐怕你浏览器上使用的jre是和你拷贝jre不一样的目录,注意如果你安装了一个jdk,实际上它会有两个jre。因此最好把你机器上所有的这些地方都拷贝全了。
    3.签名你的applet.jar
    应该是可以的。
      

  50.   

    还有,就象我昨天说的,除了测试那个操作串口的applet外,我还有同时测试一个读写文本的applet,同样的java.security.AccessControlException: access denied问题.
    所以我想,暂时应该和comm那边没什么关系.
      

  51.   

    这个和comm没有关系。
    我突然想起来,原因可能是你的html代码,<applet这种模式写法要使用jdk带的converter转化一下才行,才能使用正确的jre,很有可能是这个原因。
      

  52.   

    你到JDK/lib目录下,找到一个htmlconverter.jar的jar,运行:
    java -jar htmlconverter.jar -gui