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公共仓库,几分钟后就被爬虫刷了一万多块钱的存储费用……别干这种事。

下面四种方式,按安全等级排序:

  1. 环境变量(推荐开发环境)
  2. 配置文件 ~/.ossutilconfig 或 ~/.aws/credentials
  3. 临时STS令牌(生产环境)
  4. 实例元数据/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接口,确认网络通。

重点记忆:开发环境搭建不只是装个软件包,而是要验证“凭证可访问、加密可调用、网络可到达”。这三条缺一不可。
开发环境搭建流程 Python 3.10 + venv pip install [加密SDK] 配置AK/SK/Endpoint RSA密钥对就绪 跑加密上传Demo 验证通过 ✅ 💡 每个箭头代表一个前置条件 虚线表示可提前准备,非严格串行

这张图是我自己画的工作流。你看,凭证配置和RSA密钥对是并行准备的,但都要就绪后才能跑加密上传验证。顺序别搞反,先配好AK/SK再生成密钥对也行,看个人习惯。