使用本地主机 (127.0.0.1) 隧道连接到远程 URL 时无法 PUT

Unable to PUT when tunneling to a remote URL using localhost(127.0.0.1)

我想在具有基本授权的 Postman 中对以下 URL 执行 GET:

https://1.2.3.4:8338/accounts

不幸的是,我无法直接连接到该服务器,所以我使用 SSH 隧道管理器和

通过 Jump 服务器 5.6.7.8 建立了隧道
ssh -N -p 22 username@5.6.7.8 -o StrictHostKeyChecking=no -L 127.0.0.1:8080:1.2.3.4:8338

成功了。我现在想通过使用 AWSV4 授权对此 URL 执行 PUT 来创建一个容器:

https://1.2.3.4/testcontainer

如果我使用上面的调谐器,我会收到 404 错误。我感觉我的问题是隧道在端口 8338 上,但我的 URL 没有指定端口。我试过将 1.2.3.4 上的端口留空,但它默认为 0,隧道不起作用。

然后我尝试将该端口设置为 443(默认 HTTPS 端口)。当我这样做时,我收到 SignatureDoesNotMatch 错误。我认为那是因为我在端口 8338 上设置了 AWSV4 身份验证(这是一个猜测)。

最后我尝试使用端口 443 设置 AWSV4 授权,但收到 403 错误。

我不知道现在该去哪里。有人可以建议我使用 localhost 对下面的 URL 进行 PUT 操作吗?

https://1.2.3.4/testcontainer

更新 2017-06-28


我可以访问可以直接连接到 1.2.3.4 的服务器,并决定尝试在终端中使用 curl。它不起作用,因为我需要使用 AWS v4 身份验证。在研究这个时,我遇到了 s3curl。我试过 运行 以下方法:

./s3curl.pl --id personal -- -s -v -X PUT https://1.2.3.4/testcontainer -k

仍然没有运气。这是输出:

* Hostname was NOT found in DNS cache
*   Trying 1.2.3.4...
* Connected to 1.2.3.4 (1.2.3.4) port 443 (#0)
* successfully set certificate verify locations:
*   CAfile: none
  CApath: /etc/ssl/certs
* SSLv3, TLS handshake, Client hello (1):
* SSLv3, TLS handshake, Server hello (2):
* SSLv3, TLS handshake, CERT (11):
* SSLv3, TLS handshake, Server key exchange (12):
* SSLv3, TLS handshake, Request CERT (13):
* SSLv3, TLS handshake, Server finished (14):
* SSLv3, TLS handshake, CERT (11):
* SSLv3, TLS handshake, Client key exchange (16):
* SSLv3, TLS change cipher, Client hello (1):
* SSLv3, TLS handshake, Finished (20):
* SSLv3, TLS change cipher, Client hello (1):
* SSLv3, TLS handshake, Finished (20):
* SSL connection using ECDHE-RSA-AES256-SHA384
* Server certificate:
*    subject: C=US; ST=T; L=A; O=B; CN=access01.b.com;       emailAddress=b@us.b.com
*    start date: 2017-06-04 08:05:04 GMT
*    expire date: 2018-06-05 08:25:00 GMT
*    issuer: C=US; ST=I; L=C; O=cc; CN=Manager CA; serialNumber=serialnumber
*    SSL certificate verify result: unable to get local issuer certificate (20), continuing anyway.
> PUT /testcontainer HTTP/1.1
> User-Agent: curl/7.35.0
> Host: 1.2.3.4
> Accept: */*
> Date: Wed, 28 Jun 2017 13:23:01 +0000
> Authorization: AWS authoization
> 
< HTTP/1.1 403 Forbidden
< Date: Wed, 28 Jun 2017 13:23:01 GMT
< X-Clv-Request-Id: requestid
< Accept-Ranges: bytes
* Server cc/3.1.0.1 is not blacklisted
< Server: cc/3.1.0.1
< X-Clv-S3-Version: 2.5
< x-amz-request-id: requestid
< Content-Type: application/xml
< Content-Length: 894
< 
<?xml version="1.0" encoding="UTF-8" standalone="yes"?><Error>   <Code>SignatureDoesNotMatch</Code><Message>The request signature we calculated does not match the signature you provided. Check your AWS Secret Access Key and signing method. For more information, see REST Authentication and SOAP Authentication for details.</Message><Resource>/pctestcontainer1/</Resource><RequestId>bfb1bdf1-9d7a-4bc7-966a-a3a5e89498eb</RequestId><StringToSign>PUT


Wed, 28 Jun 2017 13:23:01 +0000
* Connection #0 to host 10.137.63.202 left intact
/pctestcontainer1</StringToSign><StringToSignBytes>80 85 84 10 10 10 87 101 100 44 32 50 56 32 74 117 110 32 50 48 49 55 32 49 51 58 50 51 58 48 49 32 43 48 48 48 48 10 47 112 99 116 101 115 116 99 111 110 116 97 105 110 101 114 49</StringToSignBytes><SignatureProvided>signature</SignatureProvided><AWSAccessKeyId>accesskey</AWSAccessKeyId><httpStatusCode>403</httpStatusCode></Error>root@utility:/tmp/cp/s3curl#

这对任何人都意味着什么吗?

经过大量调查,我发现我需要在我的 header 中包含一个 "Host" 密钥并使用我生成的 AWS V4 凭据。

我现在可以使用 Postman 中的语句执行 PUT。