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

news2024/11/16 18:03:13

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-Alive

nginx转发请求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.coloradmin.cn/o/1247608.html

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

相关文章

输入4个整数,找出其中最大的数。用函数的嵌套调用来处理

目录 1解题思路: 2运行代码&#xff1a; 3运行结果: 4总结&#xff1a; 函数 定义函数 实例 函数声明 调用函数 实例 函数参数 1解题思路: 这个问题并不复杂&#xff0c;完全可以利用一个主函数就可以得到结果。现在根据题目要求&#xff0c;用函数的嵌套调用来处理。…

redis运维(十二) 位图

一 位图 ① 概念 1、说明&#xff1a;位图还是在操作字符串2、位图玩字符串在内存中存储的二进制3、ASCII字符通过映射转化为二进制4、操作的是字符串value ② ASCII字符铺垫 1、控制ASCII字符 2、ASCII可显示字符 ③ SETBIT 细节&#xff1a; setbit 命令的返回值是之…

自求导的方法实现线性回归算法

线性回归是一种常用的回归算法&#xff0c;用于建立输入变量和连续输出变量之间的关系。传统的线性回归算法通常依赖于繁琐的数学推导和梯度计算。但是&#xff0c;随着深度学习的兴起&#xff0c;自求导的方法逐渐成为实现线性回归算法的有效途径。本文将介绍如何使用自求导的…

FreeRTOS-FreeRTOS概述

FreeRTOS FreeRTOS目录结构 移植过程 在工程中创建freertos文件夹&#xff0c;在freertos文件夹中创建src文件夹、inc文件夹、port文件夹。 freertos/src存放源码freertos/inc存放头文件freertos/port存放移植平台的相关文件 复制内存管理文件&#xff1a;复制FreeRTOS/Sourc…

时间复杂度 空间复杂度 ---java

目录 一. 算法效率 二.时间复杂度 2.1 时间复杂度的概念 2.2 大O的渐进表示法 2.3常见时间复杂度计算举例 三. 空间复杂度 一. 算法效率 算法效率分析分为两种&#xff1a;第一种是时间效率&#xff0c;第二种是空间效率 。 时间效率被称为时间复杂度&#xff0c;而空间…

post请求参数全大写后台接不到参数

post请求参数全大写后台接不到参数 开发过程中&#xff0c;我们一般都习惯用驼峰命名法&#xff0c;但是特殊情况要求请求参数全大写&#xff08;或者首字母大写&#xff09;&#xff0c;测试验证的时候发现&#xff0c;接收不到请求参数。 前端请求传递&#xff1a; 服务端接…

季报含金量强势推高股价,满帮十年持续拉高数字货运生态天花板

经济活动越发密集&#xff0c;跑在路上的货车和司机们成为最忙碌的角色。11月20日美股盘前&#xff0c;数字货运龙头满帮集团&#xff08;YMM.US&#xff0c;以下简称&#xff1a;满帮&#xff09;发布2023年第三季度财报&#xff0c;其用户规模、业绩数据、履约单量等指标全面…

亚马逊两步验证有哪些验证方法?

亚马逊通常提供多种两步验证的方式&#xff0c;包括短信&#xff08;通过手机接收验证码&#xff09;和认证器应用程序&#xff08;如Google Authenticator、Authy等&#xff09;。选择你偏好的方式。 短信验证&#xff1a; 如果选择短信验证&#xff0c;需要将你的手机号码关联…

《算法通关村——原来这就是堆》

《算法通关村——原来这就是堆》 理解最大堆&#xff1a; 最大堆就是父节点一定比子节点都要大所以就形成了&#xff0c;自然而然根节点就是最大的值了。 如果在最大堆中要插入值得话&#xff0c;那么就需要把值插入到最后&#xff0c;然后一步一步得走上去&#xff0c;也就是…

分布式算法paxos

Paxos算法是什么&#xff1f; Paxos 算法是 基于消息传递 且具有 高效容错特性 的一致性算法&#xff0c;目前公认的解决 分布式一致性问题 最有效的算法之一。 Paxos算法的工作流程&#xff1f; 角色&#xff1a; 在Paxos中有这么几个角色&#xff1a; Proposer&#xff08;提…

Centos7 离线安装 CDH7.1.7

1. 安装CDH的准备工作&#xff08;所有节点都要执行&#xff09; 1.1 准备环境 角色 IP k8s-master 192.168.181.129 k8s-node1 192.168.181.130 k8s-node2 192.168.181.131 1.2 安装JDK # https://www.oracle.com/java/technologies/downloads/#java11 wget rpm -ivh…

知虾官网:探索跨境电商数据的新平台

随着电子商务的快速发展&#xff0c;跨境电商已成为全球贸易的重要组成部分。为了帮助企业更好地了解市场、选品、分析竞争对手和科学运营&#xff0c;知虾官网应运而生。本文将为您介绍知虾官网的功能和优势&#xff0c;以及广州萌啦信息科技有限公司的背景。 一、知虾官网的功…

电源控制系统架构(PCSA)之系统分区电源域

目录 4.2 电源域 4.2.1 电源模式 4.2.2 电源域的选择 4.2.3 系统逻辑 4.2.4 Always-On域 4.2.5 处理器Clusters 4.2.6 CoreSight逻辑 4.2.7 图像处理器 4.2.8 显示处理器 4.2.9 其他功能 4.2.10 电源域层次结构要求 4.2.11 SOC域示例 4.2 电源域 电源域在这里被定…

VScode安装使用DevChat插件

前言 DevChat是一个开源平台,使开发人员能够更有效地将人工智能集成到代码生成和文档中。DevChat的目标是超越简单的代码自动完成和对代码片段的有限操作。DevChat为开发人员提供了一种非常实用和有效的方式来与大型语言模型(llms)进行交互和协作。 一、安装DevChat插件 De…

西米支付:简单介绍一下支付公司的分账功能体系

随着互联网的普及和电子商务的快速发展&#xff0c;支付已经成为人们日常生活的重要组成部分。支付公司作为第三方支付平台&#xff0c;为消费者和商家提供了便捷、安全的支付方式。而在支付领域中&#xff0c;分账功能是一个非常重要的功能&#xff0c;它可以帮助企业实现资金…

一篇总结 Linux 系统启动的几个汇编指令

学习 Linux 系统启动流程&#xff0c;必须熟悉几个汇编指令&#xff0c;总结给大家。 这里不是最全的&#xff0c;只列出一些最常用的汇编指令。 一&#xff0e;数据处理指令 1.数据传送指令 【MOV指令】 把一个寄存器的值(立即数)赋给另一个寄存器&#xff0c;或者将一个…

如何巧用拨测监控中的自定义维度?

在拨测监控的场景中&#xff0c;用户往往很关心拨测的资源对象是否正常。在当前拨测采集策略中&#xff0c;拨测采集对象本身可能无法反映出配置的拨测地址&#xff0c;用户可能还需要找到具体的拨测采集策略后才能确认拨测地址。 本期EasyOps产品使用最佳实践&#xff0c;我们…

『Confetti 喜庆散花插件の使用』

以下用 VUE3 语法 举例使用&#xff1a; npm install js-confetti<script setup lang"ts"> import JSConfetti from js-confetticonst confetti new JSConfetti()function showConfetti() {confetti.addConfetti() } </script><template><h1 …

井盖位移传感器怎么监测井盖安全

井盖在城市基础设施建设中扮演着不可或缺的角色&#xff0c;虽然看似并不起眼但确实是城市规划中一个重要的组成部分。在城市规划建设之初都需要首先考虑排水系统的设计&#xff0c;而井盖作为排水系统的一个重要组成部分&#xff0c;一旦出现问题便会造成交通中断或者环境受影…

Unity SRP 管线【第三讲:URP 光照】

3.2.3 以前属于Shader部分&#xff0c;Shader部分不进行讲解。 这里只涉及Unity内部管线的设置问题。 文章目录 3.2.3 向GPU发送灯光数据设置光源数据设置主光源设置额外点光源 Shader中的数据 3.2.3 向GPU发送灯光数据 在UniversalRenderPipeline.cs > RenderSingleCamera…