You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

AWS Glue作业连接SAP OData时自定义SSL证书信任失败问题咨询

AWS Glue作业连接SAP OData时自定义SSL证书信任失败问题咨询

问题背景

我最近在运行AWS Glue作业连接SAP OData服务时遇到了SSL证书信任问题,具体情况如下:

作业代码片段

# 我运行的Glue作业代码片段
connection_type="sapodata",
connection_options={
    "ENABLE_CDC": "false",
    "connectionName": "sapodata-connection",
    "SELECTED_FIELDS": "MANDT,MATNR,VKORG,VTWEG,VMSTA,VMSTD,PRODH,MVGR1,MVGR2,MVGR3,MVGR4,MVGR5,ERDAT,AEDAT,DLTDT",
    "ENTITY_NAME": "/sap/opu/odata/sap/ZBI_WAREHOUSE_SRV/MVKESet",
    "FILTER_PREDICATE": f"{field_name_delta_1} >= '{delta_date}'",
    "JdbcEnforceSsl": "true",
    "CustomJdbcCert": f"s3://{s3_bucket}/cert/{cert}"
},
transformation_ctx="sap_data"

报错信息

作业执行时触发以下SSL证书错误:

An error occurred while calling o106.getSource. Glue connector returned client exception. Please retry after some time, request failed with HTTP IO exception with the following message: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target

已尝试的操作与观察

  • 在AWS Glue控制台对sapodata-connection执行“测试连接”时,完全正常,没有任何SSL相关报错
  • 已经在连接配置中明确设置了:
    • "JdbcEnforceSsl": "true"
    • "CustomJdbcCert": f"s3://{s3_bucket}/cert/{cert}"

我的问题

为什么测试连接能成功,但Glue作业却抛出PKIX路径构建失败的错误?我是否需要额外配置才能让Glue作业信任SAP OData的自定义SSL证书?


分析与解决方案

这个问题的核心是AWS Glue控制台的测试连接环境与作业运行环境存在本质差异,我整理了几个最可能的原因和对应的解决方法:

1. 作业IAM角色缺少S3证书读取权限

Glue控制台的“测试连接”使用的是AWS Glue服务的内置权限集合,而你的Glue作业是用专属的IAM角色运行的。如果这个作业角色没有读取S3证书文件的权限,就会导致证书无法加载,进而触发SSL信任错误。

验证与修复:

  • 打开IAM控制台,找到你的Glue作业所使用的IAM角色
  • 检查该角色是否包含s3:GetObject权限,目标资源为证书所在的S3路径(s3://{s3_bucket}/cert/{cert})
  • 如果没有,添加如下权限策略片段:
{
    "Effect": "Allow",
    "Action": "s3:GetObject",
    "Resource": "arn:aws:s3:::your-s3-bucket-name/cert/your-cert-file.pem"
}

2. 证书路径的变量替换未生效

你在代码中用f-string动态生成了证书路径,但如果作业运行时s3_bucket或cert这两个变量没有被正确赋值(比如变量未定义、拼写错误),就会生成无效的S3路径,导致证书加载失败。

验证与修复:

  • 在作业代码开头添加日志,打印最终的证书路径,确认是否正确:
    import logging
    
    logger = logging.getLogger()
    logger.setLevel(logging.INFO)
    custom_cert_path = f"s3://{s3_bucket}/cert/{cert}"
    logger.info(f"CustomJdbcCert path being used: {custom_cert_path}")
    
  • 确保s3_bucket和cert变量在作业代码的上下文里已经被正确定义(比如从作业参数传入,或在代码中显式赋值)

3. 连接器不支持直接读取S3路径的证书

部分SAP OData Glue连接器可能不支持直接使用S3路径作为证书参数——测试连接时Glue控制台会自动处理S3证书的下载与加载,但作业运行环境不会做这个自动处理。

修复方案:
在作业代码开头添加逻辑,将S3上的证书下载到Glue作业的临时目录(比如/tmp/),然后在连接配置中指定本地路径:

import boto3
import os

# 初始化S3客户端
s3 = boto3.client('s3')
# 定义证书本地存储路径
local_cert_path = '/tmp/sap-cert.pem'
# 从S3下载证书到本地
s3.download_file(s3_bucket, f"cert/{cert}", local_cert_path)

# 后续连接配置中修改为本地路径
connection_options={
    # ... 其他原有配置 ...
    "CustomJdbcCert": local_cert_path
}

4. 证书格式不符合要求

如果你的证书是DER二进制格式,而JDBC连接器要求PEM文本格式,也会导致证书无法被识别。测试连接可能自动完成了格式转换,但作业环境不会。

验证与修复:

  • 检查证书格式:如果是DER格式,使用OpenSSL转换为PEM格式:
    openssl x509 -in your-cert.der -out your-cert.pem -inform der -outform pem
    
  • 将转换后的PEM格式证书重新上传到S3,再在作业中使用

5. Glue作业版本的环境差异

不同版本的Glue作业(比如1.0、2.0、3.0)使用的JDK版本、JDBC驱动版本不同,证书加载的逻辑也可能有差异。比如Glue 1.0用Java 8,Glue 3.0用Java 11,信任库的路径和加载方式有区别。

修复方案:

  • 尝试切换Glue作业的版本(比如从1.0升级到3.0),看是否能解决问题
  • 或者在作业中手动将证书添加到Java信任库中(适合允许运行shell脚本的作业),示例代码:
    import subprocess
    
    # 将证书添加到Java信任库
    subprocess.run([
        "keytool", "-importcert", "-file", local_cert_path,
        "-keystore", "/usr/lib/jvm/java-1.8.0/jre/lib/security/cacerts",
        "-storepass", "changeit", "-noprompt", "-alias", "sap-cert"
    ])
    

内容来源于stack exchange

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.07 09:27:57