2015-09-08 4 views
0

У меня есть архитектура сервера/клиента Java EE, которые обмениваются данными друг с другом с помощью SSL-соединения. Когда соединение выполняется, клиент может опросить веб-службы сервера. Мой вопрос: как я могу получить доступ к информации о сертификате клиента в веб-службе сервера? Мой контроллер сервера ниже:Как получить доступ к информации сертификата

import javax.ws.rs.Consumes; 
import javax.ws.rs.GET; 
import javax.ws.rs.Path; 
import javax.ws.rs.Produces; 
import javax.ws.rs.core.MediaType; 
import javax.ws.rs.core.Response; 

@Path("mycontroller") 
@Consumes(MediaType.APPLICATION_XML) 
@Produces(MediaType.APPLICATION_XML) 
public class Controller { 

    @GET 
    @Path("dosomething") 
    public Response doSomething() { 

     // How can I have access to certificate information here ? 

     return Response.ok().build(); 

    } 

} 

ответ

1

Я нашел способ сделать то, что хотел.

Во-первых, сервер необходимо настроить для проверки подлинности сертификата клиента. В моем случае я использую сервер JBoss и должен был добавить это в файл standalone.xml:

... 
<subsystem xmlns="urn:jboss:domain:web:1.1" default-virtual-server="default-host" native="false"> 
    ... 
    <connector name="https" protocol="HTTP/1.1" scheme="https" socket-binding="https" enable-lookups="false" secure="true"> 
     <ssl name="localhost" key-alias="localhost" password="server" certificate-file="${jboss.server.config.dir}/server.jks" certificate-key-file="${jboss.server.config.dir}/server.jks" ca-certificate-file="${jboss.server.config.dir}/truststore.jks" protocol="TLSv1" verify-client="true" /> 
    </connector> 
    ... 
</subsystem> 
... 

А потом в моем контроллере я должен был вводить HttpServletRequest и, наконец, я мог бы получить экземпляр X509Certificate, который содержит сертификат информация:

import javax.ws.rs.Consumes; 
import javax.ws.rs.GET; 
import javax.ws.rs.Path; 
import javax.ws.rs.Produces; 
import javax.ws.rs.core.MediaType; 
import javax.ws.rs.core.Response; 
import javax.servlet.http.HttpServletRequest; 
import java.security.cert.X509Certificate; 

@Path("mycontroller") 
@Consumes(MediaType.APPLICATION_XML) 
@Produces(MediaType.APPLICATION_XML) 
public class Controller { 

    @Context 
    private HttpServletRequest request; 

    @GET 
    @Path("dosomething") 
    public Response doSomething() { 

     X509Certificate[] certChain = (X509Certificate[]) request.getAttribute("javax.servlet.request.X509Certificate"); 
     X509Certificate certificate = certChain[0]; 

     return Response.ok().build(); 

    } 

} 
0

Если вы ищете стандартную информацию сертификата, который будет найден в HTTP-заголовках и объекте HTTP Servlet Reqeust, такие как информация сертификата клиента от Apache HTTP обратного прокси-сервера. Вы можете вводить эти

Для примера:

@Context частный HttpServletRequest ServletRequest; @Context private HttpServletContext servletContext;

(см Get HttpServletRequest in Jax Rs/Appfuse application? или в Java EE tutorial)

Если вы хотите получить доступ к файлу хранилище и загрузить закрытый ключ сертификата, то доступ к файлу должен быть сделан через JNDI файл ресурс или адаптер JCA.

Но я бы посоветовал предупредить, что сервер приложений должен обрабатывать всю защиту соединения SSL/TLS. Ваш компонент WAR только объявляет, что он хочет, чтобы соединение было «конфиденциальным» в файле web.xml. Смешивание безопасности на уровне сообщений и аутентификации с помощью безопасности приложения или транспортного протокола может привести к разрыву проблем. т.е. сохранение аутентификации, прикрепленной к сообщению, в сценарии шины или концентратора.

+0

Благодарим за ответ. Мой клиент соединяется с сертификатом, содержащим «Боб» для «Common Name». Я хочу сказать «Hello Bob» в моем контроллере. У меня возникают серьезные сомнения, что это возможно. – cheb1k4

Смежные вопросы