用PHP解析PKCS7中的PKCS10

时间:2013-12-20 13:14:51

标签: php windows-phone-8 mdm phpseclib pkcs#7

背景:我正在为WP8实现MDM解决方案,在初始注册时,二进制安全令牌是基于64位编码的PKCS10 CSR。在证书续订时,soap请求完全相同,只有指定的令牌类型是“Renew”,二进制安全令牌是基本64位编码的PKCS7。

我正在尝试从PKCS7 base64编码的字符串中获取PKCS10 - 我尝试过openssl_pkcs7_verify,其中包含内容的文件名。我假设写的内容包含CSR。但是,我无法使这个功能成功并最终使用以下工作 -

private function parsePKCS10( $insb64PKCS7 ) {
    $decodedPKCS7 = base64_decode( $insb64PKCS7 );

    $buffer = "";
    $b64PKCS10 = "";
    $lengthPKCS7 = strlen( $decodedPKCS7 );
    for ( $i = 0; $i < $lengthPKCS7; ++$i ) {
        $currentChar = $decodedPKCS7[ $i ];
        if ( mb_detect_encoding( $currentChar ) == "ASCII" && strlen( $currentChar ) != 0 ) {
            $buffer .= $currentChar;
        } else if ( (strlen( $currentChar ) != 0) || ($i + 1 < $lengthPKCS7 && strlen( $decodedPKCS7[ $i + 1 ] ) == 0) ) {
            if ( strlen( $buffer ) > strlen( $b64PKCS10 ) ) {
                $b64PKCS10 = $buffer;
            }
            $buffer = "";
        }
    }

    return preg_replace( '/[\x00-\x1F\x80-\xFF]/', '', $b64PKCS10 ); //remove non-printable chars
}

我在网上找到了一个在C#中执行此操作的示例 -

private static string extractPKCS10(string PKCS7blob)
        {
            SignedCms cms = new SignedCms();
            cms.Decode(System.Convert.FromBase64String(PKCS7blob));
            byte[] csr = cms.ContentInfo.Content;

            return Encoding.Unicode.GetString(csr);
        }

有没有人知道在PHP中使用这种方法的更好方法,还是应该坚持使用当前的功能来完成这项工作?

由于

编辑 -

我使用PHPSecLib找到了更好的解决方案 -

$asn1 = new File_ASN1();
$certDump = $asn1->decodeBER( base64_decode( $cert ) );
$csr = extractPKCS10( $certDump );
print( $csr );


function extractPKCS10( $pkcs7, $parent = null ){

    $pkcs7DataOID = '1.2.840.113549.1.7.1';

    foreach( $pkcs7 as $key => $value ){
        if( $key == 'content' && $value == $pkcs7DataOID ){
            $csrBlob = $parent[1]['content'][0]['content'];
            return base64_encode( $csrBlob );
        }

        if( is_array( $value ) ){
            $pkcs10 = extractPKCS10( $value, $pkcs7 );
            if( null !== $pkcs10 ){
                return $pkcs10;
            }
        }
    }

    return null;
}

0 个答案:

没有答案