通过启用 SSL 的 iPlanet(Netscape Enterprise 或 Sun ONE)Web 服务器获取客户端证书中数据的简要操作指南。
每当客户端使用证书进行身份验证时,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 is Array:\n";
array_walk( $item, 'print_element' );
echo "$key done\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 );
?>