用途
Oracle Cloud Install & Auth 用于配置 Oracle Cloud Infrastructure(OCI)的 API 密钥认证。OCI 认证需要 ~/.oci/config 文件,其中包含五个必填字段:用户 OCID、指纹、租户 OCID、区域以及 RSA 私钥路径。任何一个字段错误都会产生难以定位的 ConfigFileNotFound 或 InvalidKeyFilePath 错误。该技能的目标是生成经过验证的 ~/.oci/config 文件、生成 RSA 密钥对、将公钥上传到 OCI,并通过 Python SDK 和 OCI CLI 验证连接。
主要能力
- 安装 OCI Python SDK 和 CLI(pip install oci oci-cli)
- 生成 RSA 密钥对并设置私钥权限为 600
- 获取密钥指纹
- 在 OCI 控制台上传公钥
- 创建包含五个必填字段的 ~/.oci/config 文件
- 使用 Python SDK 验证认证(oci.config.validate_config、IdentityClient)
- 使用 OCI CLI 验证认证(oci iam user get)
- 提供配置验证脚本以捕获常见配置错误
- 支持多配置文件(如 dev/staging/prod)
使用方式
前置条件:拥有活跃租户的 OCI 账户(https://cloud.oracle.com)、Python 3.8+、OpenSSL、用户 OCID、租户 OCID 以及家庭区域。
步骤:
- 安装 OCI Python SDK 和 CLI:
pip install oci oci-cli - 生成 RSA 密钥对:
mkdir -p ~/.oci openssl genrsa -out ~/.oci/oci_api_key.pem 2048 chmod 600 ~/.oci/oci_api_key.pem openssl rsa -pubout -in ~/.oci/oci_api_key.pem -out ~/.oci/oci_api_key_public.pem - 获取密钥指纹:
openssl rsa -pubout -outform DER -in ~/.oci/oci_api_key.pem | openssl md5 -c - 将公钥上传到 OCI 控制台:Profile > User Settings > API Keys > Add API Key > Paste Public Key,粘贴 ~/.oci/oci_api_key_public.pem 的内容,控制台显示的指纹必须与步骤 3 匹配。
- 创建配置文件:
所有五个字段均为必填。key_file 必须指向私钥(而非公钥 .pem)。cat > ~/.oci/config << 'EOF' [DEFAULT] user=ocid1.user.oc1..aaaa_YOUR_USER_OCID fingerprint=ab:cd:ef:12:34:56:78:90:ab:cd:ef:12:34:56:78:90 tenancy=ocid1.tenancy.oc1..aaaa_YOUR_TENANCY_OCID region=us-ashburn-1 key_file=~/.oci/oci_api_key.pem EOF chmod 600 ~/.oci/config - 使用 Python SDK 验证:
import oci config = oci.config.from_file("~/.oci/config") oci.config.validate_config(config) identity = oci.identity.IdentityClient(config) user = identity.get_user(config["user"]).data print(f"Authenticated as: {user.name} ({user.email})") print(f"Tenancy: {config['tenancy']}") print(f"Region: {config['region']}") - 使用 OCI CLI 验证:
oci iam user get --user-id "$(grep ^user ~/.oci/config | cut -d= -f2)" \ --query 'data.name' --raw-output - 配置验证脚本(validate_oci_config.py):
import oci import os def validate(): """Validate OCI config file and key access.""" config_path = os.path.expanduser("~/.oci/config") if not os.path.exists(config_path): raise FileNotFoundError(f"Config not found: {config_path}") config = oci.config.from_file(config_path) oci.config.validate_config(config) key_path = os.path.expanduser(config.get("key_file", "")) if not os.path.exists(key_path): raise FileNotFoundError(f"Private key not found: {key_path}") perms = oct(os.stat(key_path).st_mode)[-3:] if perms != "600": print(f"WARNING: Key file permissions are {perms}, should be 600") identity = oci.identity.IdentityClient(config) identity.get_user(config["user"]) print("Config is valid. Authentication successful.") validate()
多配置文件示例:
# ~/.oci/config
[DEFAULT]
user=ocid1.user.oc1..aaaa_PROD_USER
tenancy=ocid1.tenancy.oc1..aaaa_PROD
region=us-ashburn-1
fingerprint=ab:cd:...
key_file=~/.oci/oci_api_key.pem
[STAGING]
user=ocid1.user.oc1..aaaa_STAGING_USER
tenancy=ocid1.tenancy.oc1..aaaa_STAGING
region=us-phoenix-1
fingerprint=12:34:...
key_file=~/.oci/oci_api_key_staging.pem
# Load a specific profile
config = oci.config.from_file("~/.oci/config", profile_name="STAGING")
适用场景
- 设置新的 OCI 集成
- 生成 API 签名密钥
- 排查 OCI 认证错误(如 NotAuthenticated、ConfigFileNotFound、InvalidKeyFilePath、InvalidPrivateKey、NotAuthorizedOrNotFound、CERTIFICATE_VERIFY_FAILED)
- 管理多环境(dev/staging/prod)的 OCI 配置文件
限制
- 需要 OCI 账户、Python 3.8+、OpenSSL 和必要的 OCID 信息
- 五个配置字段必须全部正确,否则会产生难以定位的错误
- 公钥必须在 OCI 控制台手动上传,指纹必须与本地生成的一致
- 私钥文件权限应为 600,否则会有安全警告
- 企业代理环境下可能遇到 SSL 证书问题(CERTIFICATE_VERIFY_FAILED)
- 认证成功后可继续使用 oraclecloud-hello-world 启动第一个计算实例,或参考 oraclecloud-common-errors 解决认证问题
输出结果
成功完成后将产生:
- RSA 密钥对:~/.oci/oci_api_key.pem(私钥)和 ~/.oci/oci_api_key_public.pem(公钥)
- 经过验证的 ~/.oci/config 文件,包含所有五个必填字段
- 公钥已上传到 OCI 用户配置文件,且指纹匹配
- 通过 Python SDK 或 OCI CLI 确认 API 连接正常