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
踩
分享到:
2008-10-08 19:35
浏览 4701
评论