通过启用 SSL 的 iPlanet(Netscape Enterprise 或 Sun ONE)Web 服务器获取客户端证书数据的简短 HOWTO。
每当客户端使用证书进行身份验证时,iPlanet 服务器都会设置 $_SERVER["CLIENT_CERT"]。此变量包含客户端提供的证书的编码表示形式。这本身对脚本或应用程序无用,我们需要从编码中提取实际信息。事实证明,我们很幸运,编码几乎是标准的 PEM 编码,可以使用 openssl_x509_read() 函数读取。标准 PEM 具有开始行、结束行,中间是证书 DER 表示的 base64 编码。PEM 要求每 64 个字符都存在换行符,但是我们的 CLIENT_CERT 变量已经如此。由于某种原因,iPlanet 服务器忽略了附加开始和结束标题,要访问证书,只需替换这些标题即可。这是一个执行此操作并打印原始证书数据的简短代码片段。
<?php
$beginpem = "-----BEGIN CERTIFICATE-----\n";
$endpem = "-----END CERTIFICATE-----\n";
function print_element($item, $key)
{
if( is_array( $item ) )
{
echo "$key 是数组:\n";
array_walk( $item, 'print_element' );
echo "$key 完成\n";
}
else
echo "$key = $item\n";
}
$pemdata = $beginpem.$_SERVER["CLIENT_CERT"]."\n".$endpem;
$cert = openssl_x509_read( $pemdata );
$cert_data = openssl_x509_parse( $cert );
array_walk( $cert_data, 'print_element' );
openssl_x509_free( $cert );
?>