JMX从JConsole监视Tomcat时发生java.lang.SecurityException

该场景很简单。 我试图从我的本地工作站(Mac OS 10.9)监控运行Tomcat 7.0.54的远程服务器(Ubuntu 12.04),其中部署了Spring Java应用程序。

服务器和工作站都使用JVM热点64位“1.7.0_51”。

步骤

  • 配置Tomcat的JmxRemoteLifecycleListener以修复端口(server.xml)

    <Listener className="org.apache.catalina.mbeans.JmxRemoteLifecycleListener"
      rmiRegistryPortPlatform="9940" rmiServerPortPlatform="9941" /> 
    
  • catalina-jmx-remote.jar复制到CATALINA_HOME / lib中

  • 打开端口sudo iptables -L

    ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:9940
    ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:9941
    
  • setenv.sh

    IP=`ifconfig eth0  | grep 'inet '| grep -v '127.0.0.1' | cut -d: -f2 | awk '{ print $1}'`;
    
    export CATALINA_OPTS="$CATALINA_OPTS
    -Dcom.sun.management.local.only=false 
    -Dcom.sun.management.jmxremote=true
    -Dcom.sun.management.jmxremote.authenticate=true 
    -Djava.rmi.server.hostname=$IP 
    -Dcom.sun.management.jmxremote.password.file=$CATALINA_BASE/conf/jmxremote.password 
    -Dcom.sun.management.jmxremote.access.file=$CATALINA_BASE/conf/jmxremote.access 
    -Dcom.sun.management.jmxremote.ssl=false"
    

    IP被解析为主机的内部IP地址,例如10.239.94.133。

  • 启动Tomcat并检查netstat -nap | grep java

    tcp6  0  0 :::9940 :::*  LISTEN      6538/java       
    tcp6  0  0 :::9941 :::*  LISTEN      6538/java 
    

    直到这里,它似乎都表明设置是正确的。 我可以远程登录我的远程主机到两个端口,我可以看到Tomcat(6538)正在监听这些端口。

  • 从我的本地主机jconsole -debug并连接到远程进程

     service:jmx:rmi://PUBLIC-IP:9941/jndi/rmi://PUBLIC-IP:9940/jmxrmi
    
  • 问题

        java.lang.SecurityException: Expecting a javax.rmi.ssl.SslRMIClientSocketFactory RMI client socket factory in stub!
        at javax.management.remote.rmi.RMIConnector.checkStub(RMIConnector.java:1881)
        at javax.management.remote.rmi.RMIConnector.connect(RMIConnector.java:295)
        at javax.management.remote.JMXConnectorFactory.connect(JMXConnectorFactory.java:268)
        at sun.tools.jconsole.ProxyClient.tryConnect(ProxyClient.java:370)
        at sun.tools.jconsole.ProxyClient.connect(ProxyClient.java:313)
        at sun.tools.jconsole.VMPanel$2.run(VMPanel.java:292)
    

    有什么我错过了吗? 我在这个圈子里跑: - /谢谢你的帮助。


    IP被解析为主机的内部IP地址,例如10.239.94.133。

    这是问题所在。 解决方法实际上是设置

    -Djava.rmi.server.hostname=server.public.ip.address
    

    你仍然在JConsole中得到同样的错误(带有-debug选项),但忽略它并点击'insecure'按钮继续,你的位置在:)

    链接地址: http://www.djcxy.com/p/59715.html

    上一篇: java.lang.SecurityException when JMX monitor Tomcat from JConsole

    下一篇: Application level monitoring in Tomcat using Zabbix/Nagios