【发布时间】:2014-09-05 10:36:41
【问题描述】:
我正在使用 restlet 创建一个带有服务器和客户端认证的 HTTPS 通道。我对服务器进行认证没有问题(即让服务器公开证书并从客户端信任它),但我不知道如何发送客户端证书。 下面是服务器重要代码:
Server server = component.getServers().add(Protocol.HTTPS, config.getInt("server.port"));
Series<Parameter> parameters = server.getContext().getParameters();
parameters.add("keystorePath", config.getString("keystore.path"));
parameters.add("keystorePassword", config.getString("keystore.password"));
parameters.add("keyPassword", config.getString("key.password"));
parameters.add("keystoreType",config.getString("keystore.type"));
/* true */
parameters.add("needClientAuthentication", config.getString("need.client.authentication"));
而客户端配置是这样的:
if(config.getBoolean("truststore.use")){
Series<Parameter> parameters = client.getContext().getParameters();
parameters.add("truststorePath", config.getString("truststore.path"));
parameters.add("truststorePassword", config.getString("truststore.password"));
// parameters.add("trustPassword", "password");
parameters.add("truststoreType", config.getString("truststore.type"));
parameters.add("keystorePath", config.getString("keystore.path"));
parameters.add("keystorePassword", config.getString("keystore.password"));
parameters.add("keyPassword", config.getString("key.password"));
parameters.add("keystoreType",config.getString("keystore.type"));
}
直到 needClientAuthentication 为假,一切正常。通过将 needClientAuthentication 设置为 true 它开始失败,这是预期的,因为我没有发送客户端证书。 引发的异常有以下消息:
Software caused connection abort: recv failed
但我不知道,也没有找到任何关于如何发送客户端证书的示例。
我什至在客户端添加了密钥库信息,并将服务器上的约束放松为wantClientAuthentication,但似乎没有证书来自服务器。
【问题讨论】:
-
您至少需要在客户端设置密钥库参数,并且几乎可以肯定在服务器上设置信任库参数。
-
感谢@Bruno 的建议。我在客户端上添加了密钥库信息,将成本限制放宽到 wantClientAuthentication,但证书似乎不是从客户端发送的(我在 servlet 上有一个过滤器,request.getClientInfo().getCertificates(); 返回一个空列表
-
@Bruno,通过 cinfiguring 服务器认证工作上的信任库。不幸的是 request.getClientInfo().getCertificates() 仍然是空的,知道为什么吗?
标签: java ssl restlet restlet-2.0