Java7 安全机制和自签名证书的使用
created on 2013-11-13
updated on 2014-5-8
Java为了增强安全性,到1.7.45已经累计增加了若干安全功能,jar包中的META-INF/MANIFEST.MF文件被用来描述jar文件的配置信息和安全信息,在增加的安全信息中可以显式的定义7个安全属性。
1权限属性Permissions Attribute,它用来验证RIA运行时请求的权限与JAR文件生成中设置的权限一致性情况,它可以阻止别人用已经签名的程序重新部署并在不一样的权限下运行,该属性值可以设置sandbox或all-permissions,签名的Jar默认为all-permissions,未签名的默认为sandbox。
Sandbox:使Applet或Webstart运行在沙箱中,与本地环境隔离。
Manifest-Version: 1.0
…
Permissions: sandbox
….
MANIFEST.MF中定义的Permissions与applet的参数标签permissions保持一致为sandbox
<applet …>
<param name="permissions"value="sandbox" />
<applet>
all-permissions:使签名的Applet或Webstart在本地环境下不受限访问。
Manifest-Version: 1.0
…
Permissions: all-permissions
….
MANIFEST.MF中定义的Permissions与applet的参数标签permissions保持一致为all-permissions
<?xml version="1.0"encoding="utf-8"?>
<!-- JNLP File Application -->
<jnlp …
<security>
<all-permissions/>
</security>
</jnlp>
另外设置的属性值必须与applet标签或者JNLP的安全属性定义一致,当不一致时运行会被阻止,如果没有权限属性,在JAVA控制台安全级别安全级别为高或中时会弹出没有包含“权限”的黄色感叹号警告信息且无法隐藏,在JAVA控制台安全级别为非常高时会被阻止。
通过添加权限属性,可以去掉黄色背景提醒
假设MANIFEST.txt文件在classes下
Permissions: all-permissions
Application-Name: SSC File Transfer
Caller-Allowable-Codebase: https://127.0.0.1
Application-Library-Allowable-Codebase:https://127.0.0.1
Codebase: https://127.0.0.1
Trusted-Only: true
Trusted-Library: true
执行
cdD:\workspaces\eclipse_main\FileBrowserApplet\bin
jar cvfm filebrowser.jar MANIFEST.txtcn
2代码库属性Codebase Attribute
用来限制jar代码库在指定域名上的运行,防止在其他地址上恶意地重新部署未授权的应用。
值 |
匹配 |
不匹配 |
* |
All domains |
|
https://*.example.com |
https://a.example.com |
http://a.example.com |
www.example.com |
https://www.example.com, http://www.example.com |
http://example.com |
www.example.com:8085 |
https://www.example.com:8085, http://www.example.com:8085 |
http://www.example.com |
*.example.com |
https://a.example.com, http://a.example.com |
http://example.net |
127.0.0.1 |
http://127.0.0.1 |
http://localhost |
127.0.0.1:8080 |
http://127.0.0.1:8080 |
http://127.0.0.1 |
代码库属性必须与applet运行的实际地址一致,如果没有代码库属性,则会在控制台中显示警告,applet或者JNLP标签的代码库将会被使用。如果没有定义如HTTPS安全匹配的规则,则可能会被“中间人攻击“方式截取和攻击。
3应用名称属性Application-Name Attribute:用来在安全对话框中显示签名应用的名称。
Application-Name:Hello World
如果没有应用名称属性,则会在控制台中显示警告,并使用入口类(Main-Class)属性替代。
4应用库许可代码库属性Application-Library-Allowable-Codebase Attribute
定义签名的applet可以在哪些地址使用,在安全对话框中的地址栏中将显示给用户applet与jnlp或页面地址不同的地址。为属性设置JAR、JNLP和HTML所在的地址,使用空格分割。
如果applet的JAR文件与JNLP和和HTML在一个地址,就不需要设置。
Application-Library-Allowable-Codebase:https://host.example.com *.samplehost.com/apps
5调用者许可代码库属性Caller-Allowable-Codebase Attribute
决定哪些地址的javascript可以调用applet,为运行javascript调用applet的地址设置属性值,如果javascript调用applet的地址没有定义,则调用会被阻止。
如果没有设置调用者许可代码库属性,当javascript尝试调用applet时,会弹出安全提示,用户根据需要决定是否阻止。
另外,Trusted-Library属性和Caller-Allowable-Codebase属性在兼容性方面存在问题,Trusted-Library的类加载器在Java 7u45成为所有库的父类加载器,而之前版本所有受信库都加载到独立而唯一的类加载器,导致了Java 7u45中不能在加入Caller-Allowable-Codebase 属性的同时加入Trusted-Library属性,否则会弹出警告。
Application-Name: ...
Codebase: *
Caller-Allowable-Codebase: *
Permissions: all-permissions
经过测试JVMs:
另外javascript调用applet时,必须与主要Jar文件位于一个地址上。
Caller-Allowable-Codebase: host.example.com 127.0.0.1
1.7.55中当单独使用*作为Caller-Allowable-Codebase值时,从javascript中调用applet会显示安全警告框,用户可选择允许和阻止,同时提供一个选项来记住用户操作,如果选择记住操作,RIA启动时就不再会显示警告框。
6仅受信属性Trusted-Only Attribute
用来阻止未受信的类文件或资源被applet加载。这个属性设为true可阻止使用未受信的组件,因此需要对所有类文件和组件签名并使用all-permissions。
Trusted-Only:true
7受信库属性Trusted-LibraryAttribute
用来设计applet允许未受信的组件,当applet加载未受信的类文件或资源时不会弹出警告对话框。这个属性设为true可阻止使用未受信的组件,因此需要对所有类文件和组件签名并使用all-permissions。在混合代码的applet中,所有特权类和资源都必须有Trusted-Library属性,这是用来在特权代码和沙盒代码间相互调用。
如果web站点的证书无效,JRE验证web站点不受信任时会弹出警告对话框且无法隐藏,并告知站点证书无效,临时使用时,可点击“继续”按钮。
如果签名文件的证书无效,会弹出警告框且无法隐藏。临时使用时点击我接受风险并希望运行此应用程序。
当证书无效或者Caller-Allowable-Codebase:为*,javascript调用applet时会提示警告框,临时使用时可点击“是”,
1.7.55增加了记住选项可记住默认操作。
经过测试和验证,解决弹框问题有五个方法:
第一个JRE降到1.7.25以前。
第二个java认可的CA数字签名。
效果如http://docs.oracle.com/javase/tutorial/deployment/applet/deployingApplet.html
第三个客户端添加自签名证书库和证书。
添加applet证书到签名者CA,避免未知发行者警告。
第四个windows操作系统下导入证书到受信任的根证书颁发机构,该操作只对IE浏览器有效。
第五个修改用户%APPDATA%的javaSecurity目录下trust.cacert文件。
添加web站点证书到安全站点证书,建议web站点证书与applet证书一致,避免Web站点连接不可信警告。
添加applet证书到可信的证书,可以避免运行提示框。
参考:
1Java与数字签名
http://www.blogjava.net/sylilzy/articles/javaadndigtalsign.html
2oracle官方的java数字签名后的插件
http://docs.oracle.com/javase/tutorial/deployment/applet/deployingApplet.html
3oracle增强的安全属性
http://docs.oracle.com/javase/7/docs/technotes/guides/jweb/manifest.html#codebase
4oracle官方Manifest
http://docs.oracle.com/javase/7/docs/technotes/guides/jweb/manifest.html#codebase
5oracle官方7u45发布
http://www.oracle.com/technetwork/java/javase/7u45-relnotes-2016950.html