2024 年 PHP 日本會議

openssl_csr_sign

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

openssl_csr_sign使用另一個憑證(或自身)簽署 CSR 並產生憑證

說明

openssl_csr_sign(
    OpenSSLCertificateSigningRequest|字串 $csr,
    OpenSSLCertificate|字串|null $ca_certificate,
    #[\SensitiveParameter] OpenSSLAsymmetricKey|OpenSSLCertificate|陣列|字串 $private_key,
    整數 $days,
    ?陣列 $options = null,
    整數 $serial = 0,
    ?字串 $serial_hex = null
): OpenSSLCertificate|false

openssl_csr_sign() 會從給定的 CSR 產生 x509 憑證。

注意 您需要安裝有效的 openssl.cnf 才能使此函式正常運作。有關更多資訊,請參閱安裝章節下的注意事項。

參數

csr

先前由 openssl_csr_new() 產生的 CSR。當指定為 file://path/to/csr 時,它也可以是 PEM 編碼 CSR 的路徑,或是由 openssl_csr_export() 產生的匯出字串。

ca_certificate

產生的憑證將由 ca_certificate 簽署。如果 ca_certificatenull,則產生的憑證將會是自簽憑證。

private_key

private_key 是對應於 ca_certificate 的私鑰。

days

days 指定產生的憑證的有效期限,以天為單位。

options

您可以透過 options 微調 CSR 簽署。有關 options 的更多資訊,請參閱 openssl_csr_new()

serial

已發行憑證的序號(選用)。如果未指定,則預設為 0。

傳回值

成功時傳回 OpenSSLCertificate,失敗時傳回 false

更新日誌

版本 說明
8.0.0 成功時,此函式現在會傳回 OpenSSLCertificate 實例;先前傳回的是類型為 OpenSSL X.509資源
8.0.0 csr 參數現在接受 OpenSSLCertificateSigningRequest 實例;先前接受類型為 OpenSSL X.509 CSR資源
8.0.0 ca_certificate 參數現在接受 OpenSSLCertificate 實例;先前接受類型為 OpenSSL X.509資源
8.0.0 private_key 參數現在接受 OpenSSLAsymmetricKeyOpenSSLCertificate 實例;先前接受類型為 OpenSSL keyOpenSSL X.509資源

範例

範例 #1 openssl_csr_sign() 範例 - 簽署 CSR(如何實作您自己的憑證授權單位)

<?php
// 假設此腳本設定為接收從另一個頁面貼到文字區域的 CSR
$csrdata = $_POST["CSR"];

// 我們將使用我們自己的「憑證授權單位」憑證來簽署請求。
// 您可以使用任何憑證來簽署另一個憑證,但除非簽署憑證受到
// 處理新簽署憑證的軟體/用戶的信任,否則此過程毫無價值。

// 我們需要我們的 CA 憑證及其私鑰
$cacert = "file://path/to/ca.crt";
$privkey = array("file://path/to/ca.key", "your_ca_key_passphrase");

$usercert = openssl_csr_sign($csrdata, $cacert, $privkey, 365, array('digest_alg'=>'sha256') );

// 現在顯示產生的憑證,以便用戶可以複製並貼到他們的本地設定中(例如存放其 SSL 伺服器憑證的檔案)
openssl_x509_export($usercert, $certout);
echo
$certout;

// 顯示此處發生的任何錯誤
while (($e = openssl_error_string()) !== false) {
echo
$e . "\n";
}
?>

新增註記

使用者貢獻的註記 4 則註記

thomas dot lussnig at bewegungsmelder dot de
22 年前
以下是如何建立有效的 X.509 公開和私鑰 (cert/key) 的範例。
當不使用自簽章時,4.2.1 版會發生區段錯誤。您至少需要 openssl 的 CVS 程式碼。

<?
Header("Content-Type: text/plain");
$CA_CERT = "CA.cert.pem";
$CA_KEY = "CA.key.pem";
$req_key = openssl_pkey_new();
if(openssl_pkey_export ($req_key, $out_key)) {
$dn = array(
"countryName" => "DE",
"stateOrProvinceName" => "Frankfurt",
"organizationName" => "smcc.net",
"organizationalUnitName" => "E-Mail",
"commonName" => "Testcert"
);
$req_csr = openssl_csr_new ($dn, $req_key);
$req_cert = openssl_csr_sign($req_csr, "file://$CA_CERT", "file://$CA_KEY", 365);
if(openssl_x509_export ($req_cert, $out_cert)) {
echo "$out_key\n";
echo "$out_cert\n";
}
} else echo "憑證建立失敗\n";
}
} else echo "金鑰建立失敗\n";
?>
eric at ypass dot net
22 年前
要產生自簽章憑證,請將 NULL 作為簽章憑證(第二個參數)傳遞。例如:

$req_key = openssl_pkey_new();
$dn = array(
"countryName" => "US",
"stateOrProvinceName" => "Colorado",
"organizationName" => "yPass.net",
"organizationalUnitName" => "yPass.net",
"commonName" => "yPass.net Root Certificate"
);
$req_csr = openssl_csr_new($dn, $req_key);
$req_cert = openssl_csr_sign($req_csr, NULL, $req_key, 365);
Sriraam
9 年前
config_section_section 是不正確的。要使用的正確關鍵字是 "config_section_name"。
Kai Sellgren
15 年前
您可以使用 file_get_contents() 直接傳遞內容,而不是提供檔案路徑。

此外,如果您收到錯誤訊息「sec_error_reused_issuer_and_serial」,請在最後一個參數中加入序號

<?php

$privkey
= array(file_get_contents('ca.key'),"your_ca_key_passphrase");
$usercert = openssl_csr_sign($csrdata, file_get_contents('ca.crt'),$privkey,365,NULL,'06');
openssl_x509_export($usercert,$certout);
file_put_contents('serverCASigned.crt',$certout);

?>

在上面的例子中,序號是 "06"。
To Top