带有Jetty连接器的Restlet 2.0.8不能恢复SSL会话,而Simple连接器则可以

时间:2011-06-27 07:10:54

标签: authentication ssl jetty restlet

有谁知道这是为什么,或者如何修复它?

我正在使用android通过httpclient连接 - 简单连接器恢复连接就好了,但是Jetty每次都会执行新的握手!代码是一样的,它只是我在构建路径上的连接器。不断重做握手会占用大量的数据和电池 - 问题是我需要客户端身份验证,正如我发现的那样,使用Simple连接器无法正常工作。这里有什么我想念的吗?我正在使用如下的标准连接设置。

component = new Component();
component.getClients().add(Protocol.FILE);
Server httpsServer = component.getServers().add(Protocol.HTTPS, 444);

Series<Parameter> parameters = httpsServer.getContext().getParameters();

File pwd = new File(".");
String path = pwd.getCanonicalPath();
String keystorePath = path + "/keystore/keypair.jks";

parameters.add("SSLContextFactory", "org.restlet.ext.ssl.PkixSslContextFactory");
parameters.add("keystorePath", keystorePath);
parameters.add("keystorePassword", "xxx");
parameters.add("keyPassword", "xxx");
parameters.add("keystoreType", "JKS");
parameters.add("threadMaxIdleTimeMs", "60000"); //default idle time
parameters.add("needClientAuthentication", "true");

// Guard the restlet with BASIC authentication (encrypted under SSL).
ChallengeAuthenticator guard = new ChallengeAuthenticator(null, ChallengeScheme.HTTP_BASIC, "xxx");

//new pagerreceiver
Restlet resty = new PagerReceiverApplication();

LoginChecker loginVerifier = new LoginChecker();
guard.setVerifier(loginVerifier);
guard.setNext(resty);
component.getDefaultHost().attachDefault(guard);

overrideStatus statusService = new overrideStatus();
component.setStatusService(statusService);

component.start();

2 个答案:

答案 0 :(得分:1)

不确定您使用的Jetty版本或配置方式,但查看http://wiki.eclipse.org/Jetty/Howto/Configure_SSL,有一个名为allowRenegotiate的参数默认为false。也许如果你能弄清楚如何将其设置为真,你将能够恢复会话吗?

答案 1 :(得分:0)

我还没试过,但是值得尝试通过Jetty的SslSelectChannelConnector使用NIO连接器和Restlet参数type=1。 (default是使用SslSocketConnectortype=2。)