Мой клиент реализует двухстороннюю SSL следующим образом:GetAttribute ("javax.servlet.request.X509Certificate") не установлен (Spring, CXF, Jetty, JAX-RSv1.1)
private final static String KEYSTORE = "/security/client.jks"; private final static String KEYSTORE_PASSWORD = "secret"; private final static String KEYSTORE_TYPE = "JKS"; private final static String TRUSTSTORE = "/security/certificates.jks"; private final static String TRUSTSTORE_PASSWORD = "secret"; private final static String TRUSTSTORE_TYPE = "JKS"; ... KeyStore keystore = KeyStore.getInstance(KEYSTORE_TYPE); FileInputStream keystoreInput = new FileInputStream(new File(KEYSTORE)); keystore.load(keystoreInput, KEYSTORE_PASSWORD.toCharArray()); KeyStore truststore = KeyStore.getInstance(TRUSTSTORE_TYPE); FileInputStream truststoreIs = new FileInputStream(new File(TRUSTSTORE)); truststore.load(truststoreIs, TRUSTSTORE_PASSWORD.toCharArray()); SSLSocketFactory socketFactory = new SSLSocketFactory(keystore, KEYSTORE_PASSWORD, truststore); Scheme scheme = new Scheme("https", 8543, socketFactory); SchemeRegistry registry = new SchemeRegistry(); registry.register(scheme); ClientConnectionManager ccm = new PoolingClientConnectionManager(registry); httpclient = new DefaultHttpClient(ccm); HttpResponse response = null; HttpGet httpget = new HttpGet("https://mylocalhost.com:8543/test"); response = httpclient.execute(httpget); ...
И Я пытаюсь получить сертификат X.509 со стороны сервера от клиента через javax.servlet.http.HttpServletRequest.getAttribute («javax.servlet.request.X509Certificate»), как описано здесь: http://tomcat.apache.org/tomcat-5.5-doc/servletapi/javax/servlet/ServletRequest.html#getAttribute%28java.lang.String%29.
Я получаю HttpServletRequest на стороне сервера с помощью:
HttpServletRequest ServletRequest = (HttpServletRequest) msg.get ("HTTP.REQUEST"); через метод handleMessage (Message msg) моего класса перехватчика, который расширяет AbstractPhaseInterceptor < Сообщение >. Я должен использовать JAX-RS 1.1.1 со стороны сервера из-за некоторых зависимостей Maven, которые мне не разрешают изменять, и поэтому я не могу использовать ContainerRequestFilter (поддерживается JAX-RS 2.0).
Моя проблема заключается в том, что getAttribute ("javax.servlet.request.X509Certificate") со стороны сервера возвращает null все время. Если я проверю трафик между сервером и клиентом, я вижу, что сертификат с сервера отправляется клиенту, и это рукопожатие работает. Но я не вижу, что клиентский сертификат отправляется на сервер, и я думаю, что это причина, по которой getAttribute("javax.servlet.request.X509Certificate")
возвращает null
. Кто-нибудь знает, как я могу решить эту проблему? Я уже пробовал некоторые другие реализации на стороне клиента, но без изменений.
Что я делаю неправильно? Спасибо заранее!
Дополнительная информация: Я видел на стороне сервера, что javax.servlet.request.ssl_session_id, javax.servlet.request.key_size и javax.servlet.request.cipher_suite установлены, но ключ javax.servlet.request. X509Certificate не установлен. Я использую Jetty Server 8.1.15, Apache CXF 2.7.x и JAX-RS 1.1.1. Я пробовал с конфигурацией Jetty через http://cxf.apache.org/docs/jetty-configuration.html и http://cxf.apache.org/docs/secure-jax-rs-services.html#SecureJAX-RSServices-Configuringendpoints, атрибут все еще не установлен.
Название предполагает, что вы хотите подписать запрос HTTPS, содержимое вопроса выглядит так, будто вы пытаетесь использовать клиент-сертификат. Это разные вещи. – Bruno
Привет, Бруно, клиент должен быть аутентифицирован сервером через сертификат X.509. Я хочу извлечь сертификат X.509, чтобы сервер мог сравнить сертификат с его доверительным магазином. Я не мог узнать, есть ли проблема на стороне клиента или на стороне сервера. Поэтому мой вопрос может быть немного неспецифичным. Пожалуйста, несите меня, я новичок здесь. Большое спасибо! Я добавил дополнительную информацию выше. –