Java - 使用 SSH 隧道连接到网页

标签 java ssh jsch portforwarding httpsurlconnection

各位 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 代理,但两者都不起作用。有人可以帮助我吗?

最佳答案

您发布的代码会将所有流量从 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;

上面的 URL 为

http://127.0.0.1:8080

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

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

关于Java - 使用 SSH 隧道连接到网页,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23739696/

相关文章:

java - 修改jdk文件夹中的src.zip文件

java - 配置 Xerces SAX 解析器以容忍 XML 语法错误

java - 在 JUNG 图中创建冗余重复节点

Gitolite git clone 需要ssh密码

jenkins - 无法通过jenkins连接到AWS从站

jsch1.4.8的Java Telnet Applet无法输入

java - 如何将注册表中的 putty 已知主机条目转换为 Jsch 可读的已知主机文件

java - 如何使用 Jersey Client 针对 WS 上的 Spring Security 进行身份验证

linux - 在脚本中执行 ssh 命令

java - JSch:ByteArrayInputStream:如何检查最终结果