Jsch: 隧道中的HTTPS

3
我可以在Ubuntu上建立端口转发会话,方法如下:
ssh -L 8000:dev.mycompany.com:443 jump.mycompany.com
现在我想用Jsch来模拟这个过程:
    public static void openTunnel() {
    JSch jsch = new JSch();
    String privateKey = "~/.ssh/id_rsa";
    try {
        jsch.addIdentity(privateKey);
        log.info("Connecting to {}@{}", getJumpUser(), getJumpServer());
        Session session = jsch.getSession(getJumpUser(), getJumpServer(), 22);
        session.connect();
        session.setPortForwardingL(8000, getHost(), 433);
    } catch (JSchException e) {
        log.error("", e);
    }
}

然而,在隧道设置完毕后,我尝试使用RestTemplate(Spring HTTP客户端——但是CURL也会出现错误)连接它时,会出现以下异常:
ssl.SSLHandshakeException: Remote host closed connection during handshake
    at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:744)

我需要在Jsch中进行哪些配置才能使其与openssh客户端完全相同?

你可以在服务器上检查/var/log/auth,可能会有一些提示。 - jeb
你保持会话开启吗?它不是被垃圾回收了吗? - Martin Prikryl
所以会话看起来已经设置好了,但是当我尝试使用Java或Curl客户端打开https连接时,会遇到握手错误。使用ssh命令设置隧道时,我没有遇到这样的错误。 - Balázs Németh
这是我的问题的答案吗?我不明白。 - Martin Prikryl
我简直不敢相信,你的 curl https://localhost:8000 命令可以使用 ssh 运行,它应该会抛出类似于 curl: (51) SSL: no alternative certificate subject name matches target host name 'localhost' 的错误信息。 - jeb
在添加“—insecure”参数时并不是问题所在。另外,Java客户端正在跳过证书检查。 - Balázs Németh
1个回答

3

我猜您正在尝试连接一个不公开可用的https Web服务器。

端口转发可以工作,但是在localhost:8000上无法使用https,因为证书是针对dev.mycompany.com而不是localhost的。

您可以通过将条目添加到hosts文件中来欺骗系统。

127.0.0.1 dev.mycompany.com

但是可能尝试使用socks5会更容易。
ssh jump.mycompany.com -D 8005

然后在浏览器中进行设置 (以 Firefox 为例):

选择:手动配置代理:
Socks 主机:localhost
端口:8005
Socks5


在Ubuntu中使用SSH设置隧道,然后使用https://localhost:8000可以工作,但JSCH隧道不行,所以这不是证书的问题。感谢提供socks提示,这是在构建服务器(Bitbucket Pipelines)上使用JUnit进行集成测试。 - Balázs Németh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接