Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ssl/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ssl 在restlet中获取客户端证书_Ssl_Restlet - Fatal编程技术网

Ssl 在restlet中获取客户端证书

Ssl 在restlet中获取客户端证书,ssl,restlet,Ssl,Restlet,我成功地实现了一个https restlet,并获得了bot客户端和服务器认证。我可以证明它是有效的,因为如果我使用不受信任的证书通信调用服务器,通信将失败。很遗憾,我在服务器上找不到客户端的证书。我正在使用以下代码: List<Certificate> certs = request.getClientInfo().getCertificates(); List certs=request.getClientInfo().getCertificates(); 但列表是空的。我做

我成功地实现了一个https restlet,并获得了bot客户端和服务器认证。我可以证明它是有效的,因为如果我使用不受信任的证书通信调用服务器,通信将失败。很遗憾,我在服务器上找不到客户端的证书。我正在使用以下代码:

List<Certificate> certs = request.getClientInfo().getCertificates();
List certs=request.getClientInfo().getCertificates();
但列表是空的。我做错了什么

编辑


版本为restletframework/2.3m2

此方法应提供您需要的:request.getClientInfo().getCertificates()


您还可以检索密码套件

该问题与通过
com.sun.httpserver
使用默认服务器实现有关。 类
org.restlet.engine.connector.HttpExchangeCall
应该在
getCertificates()方法中返回证书,
但它总是返回
null
。此类用于
org.restlet.engine.connector.HttpsServerHelper
当使用服务器实现
com.sun.httpserver
时,它又是Restlet框架的助手

要解决这个问题,需要做几件事。
首先,一个新类
HttpsExchangeCall

package org.restlet.engine.connector;
导入java.security.cert.Certificate;
导入java.util.ArrayList;
导入java.util.List;
导入org.restlet.Server;
导入org.slf4j.Logger;
导入org.slf4j.LoggerFactory;
导入com.sun.net.httpserver.HttpExchange;
导入com.sun.net.httpserver.HttpsExchange;
/**
*默认的{@link HttpExchangeCall}无法从SSL连接提取证书。
*此类实现{@link#getCertificates()}以提取证书。
*/
@禁止警告(“限制”)
公共类HttpsExchangeCall扩展HttpExchangeCall{
私有静态最终记录器log=LoggerFactory.getLogger(HttpsExchangeCall.class);
私有最终HttpsExchange sexchange;
公共HttpsExchangeCall(服务器,HttpExchange){
这(服务器、exchange、true);
}
公共HttpsExchangeCall(服务器、HttpExchange、布尔机密){
超级(服务器、交换、机密);
if(HttpsExchange的交换实例){
sexchange=(HttpsExchange)交换;
}否则{
sexchange=null;
}
}
@凌驾
公共列表getCertificates(){
if(sexchange==null){
debug(“无法从不安全连接提取对等证书”);
返回null;
}
证书[]证书=null;
试一试{
certs=sexchange.getSSLSession().getPeerCertificates();
if(log.isDebugEnabled()){
log.debug(“找到”+(certs==null?“否”:Integer.toString(certs.length))+“对等证书”);
}
}捕获(例外e){
log.debug(“找不到对等证书-”+e);
}
列表lcerts=null;
如果(证书!=null){
lcerts=newarraylist();
对于(int i=0;i
然后是一份 重命名为HttpsServerHelper2,修改了一行。更换线路
HttpsServerHelper.this.handle(新的HttpExchangeCall(getHelped(),

用这句话:
HttpsServerHelper2.this.handle(新的HttpsExchangeCall(getHelped(),

需要注册此帮助程序:
Engine.getInstance().getRegisteredServer().add(新的HttpsServerHelper2(null));

创建
服务器
现在变得非常明确:

Component组件=新组件();
服务器=新服务器(
(上下文)null,Arrays.asList(Protocol.HTTPS),
(字符串)null,Constants.PORT_TEST,component.getServers().getNext(),
HttpsServerHelper2.class.getName()
);
component.getServers().add(服务器);
我希望Restlet自己的
HttpExchangeCall
将被更新以提取证书: 这是一个次要的修复,并节省了解决该问题所需的大量不必要的代码。
同时,您可以在
Github项目。

这家伙升级到2.1后遇到了同样的问题。没有回答:(does request.getAttributes()…get(“org.restlet.https.clientCertificates”);工作?@tom不幸的是它也不工作。好吧,getCerificates所做的调用依赖于该属性。正如您在OP中看到的,您发布的代码正是我使用的代码,但不工作。我正在自托管restlet,这可能是个问题吗?您使用的是哪个容器,是jetty、tomcat还是什么?@tom我正在自托管http监听:即使用restlet进行监听。@JeromeLouvel你能看看我的答案并更新restlet的源代码吗?