如何在JVM上的SSL跟踪中显示客户端的IP地址?

时间:2017-09-26 15:41:26

标签: java ssl jvm

我有一台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握手。

2 个答案:

答案 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));