【问题标题】:Access denied when my servlet tries to SSH from Tomcat当我的 servlet 尝试从 Tomcat 进行 SSH 时访问被拒绝
【发布时间】:2009-10-16 17:15:39
【问题描述】:

我编写了一个使用库 ganymed-ssh2-build210.jar 的 Servlet(它使用这些类:import ch.ethz.ssh2.Connection; import ch.ethz.ssh2.Session; import ch.ethz.ssh2 .StreamGobbler;) 通过 SSH 连接运行命令(出于测试目的,它连接到我的本地计算机)。当我将我的类作为独立应用程序运行时,它可以工作,但是当我将它部署到 Tomcat 中并且 Tomcat 将它作为 Servlet 启动时,我得到了这个异常(我已经切断了结尾,因为我认为它可能无关紧要,但如果有帮助,我可以将其全部包含在内):

java.security.AccessControlException: access denied (java.net.SocketPermission 127.0.0.1:22 connect,resolve)
    at java.security.AccessControlContext.checkPermission(AccessControlContext.java:323)
    at java.security.AccessController.checkPermission(AccessController.java:546)
    at java.lang.SecurityManager.checkPermission(SecurityManager.java:532)
    at java.lang.SecurityManager.checkConnect(SecurityManager.java:1034)
    at java.net.Socket.connect(Socket.java:513)
    at ch.ethz.ssh2.transport.TransportManager.establishConnection(TransportManager.java:340)
    at ch.ethz.ssh2.transport.TransportManager.initialize(TransportManager.java:448)
    at ch.ethz.ssh2.Connection.connect(Connection.java:643)
    ...

这可能与安全策略有关吗?如果是这样,你知道我是如何改变它们的吗?

我正在使用 Java 1.6 和 Tomcat6。

【问题讨论】:

    标签: tomcat servlets


    【解决方案1】:

    您是否在打开 -security 参数的情况下运行 Tomcat?如果是这样,您需要编辑 $CATALINA_BASE/conf/catalina.policy 并允许 ch.ethz.ssh2.transport 访问 java.net.Socket。

    【讨论】:

    • 很抱歉听起来像个菜鸟,但那个条目会是什么样子?我刚刚尝试了以下操作(我从 local.policy 复制了 jar 示例),但无济于事:grant codeBase "jar:file:${catalina.base}/webapps/GetSpinData/WEB-INF/lib/ganymed- ssh2-build210.jar!/-"{ 权限 java.net.SocketPermission "127.0.0.1:22", "connect"; };
    • 我添加了以下内容来捕获所有内容:grant codeBase "jar:file:${catalina.base}/webapps/GetSpinData/WEB-INF/lib/ganymed-ssh2-build210.jar!/- "{ 权限 java.security.AllPermission; };授予 codeBase "file:${catalina.base}/webapps/GetSpinData/WEB-INF/lib/-"{ 权限 java.security.AllPermission; };授予 codeBase "file:${catalina.base}/webapps/GetSpinData/WEB-INF/classes/-"{ 权限 java.security.AllPermission; };它有效,谢谢! :D 我如何将其缩小到我需要的权限?这是正确的文件,还是应该在 local.policy 中?
    • 保存在 catalina.policy 中,不要更改 local.policy。我相信启动脚本/批处理文件会在tomcat启动时将此文件的路径传递给安全管理器。我不确定如何将其缩小到您需要的特定权限。我不想让您访问链接,但如果您查看java.sun.com/j2se/1.4.2/docs/guide/security/permissions.html,这将为您提供(可能绰绰有余)您需要确定确切权限的信息。我猜你会想看看 NetPermission 和 SocketPermission。希望这会有所帮助。
    【解决方案2】:

    看起来 java 在端口 22 上被拒绝访问 - 你确定你是在尝试作为客户端连接,而不是生成服务器吗?如果它试图将侦听器绑定到端口 22,除非您以超级用户身份运行,否则您可能会收到错误。

    【讨论】:

    • 绝对作为客户端连接,作为独立应用运行良好。
    猜你喜欢
    • 2018-03-16
    • 2012-06-27
    • 1970-01-01
    • 2012-07-26
    • 1970-01-01
    • 2011-01-17
    • 2018-09-14
    • 1970-01-01
    • 2012-02-26
    相关资源
    最近更新 更多