>source

애플 페이로드를 사용 가능한 카드 세부 정보로 처리하기 위해 파이썬 라이브러리에서 작업하고 있습니다. 그렇게 하려면 공식 문서를 따릅니다.

2가지 확인 단계를 제외하고 모든 것이 완벽하게 작동합니다.

단계 1.c.

서명에서 루트 CA까지 유효한 X.509 신뢰 체인이 있는지 확인하십시오. 특히 서명이 리프 인증서에 해당하는 개인 키를 사용하여 생성되었는지, 리프 인증서가 중간 CA에서 서명되었는지, 중간 CA가 Apple 루트 CA(G3)에서 서명되었는지 확인하십시오.

암호화 라이브러리를 사용하여 다음 code로 2번의 마지막 검사를 완료했습니다.

from cryptography import x509
from cryptography.hazmat.primitives import hashes
from cryptography.hazmat.primitives.asymmetric.ec import ECDSA
def verify_root_ca_chain_of_trust(
    trusted_root_ca: x509.Certificate,
    intermediate_cert: x509.Certificate,
    leaf_cert: x509.Certificate
) -> None:
    try:
        # verify that the intermediate CA is signed by the Apple Root CA -G3
        trusted_pub= trusted_root_ca.public_key()
        trusted_pub.verify(
            intermediate_cert.signature,
            intermediate_cert.tbs_certificate_bytes,
            ECDSA(hashes.SHA256())
        )
        # verify that the leaf certificate is signed by the intermediate CA
        trusted_intermediate_pub= intermediate_cert.public_key()
        trusted_intermediate_pub.verify(
            leaf_cert.signature,
            leaf_cert.tbs_certificate_bytes,
            ECDSA(hashes.SHA256())
        )
    except TypeError as err:
        raise CustomError('error') from err

여기서 내 문제는 필요한 검사의 2/3만 구현한다는 것입니다. 내가 어떻게해야할지 알 수없는 것은 다음과 같습니다.

특히, 서명이 리프 인증서에 해당하는 개인 키를 사용하여 생성되었는지 확인하십시오.

단계 1.d. 및 1.e.

d. ECC(EC_v1)의 경우 서명이 ephemeralPublicKey, data, transactionId 및 applicationData 키의 연결된 값에 대한 유효한 ECDSA 서명(ecdsa-with-SHA256 1.2.840.10045.4.3.2)인지 확인합니다.

마. RFC 5652의 섹션 11.3에 정의된 대로 서명의 CMS 서명 시간을 검사합니다. 시간 서명과 트랜잭션 시간이 몇 분 이상 차이가 나는 경우 토큰이 재생 공격일 수 있습니다.

지금까지 시도한 것:

def validate_token_signature(
    trusted_cert: x509.Certificate,
    signature: str,
    payment_data: str,
    ephemeral_pub: str,
    transaction_id: str,
    application_data: str= None,
) -> None:
    data_byte: bytes= base64.b64decode(ephemeral_pub)
    payment_data_byte: bytes= base64.b64decode(payment_data)
    transaction_id_byte: bytes= bytes.fromhex(transaction_id)
    data: bytes= data_byte + payment_data_byte + transaction_id_byte
    if application_data is not None:
        application_data_byte: bytes= base64.b64decode(application_data)
        data= data + application_data_byte
    try:
        trusted_leaf_pub= trusted_cert.public_key()
        trusted_leaf_pub.verify(base64.b64decode(signature), data, ECDSA(hashes.SHA256()))
    except InvalidSignature as err:
        print(err)
        # raise SignatureError('error') from err```

여기서 검증할 서명을 지정하지 않았습니다. PKCS#7이라고 가정하지만 암호화는 다음과 같이 x509 인증서 목록으로 pkcs#7만 처리합니다.

PEM으로 인코딩된 PKCS7 blob을 인증서 목록으로 역직렬화합니다. PKCS7은 CRL을 포함하여 다른 많은 유형의 데이터를 포함할 수 있지만 이 기능은 인증서를 제외한 모든 것을 무시합니다.

파이썬 암호화로 이러한 검사를 수행하는 방법이 있습니까? 아니면 pyopenssl이나 다른 것과 같은 다른 라이브러리를 사용해야 합니까?

불행히도 PKCS#7 /CMS 지원은 Python에서 매우 드문 것처럼 보입니다. pycryptodome은 (아직) 지원하지 않습니다. 그래도 수정해서 다행입니다. 예를 들어 그 동안 당신을 위해이 작업? CMS 검증을 (재)구현하고 싶지 않을 것입니다.

Maarten Bodewes2022-01-15 17:06:13

약간 더 어려운 옵션은 소스 code를 살펴보고 이미 가지고 있는 시스템을 기반으로 물론 직접 구현할 수 있는지 확인하는 것입니다. 서명 시간이 엄격하게 RFC의 "기타" 범주에 있기 때문에 먼저 추가 세부 정보를 요청하는 옵션을 살펴보겠습니다.

Maarten Bodewes2022-01-15 17:06:13
  • 이전 css : 내 Shopify 스토어 바닥글이 내 웹사이트 중앙에 정렬되지 않습니다.
  • 다음 typescript : getServerSideProps NextJS에서 초기화하기 전에 변수에 액세스할 수 없습니다.