我们在Tomcat + APR / native上运行RESTfull服务时遇到问题。服务器需要凭证书进行客户端验如果客户端支持带有会话票证的TLS(RFC 5077),则问题仅出现。
以下是发生的情况:当客户端执行初始握手时(完全握手)req.getAttribute("javax.servlet.request.X509Certificate")
返回有效证书。当且仅当证书所标识的帐户有足够的金额时,服务才会在数据库中查找证书并处理请求。
在初始完整握手期间,服务器向客户端发送SessionTicket。
当客户端执行第二个请求时,它会向服务器发送SessionTicket。让SessionTicket服务器不进行CertificateRequest,因此客户端不会传输其证书。 req.getAttribute("javax.servlet.request.X509Certificate")
返回null 。
问题是:通过证书(相互TLS身份验证)识别客户端的最佳做法是什么?有没有办法在初始完全握手期间将一些信息注入SessionTicket并在恢复握手期间提取它?
UPD1。完全握手期间可用的请求属性:
javax.servlet.request.ssl_session=219FE...
javax.servlet.request.ssl_session_id=219FE...
javax.servlet.request.key_size=256
javax.servlet.request.X509Certificate=[Ljava.security.cert.X509Certificate;@2a0ad546
javax.servlet.request.cipher_suite=DHE-RSA-AES256-SHA
恢复TLS握手期间的可用请求属性:
javax.servlet.request.key_size=256
javax.servlet.request.cipher_suite=AES256-SHA