【问题标题】:Java - connect to webpage using SSH tunnelingJava - 使用 SSH 隧道连接到网页
【发布时间】:2014-05-19 22:25:16
【问题描述】:

Java 程序员。我最近遇到了一项有趣的任务 - 创建将使用 SSH 隧道作为代理浏览网页(通过 HTTPS)的软件。在阅读了一些关于 JSCH 的文档(http://www.jcraft.com/jsch/,一个 Java SSH 隧道库)之后,这些文档都以数据库连接为例,我决定自己尝试一下。这是我从http://kahimyang.info/kauswagan/code-blogs/1337/ssh-tunneling-with-java-a-database-connection-example复制的连接代码

int assigned_port;   
    int local_port=3309;

    // Remote host and port
    int remote_port=3306;
    String remote_host = "<SSH host goes here>";
    String login = "<SSH login goes here>";
    String password = "<SSH password goes here>";

    try {
        JSch jsch = new JSch(); 

        // Create SSH session.  Port 22 is your SSH port which
        // is open in your firewall setup.
        Session session = jsch.getSession(login, remote_host, 22);
        session.setPassword(password);

        // Additional SSH options.  See your ssh_config manual for
        // more options.  Set options according to your requirements.
        java.util.Properties config = new java.util.Properties();
        config.put("StrictHostKeyChecking", "no");
        config.put("Compression", "yes");
        config.put("ConnectionAttempts","2");

        session.setConfig(config);

        // Connect
        session.connect();            

        // Create the tunnel through port forwarding.  
        // This is basically instructing jsch session to send 
        // data received from local_port in the local machine to 
        // remote_port of the remote_host
        // assigned_port is the port assigned by jsch for use,
        // it may not always be the same as
        // local_port.

        assigned_port = session.setPortForwardingL(local_port, 
                remote_host, remote_port);

    } catch (JSchException e) {            
        System.out.println("JSch:" + e.getMessage());
        return;
    }

    if (assigned_port == 0) {
        System.out.println("Port forwarding failed!"); 
        return;
    }

现在,我对所有端口转发的东西并不完全有经验,但是,如果我理解正确,代码应该通过 SSH 转发所有传入 127.0.0.1:3309(或任何分配的端口)的连接服务器。现在我被困住了。我应该如何通过 127.0.0.1:3309 发送 HttpsURLConnection?我尝试将其定义为 HTTP 或 HTTPS 或 SOCKS 代理,但都不起作用。有人可以帮帮我吗?

【问题讨论】:

  • 除非它绝对必须是跨平台的,否则你最好使用标准的命令行ssh 操作。在任何情况下,在尝试使用 Java 执行此操作之前,请务必使用 ssh 客户端进行练习。
  • 作为提示,您可以使用ssh -D1080 &lt;remote host&gt;,它将在本地主机上创建一个 SOCKS5 代理。然后将 HTTPS 客户端设置为使用该代理。
  • @artbristol:我希望程序是跨平台的,并且我希望它可以在 Windows 上运行,Windows 没有大多数花哨的 Linux cmd 命令。顺便说一句,我没有安装 Linux,所以我很难尝试你推荐的命令行。有没有办法在 jsch 中使用 ssh -D1080
  • 如果你有putty,相当于在设置端口转发时选择'Dynamic'
  • @artbristol:我在 JSCH 上搜索了动态端口转发,但遗憾的是,它似乎缺少它。我会检查code.google.com/p/ssh-persistent-tunnel/source/browse/src/org/…,这似乎是建立在 JSCH 之上的动态端口转发选项,我很确定,它非常无效。

标签: java ssh jsch portforwarding httpsurlconnection


【解决方案1】:

您发布的代码会将所有流量从 127.0.0.1:3309 转发到您连接的 SSH 服务器上的端口 3306。

使用端口转发时,您将侦听地址:端口视为实际目标。因此,如果您需要使用 HttpsURLConnection,您可以使用

的 URL 构建它
https://127.0.0.1:3309/

显然,您还需要根据您要实现的目标向 URL 附加路径。我建议修改您的代码以使用更多标准 HTTP 端口,首先尝试使用 HTTP,一旦工作正常,请转到 HTTPS

int local_port=8080;
// Remote host and port
int remote_port=80;

上面的网址是

http://127.0.0.1:8080

您始终可以通过将 URL 粘贴到浏览器中来对其进行测试。

您在使用 HTTPS 时可能遇到的问题之一是证书验证,因此这就是为什么我建议先测试纯 HTTP 以证明您的代码正常工作的原因。

【讨论】:

  • 谢谢,我知道如何处理证书验证问题,我有一些现成的代码。但是,我真的不明白你的答案。如果我将 HttpsURLConnection 建立到 127.0.0.1,我将如何使用端口转发来浏览互联网?
  • 您的帖子特别提到了 HttpsURLConnection,我假设您想将其连接到您使用 Jsch 设置的隧道。看来您需要一个动态代理。有一个支持此功能的商业 API,J2SSH Maverick link
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-11-13
  • 2014-03-21
  • 1970-01-01
  • 2019-03-09
  • 2014-03-20
相关资源
最近更新 更多