Java Applet 中的 Socket 与 SSLSocet

一般的 socket 应用:
server:
[code]
ServerSocket serverSocket = new ServerSocket(portNumber);
[/code]
client:
[code]
Socket socket = new Socket(serverName, portNumber);
[/code]

对于 Java Applet 中的 socket 应用,一般只要对代码进行签名,自己产生证书安装就可以了。主要用到 Java 里边的的keytool 和 jarsigner:
[code]
jar cfv Test.jar com/test/*.class

keytool -genkey -alias signFiles -keystore testAPI -keypass pds12345 -storepass 12345678 -dname CN=1,OU=1,O=1,L=1,ST=1,C=1

jarsigner -keystore testAPI -storepass 12345678 -keypass 12345678 -signedjar TestSigned.jar Test.jar signFiles

keytool -export -keystore agentAPI -storepass 12345678 -alias signFiles -file testApplet.cer

keytool -import -alias testAPI -file testApplet.cer -keystore testAPI -storepass 12345678
[/code]


但对于 SSLSoket 要求 server 端与 client 端有可以互解的密钥库。先是利用 Java keytool -genkey 产生一个加密密钥库用于server端,然后利用 keytool -export 产生出证书。而在 client 端利用 keytool -import 与 证书产生一个解密密钥库。如何创建SSLSocket有多种方法,下边是参考网上的方法:
server:
[code]
ClassLoader cl = getClass().getClassLoader();
String key = "serverKeyStore";//加密密钥库
fIn = cl.getResourceAsStream("serverKey");

char keyStorePass[] = "12345678".toCharArray();

char keyPassword[] = "12345678".toCharArray();

KeyStore ks = KeyStore.getInstance("JKS");

ks.load(fIn, keyStorePass);

KeyManagerFactory kmf = KeyManagerFactory.getInstance("SunX509");

kmf.init(ks, keyPassword);

SSLContext sslContext = SSLContext.getInstance("SSLv3");

sslContext.init(kmf.getKeyManagers(), null, null);

SSLServerSocketFactory factory = sslContext.getServerSocketFactory();

serverSocket = (SSLServerSocket) factory.createServerSocket(portNumber);
...............
[/code]

client:
[code]
String path = System.getProperty("java.home")
+ "/lib/security/KeyStore".replace('/', File.separatorChar);

System.setProperty("javax.net.ssl.trustStorePassword","12345678");
System.setProperty("javax.net.ssl.trustStore",path);
factory = (SSLSocketFactory)SSLSocketFactory.getDefault();
sslsocket = (SSLSocket)factory.createSocket(serverName, portNumber);
...............
[/code]

当读取读取解密密钥库的路径不正确时,就会出现 java.lang.NullPointerException .

且而 Applet client 读取解密密钥库时,解密密钥库一定要在 client端的本地上(我做的一个web应用开始时想把解密密钥库KeyStore放在server端,装载applet时再读取,可惜行不通)。否则会有如下的 exception (PS:参考[url]http://forums.sun.com/thread.jspa?threadID=580496[/url])
:[code]javax.net.ssl.SSLException: java.lang.RuntimeException: Unexpected error: java.security.InvalidAlgorithmParameterException: the trustAnchors parameter must be non-empty
[/code]


上述的操作都正确,但是运行时还出现如下 exception:
[code]
java.security.AccessControlException: access denied
[/code]

这时我们可以在 java.policy 文件上添加相应的grant(网上一般都介绍用此方法), 或者用AccessController.doPrivileged:
[quote]
doPrivileged()能在运行时启用特权,执行指定的操作。如果使用doPrivileged(),就会用到被简化的决策程序。一般用到doPrivileged()方法的时候,也会使用到PrivilegedAction界面,这个界面不会产生异常。

AccessController.doPrivileged(new PrivilegedAction() {
Public Object run() {
// privileged action can return some value or null
} }
);
[/quote]
把上边开 socket 的代码放在 run() 方法里执行,就可以实现 SSL 连接了。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值