使用nginx代理s3服务(私有云存储)

1、背景

公司网络安全原因,私有部署s3服务的机器无法被直接访问,所以需要加一层代理,通过访问代理去访问s3服务器,这里使用nginx进行代理。使用s3服务的方式是在代码中使用官方的java s3 sdk(本文对于其他语言的官方sdk也适用)。
由于在配置过程中遇到了一些问题,如果不对s3协议的签名校验规则比较了解就难以解决此问题,故在此记录分享一下。

2、配置

官方sdk访问云存储提供了方便的接口,下载文件直接getObject(),上传文件直接putObject(),可以让我们不需要关心底层的逻辑,专注与我们的业务开发。sdk在被调用getObject()方法时,会把我们的获取文件动作封装成一个http请求发送出去,sdk封装的请求的过程中会在请求头中放入一些信息,以让s3服务端对请求进行验证。下面展示一个“获取云存储中的所有桶信息”的请求与响应的http报文(云存储地址为10.11.12.13),注意观察请求头中多了一些认证相关的信息:

请求
GET / HTTP/1.1
Host: 10.11.12.13
amz-sdk-invocation-id: *****
amz-sdk-request: attempt=1;max=4
amz-sdk-retry: 0/0/500
Authorization: AWS4-HMAC-SHA256 Credential=*****, SignedHeaders=*****, Signature=*****
Content-Type: application/octet-stream
User-Agent: aws-sdk-java/*****
x-amz-content-sha256: *****
X-Amz-Date: 20231123T015112Z
Content-Length: 0
Connection: Keep-Alive响应
HTTP/1.1 200 OK
Content-Length: 785
Date: Thu, 23 Nov 2023 01:50:57 GMT
Vary: Origin
Connection: keep-alive<?xml version="1.0" encoding="utf-8"?>
<ListAllMyBucketsResult xmlns="http://s3.amazonaws.com/doc/2006-03-01"><Owner><ID>*****</ID><DisplayName>*****</DisplayName></Owner><Buckets><Bucket><Name>*****</Name><CreationDate>2023-09-28T08:49:10.000Z</CreationDate></Bucket></Buckets>
</ListAllMyBucketsResult>

重点: sdk在计算摘要时,会将请求的路径和请求Host参与摘到计算,所以一定要确保sdk访问nginx的uri和nginx访问云存储的uri保持一致(即请求头中的Host和请求路径要保持不变)。
这个怎么理解呢,直接看下面的两个报文,一个是sdk请求nginx的报文(nginx地址9.8.7.6),一个是nginx转发请求s3服务的报文,可以观察一下nginx转发后请求头中的哪些内容发生了变化,正是这些报文的变化导致了nginx转发到s3服务的请求失败(报错InvalidDigest,SignatureDoesNotMatch):

sdk请求nginx的报文
GET /xxx/x HTTP/1.1
Host: 9.8.7.6
amz-sdk-invocation-id: *****
amz-sdk-request: attempt=1;max=4
amz-sdk-retry: 0/0/500
Authorization: AWS4-HMAC-SHA256 Credential=*****, SignedHeaders=*****, Signature=*****
Content-Type: application/octet-stream
User-Agent: aws-sdk-java/*****
x-amz-content-sha256: *****
X-Amz-Date: 20231123T114100Z
Content-Length: 0
Connection: Keep-Alivenginx转发请求s3服务的报文
GET / HTTP/1.0
Host: 10.11.12.13
Connection: close
Content-Length: 0
amz-sdk-invocation-id: *****
amz-sdk-request: attempt=1;max=4
amz-sdk-retry: 0/0/500
Authorization: AWS4-HMAC-SHA256 Credential=*****, SignedHeaders=*****, Signature=*****
Content-Type: application/octet-stream
User-Agent: aws-sdk-java/*****
x-amz-content-sha256: *****
X-Amz-Date: 20231123T114100Z

上面我们可以发现两处不同:
在这里插入图片描述
sdk请求到nginx的路径是配置nginx代理规则的时候配的,当请求路径以 /xxx/x开头时,将请求转发到云存储。但是nginx转发到s3服务就不需要这个路径了,所以发生了变化。sdk请求到nginx时host肯定时nginx的地址,nginx请求到云存储时host肯定是云存储的地址,这样没问题。
nginx的这两个在转发后的变化非常合理,但是却导致了云存储认证的时候报错。原因就是sdk在发送请求时将 9.8.7.6/xxx/x加入了摘要的计算,但是正确的云存储访问应该是10.11.12.13/,这样就导致了问题,s3服务端那边将这个host的值和路径的值取过来进行运算,发现了不匹配,于是就报错了。
那么怎样修改使得s3那边不报错呢?很简单,只需要保证Host的值不变、sdk到nginx的路径和nginx到云存储的路径不变(即uri不变),就可以了。这里需要修改nginx的代理配置,首先要求代理的匹配规则必须为’/',然后将Host的值赋值到header中,看下面的配置:

		location / {proxy_pass   http://10.11.12.13:80;proxy_set_header Host 9.8.7.6;}

这里一定要注意,1、匹配的规则一定是 / ,不能是/x这种自定义匹配规则。2、转发后请求头的Host的值一定要和转发前请求头中的Host值相等,这里修改Host的值并不会导致请求转发不了。
在这里插入图片描述
经过如上配置后,使用sdk访问niginx就不会出错了,摘要认证就通过了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/182489.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vue+jsonp编写可导出html的模版,可通过外部改json动态更新页面内容

效果 导出后文件结果如图所示&#xff0c;点击Index.html即可查看页面&#xff0c;页面所有数据由report.json控制&#xff0c;修改report.json内容即可改变index.html展示内容 具体实现 1. 编写数据存储的json文件 在index.html所在的public页面新建report.json文件&#xff…

彩虹云商城搭建教程+源码程序

前言&#xff1a;域名服务器或宝塔主机商场程序在线云商城 随着电子商务的快速发展&#xff0c;越来越多的企业开始意识到开设一个自己的电子商城对于销售和品牌推广的重要性。然而&#xff0c;选择一家合适的网站搭建平台和正确地构建一个商城网站并不是一件容易的事情。本文…

PyQt基础_008_ 按钮类控件QSpinbox

基本操作 import sys from PyQt5.QtCore import * from PyQt5.QtGui import * from PyQt5.QtWidgets import *class spindemo(QWidget):def __init__(self, parentNone):super(spindemo, self).__init__(parent)self.setWindowTitle("SpinBox 例子")self.resize(300,…

微服务链路追踪组件SkyWalking实战

概述 微服务调用存在的问题 串联调用链路&#xff0c;快速定位问题&#xff1b;理清服务之间的依赖关系&#xff1b;微服务接口性能分析&#xff1b;业务流程调用处理顺序&#xff1b; 全链路追踪&#xff1a;对请求源头到底层服务的调用链路中间的所有环节进行监控。 链路…

电子学会C/C++编程等级考试2022年09月(三级)真题解析

C/C++等级考试(1~8级)全部真题・点这里 第1题:课程冲突 小 A 修了 n 门课程, 第 i 门课程是从第 ai 天一直上到第 bi 天。 定义两门课程的冲突程度为 : 有几天是这两门课程都要上的。 例如 a1=1,b1=3,a2=2,b2=4 时, 这两门课的冲突程度为 2。 现在你需要求的是这 n 门课…

Tableau连接到mysql数据库,配置驱动

Tableau想要连接mysql数据库进行数据的可视化&#xff0c;但是没有ODBC驱动&#xff0c;看了几篇文章写的&#xff0c;不是很清楚&#xff0c;顺便写下自己的思路。 1、下载mysql对应的ODBC驱动 首先要知道自己mysql的版本&#xff0c;然后下载对应的ODBC驱动。 MySQL :: Dow…

BUUCTF刷题之路-pwn-ciscn_2019_n_81

这 题查保护的时候吓了一跳&#xff0c;保护全开。脑子飞速旋转是要我绕过canary,PIE然后再利用栈溢出劫持程序流吗&#xff1a; 然后扔进IDA中查看下大致流程&#xff1a; 大致看出var是个数组&#xff0c;当var[13]17的时候就会得到system。那还不简单直接写payload: from p…

easyrecovery 16数据恢复软件2024最新免费下载地址

EasyRecovery 16是一款操作简单、功能强大数据恢复软件,通过easyrecovery可以从硬盘、光盘、U盘、数码相机、手机等各种设备中恢复被删除或丢失的文件、图片、音频、视频等数据文件。 EasyRecovery Pro 16安装步骤 一、首先需要在该页找到下载地址处选任意地址将EasyRecovery软…

Java核心知识点整理大全16-笔记

Java核心知识点整理大全-笔记_希斯奎的博客-CSDN博客 Java核心知识点整理大全2-笔记_希斯奎的博客-CSDN博客 Java核心知识点整理大全3-笔记_希斯奎的博客-CSDN博客 Java核心知识点整理大全4-笔记-CSDN博客 Java核心知识点整理大全5-笔记-CSDN博客 Java核心知识点整理大全6…

JAVA基础进阶(七)

一、集合和数组的区别 集合和数组的区别:数组的长度是固定的,集合的长度是可变的。数组既可以存储基本数据类型&#xff0c;也可以存储引用数据类型。集合只能存储引用数据类型,所以对于基本数据类型byte、short、int等只能存储他们对应的包装类Byte、Short、Integer。 二、集…

基于yolov2深度学习网络的打电话行为检测系统matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 4.1、YOLOv2网络原理 4.2、基于YOLOv2的打电话行为检测 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 matlab2022a 3.部分核心程序 .................................…

在虚拟机搭建nignx,和使用本地访问nginx的情况

下载nginx yum install nginx 查看nginx是否安装成功。 nginx -v nginx的配置文件的目录和资源的目录。 先到nginx.conf的目录下&#xff0c;在 /etc/nginx/nginx.conf&#xff0c;编辑它。 vi /etc/nginx/nginx.conf 可以看到默认的html的目录。在 /usr/share/nginx/html 下面…

网络安全 | 使用人工智能阻止网络攻击

全球范围内分布式拒绝服务 (DDoS) 网络攻击急剧增加&#xff0c;这种数字攻击可以通过大量的互联网流量压垮目标服务器&#xff0c;从而使网站瘫痪。这种攻击每年都会发生数百万起&#xff0c;而且数量和规模都在不断增加。大约三分之一的网站宕机是由于 DDoS 攻击所致。 计算…

MySQL--主从复制

主从复制 主从复制是指将主数据库的DDL和DML操作通过二进制日志传到从库服务器中&#xff0c;然后在从库上对这些日志重新执行&#xff08;也叫重做&#xff09;&#xff0c;从而使得从库和主库的数据保持同步。 MySQL支持一台主库同时向多台从库进行复制&#xff0c;从库同时…

properties转yml

目前搜索到的大部分代码都存在以下问题&#xff1a; 复杂结构解析丢失解析后顺序错乱 所以自己写了一个&#xff0c;经过不充分测试&#xff0c;基本满足使用。可以直接在线使用 在线地址 除了yml和properties互转之外&#xff0c;还可以生成代码、sql转json等&#xff0c;可…

Windows关闭端口服务命令

winR 打开命令运行 cmd 命令netstat -o -n -a | findstr :9993 显示所有的端口占用情况 -a 显示所有连接和监听端口 -n 以数字形式显示地址和端口号。 此选项一般与 -a选项组合使用 -o 显示与每个连接相关的所属进程 ID 终止 PID taskkill /F /PID 3652

[个人笔记] vCenter6.7使用自建SSL证书

SSL - 运维篇 第三章 vCenter6.7使用自建SSL证书 SSL - 运维篇系列文章回顾vCenter6.7使用自建SSL证书vCenter 6.7 上传文件到ShellvCenter 6.7 Shell 替换SSL证书全流程测试&验证 参考链接 系列文章回顾 第二章 FortiGate防火墙使用自建SSL证书 vCenter6.7使用自建SSL证书…

将原生Spring项目中某些配置文件中的易变内容参数化

&#x1f609;&#x1f609; 学习交流群&#xff1a; ✅✅1&#xff1a;这是孙哥suns给大家的福利&#xff01; ✨✨2&#xff1a;我们免费分享Netty、Dubbo、k8s、Mybatis、Spring...应用和源码级别的视频资料 &#x1f96d;&#x1f96d;3&#xff1a;QQ群&#xff1a;583783…

不小心删除了短信,如何在 Android 上恢复已删除的短信

不小心删除了文字消息在 Android 手机上使用可能会是一种令人痛苦的体验。这些消息可能包含有价值的信息、珍贵的回忆或重要的细节。幸运的是&#xff0c;您可以探索多种方法来恢复这些丢失的消息。在本文中&#xff0c;我们将深入研究可用于检索已删除短信的选项&#xff0c;并…

入门指南:Vue的安装配置和开发环境设置

背景&#xff1a; ​ 这里想讲一讲为什么使用框架&#xff0c;而不使用原生的HTML、CSS、JavaScript写。原生开发虽然灵活&#xff0c;但在大型项目中可能导致代码重复、维护困难等问题&#xff0c;不符合软件工程的"高内聚低耦合"原则。例如&#xff0c;如果每个页…