2017-09-26 61 views
0

我有一個Java服務器和它正在從一個客戶端通過SSL連接搗爛,但根據記錄,它看起來像客戶端不信任我們的服務器證書:如何在JVM上的SSL跟蹤中顯示客戶端的IP地址?

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 =所有JVM參數不會給我任何客戶端建立連接的線索。

是否有人知道我可以使用的附加JVM參數(Oracle JDK),它將提供關於建立SSL連接的客戶端的IP地址/主機名的更多信息?

如果沒有,我會如何去找出客戶是誰的想法?我正在考慮收集TCP/IP數據包,並嘗試查找在serverHello消息之後立即終止的不完整SSL握手。

回答

0

您可能會增加HTTP服務器的日誌級別以查看更多關於此的詳細信息,但我最快的解決方法是啓動Wireshark或其他數據包嗅探工具。它更容易閱讀,並且每次要更改javax.net.debug系統屬性時都不需要重新啓動JVM。

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)); 
+0

不是真的。錯誤發生在TLS握手過程中,所以你永遠不會到達HTTP的地方,即請求一個URL並調用一個servlet。 – Lothar