我找到了解决方案。由于PHP无法处理某些Unicode格式,这就是它的原因 base64_encode() 函数不返回有效的base64字符串。 有效的base64编码字符串以。结尾 = 要么 == 。
base64_encode()
=
==
因此,您可能必须使用自己的编码器功能,将Unicode转换为UTF-8 PHP用户已经提交了各种功能。其中一个功能来自 这一页 为我做了诀窍。
获得有效的UTF-8使用后 base64_encode 函数,您将获得正确的BinarySecurityToken。
base64_encode
我使用以下代码将其转换为有效的utf-8格式。
function Utf8FromWin($str,$type="w") { static $conv=''; if (!is_array($conv)) { $conv = array(); for($x=128;$x<=143;$x++) { $conv['u'][]=chr(208).chr($x); //changed 209 to 208 $conv['w'][]=chr($x+112); } for($x=144;$x<=191;$x++) { $conv['u'][]=chr(208).chr($x); $conv['w'][]=chr($x+48); } $conv['u'][]=chr(208).chr(129); // 衼 $conv['w'][]=chr(168); $conv['u'][]=chr(209).chr(145); // 褢 $conv['w'][]=chr(184); $conv['u'][]=chr(208).chr(135); // 袊 $conv['w'][]=chr(175); $conv['u'][]=chr(208).chr(151); // 褩 changed 209 to 208 $conv['w'][]=chr(191); $conv['u'][]=chr(208).chr(134); // 袉 $conv['w'][]=chr(178); $conv['u'][]=chr(208).chr(150); // 褨 changed 209 to 208 $conv['w'][]=chr(179); $conv['u'][]=chr(210).chr(144); // 覑 $conv['w'][]=chr(165); $conv['u'][]=chr(210).chr(145); // 覒 $conv['w'][]=chr(180); $conv['u'][]=chr(208).chr(132); // 袆 $conv['w'][]=chr(170); $conv['u'][]=chr(208).chr(148); // 褦 changed 209 to 208 $conv['w'][]=chr(186); $conv['u'][]=chr(226).chr(132).chr(150); // 鈩朶n $conv['w'][]=chr(185); } if ($type == 'w') { return str_replace($conv['u'],$conv['w'],$str); } elseif ($type == 'u') { return str_replace($conv['w'], $conv['u'],$str); } else { return $str; } }
您可以使用
$certificateContent = file_get_contents($certificateCAcer); $certificatePemContent = '-----BEGIN CERTIFICATE-----'.PHP_EOL .chunk_split(base64_encode($certificateCAcerContent), 64, PHP_EOL) .'-----END CERTIFICATE-----'.PHP_EOL;
转换base64编码结构中的二进制证书。