我有一台Java服务器,它正在被来自客户端的SSL连接所摧毁,但根据日志,看起来客户端不信任我们服务器的证书:
javax.net.ssl.SSLHandshakeException: Received fatal alert: certificate_unknown
at sun.security.ssl.Alerts.getSSLException(Alerts.java:192)
at sun.security.ssl.Alerts.getSSLException(Alerts.java:154)
at sun.security.ssl.SSLSocketImpl.recvAlert(SSLSocketImpl.java:2023)
at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:1125)
at sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1375)
at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1403)
at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1387)
我们不知道哪个客户端造成这种情况,并且有太多的方法无法检查,其中一些甚至是我们无法访问的远程环境。启用javax.net.debug = all JVM参数不会给我任何关于哪个客户端建立连接的线索。
是否有人知道我可以使用的其他JVM参数(Oracle JDK),它将提供有关建立SSL连接的客户端的IP地址/主机名的其他信息?
如果没有,有关我如何解决这个问题的想法,以找出客户是谁?我正在考虑收集TCP / IP数据包,并试图找到在serverHello消息之后立即终止的不完整的SSL握手。
答案 0 :(得分:0)
您可以增加HTTP服务器的日志级别以查看有关此内容的更多详细信息,但我最快的解决方案是启动Wireshark或其他一些数据包嗅探工具。它更容易阅读,每次要更改javax.net.debug
系统属性时都不需要重新启动JVM。
答案 1 :(得分:0)
如果客户端正在调用Web服务,这可能很有用:
@Resource
WebServiceContext wsContext;
HttpServletRequest request = (HttpServletRequest)wsContext.getMessageContext().get(SOAPMessageContext.SERVLET_REQUEST);
String remoteIp = request.getRemoteAddr();
String remoteUser = request.getRemoteUser();
String remoteHost = request.getRemoteHost();
l.debug(String.format("Client - Remote IP address: %s, Remote User: %s, Remote Host: %s", remoteIp, remoteUser, remoteHost));