修修改支付宝证书逐张解析

This commit is contained in:
db_huang 2026-10-29 10:47:18 +08:00
parent 5f9264fbb2
commit e70866c4b6
4 changed files with 38 additions and 4 deletions

View File

@ -76,10 +76,24 @@ def _load_certificate_bundle(path_value: str, label: str):
raise AlipayTransferError(f"{label}文件不存在,请检查对应 .env 绝对路径") raise AlipayTransferError(f"{label}文件不存在,请检查对应 .env 绝对路径")
content = Path(path_value).read_bytes() content = Path(path_value).read_bytes()
blocks = re.findall(rb"-----BEGIN CERTIFICATE-----.*?-----END CERTIFICATE-----", content, re.DOTALL) blocks = re.findall(rb"-----BEGIN CERTIFICATE-----.*?-----END CERTIFICATE-----", content, re.DOTALL)
certificates = []
parse_errors = []
for block in blocks:
try: try:
return [x509.load_pem_x509_certificate(block) for block in blocks] certificates.append(x509.load_pem_x509_certificate(block))
except Exception as exc: except (TypeError, ValueError) as exc:
raise AlipayTransferError(f"{label}格式无效,应为 PEM 编码的 X.509 证书集合") from exc # Alipay's root bundle contains RSA, SM2 and ECC certificates.
# Some cryptography/OpenSSL builds cannot decode the SM2
# certificate even though the RSA certificates needed for RSA2
# are valid. Parse each PEM independently so one unsupported
# non-RSA certificate does not prevent the service from starting.
parse_errors.append(exc)
if not certificates:
cause = parse_errors[0] if parse_errors else None
raise AlipayTransferError(
f"{label}格式无效,应为包含有效 RSA 证书的 PEM X.509 证书集合"
) from cause
return certificates
def _certificate_serial(certificate) -> str: def _certificate_serial(certificate) -> str:

View File

@ -149,3 +149,23 @@ def test_root_certificate_serial_ignores_non_rsa_certificates():
expected = md5(b"CN=Alipay,O=Example,C=CN41259").hexdigest() expected = md5(b"CN=Alipay,O=Example,C=CN41259").hexdigest()
assert alipay_provider._root_certificate_serial([sm2, rsa, ecc]) == expected assert alipay_provider._root_certificate_serial([sm2, rsa, ecc]) == expected
def test_certificate_bundle_keeps_valid_certificates_when_one_block_is_unsupported(monkeypatch, tmp_path):
bundle = tmp_path / "alipayRootCert.crt"
bundle.write_bytes(
b"-----BEGIN CERTIFICATE-----\nBAD\n-----END CERTIFICATE-----\n"
b"-----BEGIN CERTIFICATE-----\nGOOD\n-----END CERTIFICATE-----\n"
)
valid_certificate = object()
class FakeX509:
@staticmethod
def load_pem_x509_certificate(block):
if b"BAD" in block:
raise ValueError("unsupported SM2 certificate")
return valid_certificate
monkeypatch.setitem(__import__("sys").modules, "cryptography.x509", FakeX509)
assert alipay_provider._load_certificate_bundle(str(bundle), "支付宝根证书") == [valid_certificate]