透過啟用 SSL 的 iPlanet(Netscape Enterprise 或 Sun ONE)網路伺服器從用戶端憑證中取得資料的簡短教學。
當用戶端使用憑證進行驗證時,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 );
?>