Java安全套接字扩展

欢迎进入Java社区论坛,与200万技术人员互动交流 >>进入

在命令行中我们指定了keyStore属性为serverKeys。由于服务器程序需要获得客户端的授权信息,我们指定trustStore为serverTrust。这样SSLSimpleServer就可以验证由SSLSimpleClient提供的授权信息。当服务器程序成功运行后,你会看到下面的提示: phH海岸线网络安全资讯站

SimpleSSLServer running on port 49152phH海岸线网络安全资讯站

这时候服务器会等待客户端发出建立连接的申请。如果你希望在另一个端口上运行服务器程序,可以在命令中指定-port xxx参数,其中xxx是端口号。 phH海岸线网络安全资讯站

phH海岸线网络安全资讯站

然后在另一个命令窗口中运行客户端程序: phH海岸线网络安全资讯站

phH海岸线网络安全资讯站

java -Djavax.net.ssl.keyStore=clientKeys phH海岸线网络安全资讯站

-Djavax.net.ssl.keyStorePassword=password phH海岸线网络安全资讯站

-Djavax.net.ssl.trustStore=clientTrust phH海岸线网络安全资讯站

-Djavax.net.ssl.trustStorePassword=password SimpleSSLClientphH海岸线网络安全资讯站

客户端程序会试图向本机的49152端口建立SSL连接。同样你可以通过-port参数指定端口号,也可以通过-host参数指定主机名称。当连接成功后,会出现下面的提示信息: phH海岸线网络安全资讯站

phH海岸线网络安全资讯站

ConnectedphH海岸线网络安全资讯站

同时在服务器端会提示用户客户端已经连接成功。 phH海岸线网络安全资讯站

phH海岸线网络安全资讯站

SimpleSSLServer phH海岸线网络安全资讯站

phH海岸线网络安全资讯站

让我们先来看一下SimpleSSLServer。在main()方法中,程序获得了缺省的SSLServerSocketFactory对象;然后利用SSLServerSocketFactory创建一个SimpleSSLServer对象,最后调用start()方法启动SimpleSSLServer对象。 phH海岸线网络安全资讯站

phH海岸线网络安全资讯站

SSLServerSocketFactory ssf= phH海岸线网络安全资讯站

(SSLServerSocketFactory)SSLServerSocketFactory.getDefault();phH海岸线网络安全资讯站

SimpleSSLServer server=new SimpleSSLServer(ssf, port);phH海岸线网络安全资讯站

server.start();phH海岸线网络安全资讯站

由于服务器是在一个单独的线程中运行的,main()方法启动了服务器之后就退出了。start()方法启动了一个新的线程,该线程执行run()方法中的代码。在run()方法中创建了一个SSLServerSocket对象,然后设定服务器需要进行客户端验证: phH海岸线网络安全资讯站

SSLServerSocket serverSocket= (SSLServerSocket)serverSocketFactory.createServerSocket(port);phH海岸线网络安全资讯站

serverSocket.setNeedClientAuth(true);phH海岸线网络安全资讯站

调用run()方法后,程序进入了一个死循环,等待客户端的连接申请。循环中的每个Socket对应一个HandshakeCompletedListener对象(该对象是用来显示客户验证信息中的标识名称[distinguished name]的)。Socket的InputStream对象被包装在一个InputDisplayer对象中,这个InputDisplayer对象运行在另外一个线程中,用来将Socket接收到的数据发送到System.out。下面的代码是SimpleSSLServer中的主循环体: phH海岸线网络安全资讯站

while (true) {phH海岸线网络安全资讯站

String ident=String.valueOf(id++);phH海岸线网络安全资讯站

//监听连接请求。phH海岸线网络安全资讯站

SSLSocket socket=(SSLSocket)serverSocket.accept();phH海岸线网络安全资讯站

//通过使用HandshakeCompletedListener对象,程序进行授权验证。phH海岸线网络安全资讯站

HandshakeCompletedListener hcl=new SimpleHandshakeListener(ident);phH海岸线网络安全资讯站

socket.addHandshakeCompletedListener(hcl);phH海岸线网络安全资讯站

InputStream in=socket.getInputStream();phH海岸线网络安全资讯站

new InputDisplayer(ident, in);phH海岸线网络安全资讯站

}phH海岸线网络安全资讯站

程序中的SimpleHandshakeListener类实现了HandshakeCompletedListerner接口。在SimpleHandshakeListener类中实现了handshakeCompleted()方法,该方法在SSL握手阶段完成后将被JSSE调用。它将显示出客户端的标识名称: phH海岸线网络安全资讯站

class SimpleHandshakeListener implements HandshakeCompletedListenerphH海岸线网络安全资讯站

{phH海岸线网络安全资讯站

String ident;phH海岸线网络安全资讯站

/**phH海岸线网络安全资讯站

* 构造函数。phH海岸线网络安全资讯站

*/phH海岸线网络安全资讯站

public SimpleHandshakeListener(String ident)phH海岸线网络安全资讯站

{phH海岸线网络安全资讯站

this.ident=ident;phH海岸线网络安全资讯站

}phH海岸线网络安全资讯站

/**当SSL握手过程完成后该方法被激活。 */phH海岸线网络安全资讯站

public void handshakeCompleted(HandshakeCompletedEvent event)phH海岸线网络安全资讯站

{phH海岸线网络安全资讯站

//显示授权信息。phH海岸线网络安全资讯站

try {phH海岸线网络安全资讯站

X509Certificate phH海岸线网络安全资讯站

cert=(X509Certificate)event.getPeerCertificates()[0];phH海岸线网络安全资讯站

String peer=cert.getSubjectDN()。getName();phH海岸线网络安全资讯站

System.out.println(ident+”: Request from “+peer);phH海岸线网络安全资讯站

}phH海岸线网络安全资讯站

catch (SSLPeerUnverifiedException pue) {phH海岸线网络安全资讯站

System.out.println(ident+”: Peer unverified”);phH海岸线网络安全资讯站

}phH海岸线网络安全资讯站

}phH海岸线网络安全资讯站

}phH海岸线网络安全资讯站

用红色字体表示的两行代码是这段代码的核心:getPeerCertificates()方法返回一个X509Certificated对象的数组。这些X509Certificated对象创建了客户端的身份标识。在数组中的第一个元素是客户端的验证信息,而最后一个通常是CA验证。当我们有了客户端的验证信息后。我们可以得到其中的标识名称,并将它传送到System.out。 phH海岸线网络安全资讯站

phH海岸线网络安全资讯站

SimpleSSLClient phH海岸线网络安全资讯站

phH海岸线网络安全资讯站

SimpleSSLClient类比较简单,但是在后面的一些比较复杂的例子中的类会继承该类。在getSLLSocketFactory()方法中,程序返回缺省的工厂类: phH海岸线网络安全资讯站

phH海岸线网络安全资讯站

protected SSLSocketFactory getSSLSocketFactory()phH海岸线网络安全资讯站

throws IOException, GeneralSecurityExceptionphH海岸线网络安全资讯站

{phH海岸线网络安全资讯站

return (SSLSocketFactory)SSLSocketFactory.getDefault();phH海岸线网络安全资讯站

}phH海岸线网络安全资讯站

在runClient()方法中,程序处理了输入参数后,获得SSLSockFactory对象,调用connect()方法连接到服务器程序。在connect()方法中,程序首先创建一个SSLSocket对象,然后调用SSLSocket对象的startHandshang()方法启动和服务器端的握手过程。当握手过程完成后,会触发一个HandshakeCompletedEvent事件。在服务器端的HandshakeCompletedListener对象会处理这个事件。事实上,JSSE可以自动启动握手过程,但是必须是在第一次有数据通过Socket传输的情况下。由于在例子程序中,直到用户在键盘上输入信息后才会有数据通过Socket传输,而我们希望服务器端及时报告连接情况,因此我们用startShake()方法来手工激活握手过程。 phH海岸线网络安全资讯站

phH海岸线网络安全资讯站

[1][2][3]

风景如何,其实并不重要。重要的是,你在我的身边。

Java安全套接字扩展

相关文章:

你感兴趣的文章:

标签云: