java applet socket_Java Applet 中的 Socket 与 SSLSocet

ServerSocket serverSocket = new ServerSocket(portNumber);

client:

Socket socket = new Socket(serverName, portNumber);

对于 Java Applet 中的 socket 应用,一般只要对代码进行签名,自己产生证书安装就可以了。主要用到 Java 里边的的keytool 和 jarsigner:

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

但对于 SSLSoket 要求 server 端与 client 端有可以互解的密钥库。先是利用 Java keytool -genkey 产生一个加密密钥库用于server端,然后利用 keytool -export 产生出证书。而在 client 端利用 keytool -import 与 证书产生一个解密密钥库。如何创建SSLSocket有多种方法,下边是参考网上的方法:

server:

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);

...............

client:

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);

...............

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

且而 Applet client 读取解密密钥库时,解密密钥库一定要在 client端的本地上(我做的一个web应用开始时想把解密密钥库KeyStore放在server端,装载applet时再读取,可惜行不通)。否则会有如下的 exception (PS:参考http://forums.sun.com/thread.jspa?threadID=580496)

:javax.net.ssl.SSLException: java.lang.RuntimeException: Unexpected error: java.security.InvalidAlgorithmParameterException: the trustAnchors parameter must be non-empty

上述的操作都正确,但是运行时还出现如下 exception:

java.security.AccessControlException: access denied

这时我们可以在 java.policy 文件上添加相应的grant(网上一般都介绍用此方法), 或者用AccessController.doPrivileged:

引用

doPrivileged()能在运行时启用特权,执行指定的操作。如果使用doPrivileged(),就会用到被简化的决策程序。一般用到doPrivileged()方法的时候,也会使用到PrivilegedAction界面,这个界面不会产生异常。

AccessController.doPrivileged(new PrivilegedAction() {

Public Object run() {

// privileged action can return some value or null

} }

);

把上边开 socket 的代码放在 run() 方法里执行,就可以实现 SSL 连接了。

2

1

分享到:

18e900b8666ce6f233d25ec02f95ee59.png

72dd548719f0ace4d5f9bca64e1d7715.png

2008-10-08 19:35

浏览 4701

评论

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值