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
Java 在Jetty服务器中,当需要客户端身份验证时,如何获取客户端证书?_Java_Ssl_Embedded Jetty_Authentication - Fatal编程技术网

Java 在Jetty服务器中,当需要客户端身份验证时,如何获取客户端证书?

Java 在Jetty服务器中,当需要客户端身份验证时,如何获取客户端证书?,java,ssl,embedded-jetty,authentication,Java,Ssl,Embedded Jetty,Authentication,设置请求客户端身份验证的嵌入式Jetty服务器非常容易:只需添加语句即可 SslContextFactory.setNeedClientAuth(true); 配置服务器时,将ssl上下文连接到。任何在服务器的信任库中拥有证书的客户端都将能够建立到服务器的TLS连接 但是,我需要知道所有可能的受信任客户端中的哪个客户端当前正在发出请求;换句话说,我需要知道在这个连接中使用的客户端证书,特别是在处理程序中。是否有人知道如何访问此证书,或者是否有可能访问此证书?有一个标准的servlet请求属性:j

设置请求客户端身份验证的嵌入式Jetty服务器非常容易:只需添加语句即可 SslContextFactory.setNeedClientAuth(true); 配置服务器时,将ssl上下文连接到。任何在服务器的信任库中拥有证书的客户端都将能够建立到服务器的TLS连接


但是,我需要知道所有可能的受信任客户端中的哪个客户端当前正在发出请求;换句话说,我需要知道在这个连接中使用的客户端证书,特别是在处理程序中。是否有人知道如何访问此证书,或者是否有可能访问此证书?

有一个标准的servlet请求属性:javax.servlet.request.X509Certificate

它返回X509证书的数组

我们使用它来获取名称并从证书中查找DN:

x509Cert[0].getSubjectX500Principal().getName()

2019年8月更新:Jetty 9.4.20.v20190813版本

证书是通过一个应用程序添加到对象(例如)中的

具体地说,是

使用此功能的代码如下(向下滚动)

Server=newserver();
//==HTTP配置===
HttpConfiguration http_config=新的HttpConfiguration();
http_config.setSecureScheme(“https”);
http_config.setSecureReport(8443);
http_config.setOutputBufferSize(32768);
http_config.setRequestHeaderSize(8192);
http_config.setResponseHeaderSize(8192);
http_config.setSendServerVersion(true);
http_config.setSendDateHeader(false);
//==添加HTTP连接器===
ServerConnector http=新的ServerConnector(服务器,
新的HttpConnectionFactory(http_config));
http.setPort(8080);
http.setIdleTimeout(30000);
addConnector(http);
//==配置SSL密钥库、信任库和密码===
SslContextFactory SslContextFactory=新的SslContextFactory.Server();
setkeystrepath(“/path/to/keystore”);
setKeyStorePassword(“changeme”);
sslContextFactory.setKeyManagerPassword(“changeme”);
setTrustStorePath(“/path/to/truststore”);
sslContextFactory.setTrustStorePassword(“changeme”);
//可选-用于客户端证书身份验证(两者都不需要)
//sslContextFactory.getWantClientAuth(true)
//sslContextFactory.setNeedClientAuth(true)
//==SSL HTTP配置===
HttpConfiguration https_config=新的HttpConfiguration(http_config);

https_config.addCustomizer(新的SecureRequestCustomizer());//“javax.servlet.request.X509Certificate”是否返回信任库或此连接的证书链中的X509证书列表?如果是前者,如何查找此连接使用的证书?如果是后者,该连锁店是如何上市的?元素[0]是信任库中的证书吗?其余元素表示到CA的链?它使用了一个小警告。X509Certificate导入需要是java.security.cert.X509Certificate,而不是javax.security.cert.X509Certificate,即使在属性中传递的字符串是“javax”。如果我导入javax证书,我会得到一个强制转换异常。从下面的注释来看,列表中的第一个证书似乎是当前会话的证书。目前在测试中很难说,因为我的信任库中只有一个证书。
“javax.servlet.*”
只是servlet规范指定的某个对象的属性名,该名称与您应该强制转换到/使用的类没有关联。@JoakimErdfelt如何使用HttpServletRequest?任何指针都会有帮助。这帮助我使用上面的答案来建议返回的证书列表是什么。