背景:我正在为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;
}