4、开发环境搭建:Python环境、SDK安装、凭证配置
这一章我们直接动手。很多同学拿到SDK文档,第一反应就是pip install一把梭,然后跑demo——结果报错连Python版本都不对。我踩过这种坑,浪费了一下午。所以咱们按步骤来,稳一点。
说白了,环境搭建就三步:跑对Python版本 → 装对SDK → 配好凭证。这三步走完,你才有资格谈调优。
4.1 Python 版本选择与虚拟环境
我个人的建议:Python 3.8 或 3.10。别用3.6,已经EOL了;也别追新用3.13,很多SDK还没适配。你可以在项目中用3.10,兼容性好,加密库的二进制包基本都有。
| 用途 | 推荐版本 | 理由 |
|---|---|---|
| 生产环境 | 3.10 | 长期支持,加密库稳定 |
| 本地开发 | 3.9 或 3.10 | 和CI/CD对齐 |
| 低版本兼容 | 3.8 | 部分老旧项目要求 |
确认版本后,一定要建虚拟环境。why?我曾经在同一个全局环境里装了两个不同版本的加密SDK,互相覆盖crypto库,搞了一天才发现是依赖冲突。现在我用 venv 或 conda,每个项目独立。
python -m venv .venv,然后 source .venv/bin/activate(Windows用 .venv\Scripts\activate)。以后所有安装操作都在这个虚拟环境里做,干净。
4.2 安装对象存储加密SDK
这里分两种情况:你用哪家云厂商?国内主流就是阿里云OSS、腾讯云COS、华为云OBS,加上AWS S3。每家SDK的名字不一样,但核心逻辑相似。
# 阿里云 OSS 加密扩展
pip install oss2[crypto]
# 腾讯云 COS 加密依赖
pip install cos-python-sdk-v5 cryptography
# AWS S3 加密客户端
pip install boto3 pycryptodome
# 华为云 OBS SDK
pip install esdk-obs-python cryptography
注意oss2[crypto]这个写法——方括号里是extra依赖,会自动装上`cryptography`等加密库。我刚开始没注意,以为只装`oss2`就行,结果调用加密接口时报ModuleNotFoundError。避坑:装完最好跑一下pip list | grep crypto确认。
cryptography从39升到40之后,某些低版本SDK的加密逻辑会报错。建议先装指定版本:pip install cryptography==39.0.2。等业务验证通过再升级。
4.3 凭证配置:AK/SK 与临时令牌
凭证配置是出问题最多的环节。SDK需要访问密钥(AccessKey ID + AccessKey Secret)来签名请求。我见过有人把AK/SK硬写在代码里,结果代码上传到GitHub公共仓库,几分钟后就被爬虫刷了一万多块钱的存储费用……别干这种事。
下面四种方式,按安全等级排序:
- 环境变量(推荐开发环境)
- 配置文件 ~/.ossutilconfig 或 ~/.aws/credentials
- 临时STS令牌(生产环境)
- 实例元数据/IMDS(云服务器内)
我个人最常用环境变量,简单直接:
# Linux/Mac
export OSS_ACCESS_KEY_ID="your-access-key-id"
export OSS_ACCESS_KEY_SECRET="your-access-key-secret"
export OSS_ENDPOINT="oss-cn-hangzhou.aliyuncs.com"
# Windows PowerShell
$env:OSS_ACCESS_KEY_ID = "your-access-key-id"
$env:OSS_ACCESS_KEY_SECRET = "your-access-key-secret"
$env:OSS_ENDPOINT = "oss-cn-hangzhou.aliyuncs.com"
然后在代码里读取:
import os
import oss2
auth = oss2.Auth(
os.environ['OSS_ACCESS_KEY_ID'],
os.environ['OSS_ACCESS_KEY_SECRET']
)
bucket = oss2.Bucket(
auth,
os.environ['OSS_ENDPOINT'],
'my-bucket-name'
)
# 验证:列出前10个对象
for obj in oss2.ObjectIterator(bucket):
print(obj.key)
# 加个break只取一个,免得刷太多
break
避坑:我曾经配了环境变量但SDK一直报InvalidAccessKeyId。查了半小时,发现是export后面不小心多了空格:export OSS_ACCESS_KEY_ID= "xxx"。等号右边带空格,shell会把变量值当成空字符串。你写的时候别犯这种低级错误。
4.4 验证环境:快速跑通一个加密上传
环境搭好之后,别急着调参数。先跑一个最简单的加密上传,确认整条链路通。
import os
from oss2 import Auth, Bucket, ObjectInfo
from oss2.crypto import RsaProviderCrypto
auth = Auth(os.environ['OSS_ACCESS_KEY_ID'], os.environ['OSS_ACCESS_KEY_SECRET'])
bucket = Bucket(auth, os.environ['OSS_ENDPOINT'], 'my-bucket')
# 使用客户端加密(RSA)
crypto = RsaProviderCrypto(auth, bucket, 'my-public-key.pem', 'my-private-key.pem')
# 上传一个字符串
result = bucket.put_object('test-encrypted.txt', 'Hello, encrypted world!', crypto=crypto)
print(f"上传成功,ETag: {result.etag}")
# 下载并解密
downloaded = bucket.get_object('test-encrypted.txt', crypto=crypto)
print(f"下载内容: {downloaded.read()}")
如果这段代码能跑通,说明Python、SDK、凭证、加密公钥/私钥全部就位。后面调优才有基础。如果报错,80%是凭证问题或网络代理。你可以用requests先裸调一次OSS的GET Service接口,确认网络通。
这张图是我自己画的工作流。你看,凭证配置和RSA密钥对是并行准备的,但都要就绪后才能跑加密上传验证。顺序别搞反,先配好AK/SK再生成密钥对也行,看个人习惯。