【问题标题】:Decoding multiple DER certificates on iOS在 iOS 上解码多个 DER 证书
【发布时间】:2016-07-29 04:25:14
【问题描述】:

我有一个 CFDataRef,其中包含一个 DER 编码的 X.509 证书,我可以使用它来创建一个 SecCertificateRef,如下所示:

CFDataRef binaryDataRef = ... // from third party
SecCertificateRef certRef = SecCertificateCreateWithData (NULL, binaryDataRef);

但在某些情况下,我的 CFData 可以包含 多个 证书(证书链),这些证书已由第三方代码使用 i2d_X509 连接在一起。

iOS 上是否有类似于 SecCertificateCreateWithData 的调用可以解码所有证书? SecCertificateCreateWithData 只是给了我第一个证书。

【问题讨论】:

    标签: ios xcode certificate


    【解决方案1】:

    我想通了 - 我可以使用 d2i_X509 来确定每个证书的位置,并且它可以轻松地将指针调整到数组中的下一个。

    CFArrayRef nmCopyEncodedCertificates(CFDataRef derDataRef) {
        CFMutableArrayRef certs = CFArrayCreateMutable(kCFAllocatorDefault, 0, &kCFTypeArrayCallBacks);
    
        if (derDataRef) {        
            CFIndex bytesRemaining = CFDataGetLength(derDataRef);
            const unsigned char *pDerData = CFDataGetBytePtr(derDataRef);
            const unsigned char *pCurCertBegin = pDerData;
            X509 *certX509 = NULL;
    
            while ((certX509 = d2i_X509(NULL, &pDerData, bytesRemaining)) != NULL &&    // increments pDerData to next cert
                   bytesRemaining > 0) {
                X509_free(certX509);
                long len = pDerData - pCurCertBegin;
                if (len > 0) {
                    CFDataRef certData = CFDataCreate(kCFAllocatorDefault, pCurCertBegin, len);
                    if (certData) {
                        SecCertificateRef certRef = SecCertificateCreateWithData (kCFAllocatorDefault, certData);
                        if (certRef) {
                            CFArrayAppendValue(certs, certRef);
                            CFRelease(certRef);
                        }
                        CFRelease(certData);
                    }
                    bytesRemaining -= len;
                    pCurCertBegin = pDerData;
                } else {
                    break;
                }
            }
        }
        return certs;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-02-08
      • 2021-11-17
      • 2014-02-06
      • 2019-02-12
      • 2014-02-24
      • 1970-01-01
      相关资源
      最近更新 更多