当 URL 重定向到 https 时,ssh 本地端口转发不起作用

当 URL 重定向到 https 时,ssh 本地端口转发不起作用

我有一台 Windows 10 家庭版,其中使用 vmware 虚拟机软件运行 Linux kali。

有一个本地网站可以在 url 上打开https://example.com在 Linux 中,并具有自签名证书。我已在文件中添加了它的 IP 条目,etc/hosts以便它在 example.com 上打开。

Linux 上的 /etc/hosts 文件条目:

192.168.49.2    example.com

在浏览器(即)上打开时,此本地网站会重定向到 https 网址http://example.com=>>>https://example.com

该网站托管在 kubernetes 上,入口代码如下:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: first-ingress
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
    nginx.ingress.kubernetes.io/force-ssl-redirect: "true"
    nginx.ingress.kubernetes.io/ssl-redirect: "true"
spec:
  tls:
  - hosts:
      - example.com
    secretName: myssl
  rules:
  - host: example.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: first-service
            port:
              number: 8080

(我认为问题中不需要入口代码,但为了这个目的,我给出了它。)

问题是我无法从我的 Windows 进行 ssh 本地端口转发。ssh 脚本是:

ssh -L 9090:example.com:80 [email protected]

我收到 404 Not Found nginx 错误。

我还尝试使用以下命令使用 443 端口:

ssh -L 9090:example.com:443 [email protected]

在这种情况下,错误是:

400 Bad Request 普通的 HTTP 请求被发送到 HTTPS 端口 nginx

当我打开 URL“https://localhost:9090/”时,我也收到错误消息“证书链由不受信任的机构颁发。”

如果我删除重定向,那么 ssh 本地端口重定向就可以正常工作,我可以使用localhost:9090url 在 Windows 浏览器上打开网站。只有存在重定向时才会出现此问题。

我怎么解决这个问题?

答案1

在第一种情况下,当您的浏览器收到重定向到时,https://example.com它会尝试在端口 443(默认 https 端口)上与主机建立新连接。因此,如果您希望此方法有效,则除了现有的 http 端口转发子句( )之外,example.com还需要在 ssh 命令行中添加第二个 https 端口转发子句(例如) 。443:example.com:4439090:example.com:80

此外,根据您的 nginx 配置(您未共享),nginx 可能仅为对主机名 的请求提供服务example.com,而不是localhost。因此,您可能必须localhost在 nginx 配置中添加该站点的别名,或者example.com将 的 IPv4 地址添加127.0.0.1到 Windowshosts文件并在浏览器中使用它。

在第二种情况下,当您在浏览器中输入 URL http://localhost:9090(或只是localhost:9090)时,您指示它与端口 9090 建​​立 http(非 TLS)连接,但您将该端口转发到 nginx 服务器的 https 端口 443。因此,您的浏览器最终会尝试与 nginx 想要使用 https 的端口进行 http 通信。如果您希望此方案有效,则必须告诉浏览器使用 https 而不是 http,即输入 URLhttps://localhost:9090而不是http://localhost:9090

请注意,与第一种情况一样,nginx 可能(取决于配置)仅响应主机名example.com,并且404 Not found如果地址为 则响应localhost。修复方法与上面针对第一种情况所述的相同。

相关内容