2024 PHP Conference Japan

openssl_x509_checkpurpose

(PHP 4 >= 4.0.6, PHP 5, PHP 7, PHP 8)

openssl_x509_checkpurpose驗證憑證是否可用於特定用途

說明

openssl_x509_checkpurpose(
    OpenSSLCertificate|字串 $certificate,
    整數 $purpose,
    陣列 $ca_info = [],
    ?字串 $untrusted_certificates_file = null
): 布林值|整數

openssl_x509_checkpurpose() 函式會檢查憑證,確認其是否可用於指定的 purpose(用途)。

參數

certificate (憑證)

要檢查的憑證。

purpose (用途)

openssl_x509_checkpurpose() 的用途
常數 說明
X509_PURPOSE_SSL_CLIENT 此憑證是否可以用於 SSL 連線的客戶端?
X509_PURPOSE_SSL_SERVER 此憑證是否可以用於 SSL 連線的伺服器端?
X509_PURPOSE_NS_SSL_SERVER 此憑證是否可以用於 Netscape SSL 伺服器?
X509_PURPOSE_SMIME_SIGN 此憑證是否可以用於簽署 S/MIME 電子郵件?
X509_PURPOSE_SMIME_ENCRYPT 此憑證是否可以用於加密 S/MIME 電子郵件?
X509_PURPOSE_CRL_SIGN 此憑證是否可以用於簽署憑證撤銷清單 (CRL)?
X509_PURPOSE_ANY 此憑證是否可以用於任何/所有用途?
這些選項並非位元欄位 - 您只能指定其中一個!

ca_info (CA 資訊)

ca_info 應該是一個受信任的 CA 檔案/目錄陣列,如 憑證驗證 中所述。

untrusted_certificates_file (不受信任的憑證檔案)

如果指定,這應該是 PEM 編碼檔案的名稱,其中包含可用於協助驗證憑證的憑證,但來自該檔案的憑證不受信任。

返回值

如果憑證可用於預期用途,則返回 true;如果不可用,則返回 false;如果發生錯誤,則返回 -1。

更新日誌

版本 說明
8.0.0 certificate 現在接受 OpenSSLCertificate 實例;先前接受類型為 OpenSSL X.509資源
8.0.0 untrusted_certificates_file 現在可以為 null。
新增註釋

使用者貢獻的註釋 2 則註釋

dingyuan at tencent dot com
4 年前
簡而言之:如果您設定 $purpose=0,您可以使用此函式來驗證憑證鏈。

====================================================================

我想驗證一個憑證鏈,就像這樣
userCert.pem => middleCert.pem => rootCert.pem

我發現這些 openssl 函式都沒有直接提供這個功能。而有些朋友也跟我有同樣的需求,「mikey at badpenguins dot com」甚至自己寫程式碼來驗證憑證鏈(您可以在 openssl_verify 下方的註釋中看到)。

我注意到 openssl_verify 下方有一個被點了「-3 個讚」的註釋,它說「在 php 中驗證 X509 憑證鏈似乎可以使用 openssl_x509_checkpurpose() 來完成」,我閱讀了關於這個函式的原始碼,給定的 $purpose 常數變數(例如 X509_PURPOSE_SSL_CLIENT)是 1-7,如果您將 $purpose 設定在 1-7 之間,您就無法驗證憑證鏈。設定 $purpose=0 可以得到驗證憑證鏈的真實結果。

我給那個「-3 個讚」的註釋點了個讚,現在是 -2 個讚了,哈哈。
adr at NOSPAM dot entropymatrix dot com
11 年前
以下是如何使用 openssl_x509_checkpurpose 的範例。它等同於以下 openssl verify 命令
openssl verify -CApath $openssl_cadir -purpose sslserver $openssl_crtfile

<?php
$openssl_crtfile
='auth.combined.pem';
$openssl_cadir='./ca';

$x509_res = openssl_x509_read(file_get_contents($openssl_crtfile));
if(empty(
$x509_res)) {
echo
'無法讀取 x509 憑證'."\n";
}
$valid = openssl_x509_checkpurpose($x509_res,X509_PURPOSE_SSL_SERVER,array($openssl_cadir));
if (
$valid === true) {
echo
'憑證可作為 SSL 伺服器使用'."\n";
} else {
echo
'憑證驗證返回'.$valid."\n";
}
?>
To Top