PHP 8.5.0 Alpha 2 available for testing

openssl_csr_sign

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

openssl_csr_signFirma un CSR con otro certificado (o consigo mismo) y genera un certificado

Descripción

openssl_csr_sign(
    OpenSSLCertificateSigningRequest|string $csr,
    OpenSSLCertificate|string|null $ca_certificate,
    #[\SensitiveParameter] OpenSSLAsymmetricKey|OpenSSLCertificate|array|string $private_key,
    int $days,
    ?array $options = null,
    int $serial = 0,
    ?string $serial_hex = null
): OpenSSLCertificate|false

openssl_csr_sign() genera un certificado x509 desde el CSR proporcionado.

Nota: Debe existir un archivo openssl.cnf válido e instalado para que esta función opere correctamente. Ver las notas encontradas en la sección concerniente a la instalación para más información.

Parámetros

csr

Un CSR generado previamente por openssl_csr_new(). Sin embargo, esto también puede ser la ruta hacia un CSR codificado en formato PEM si se especifica con file://path/to/csr o una cadena exportada generada por openssl_csr_export().

ca_certificate

El certificado generado será firmado por el certificado ca_certificate. Si ca_certificate es null, el certificado generado será autosignado.

private_key

private_key es la clave privada que corresponde al certificado ca_certificate.

days

days especifica la duración para la cual el certificado es válido, en número de días.

options

Se pueden ajustar las opciones de firma CSR con options. Consulte la función openssl_csr_new() para obtener más información sobre options.

serial

Un número de serie opcional para el certificado emitido. Si no se especifica, tendrá un valor de 0.

serial_hex

Una cadena hexadecimal opcional que representa el número de serie del certificado emitido. Si se define, tiene prioridad sobre el valor del parámetro serial. Si no se especifica o se define como null, se utiliza el valor del parámetro serial en su lugar.

Valores devueltos

Devuelve una instancia de OpenSSLCertificate en caso de éxito, false en caso contrario.

Historial de cambios

Versión Descripción
8.4.0 Se ha añadido el parámetro serial_hex.
8.0.0 En caso de éxito, esta función devuelve ahora una instancia de OpenSSLCertificate ; anteriormente se devolvía un resource de tipo OpenSSL X.509.
8.0.0 csr ahora acepta una instancia de OpenSSLCertificateSigningRequest ; anteriormente se aceptaba un resource de tipo OpenSSL X.509 CSR.
8.0.0 ca_certificate ahora acepta una instancia de OpenSSLCertificate ; anteriormente se aceptaba un resource de tipo OpenSSL X.509.
8.0.0 ca_certificate ahora acepta una instancia de OpenSSLAsymmetricKey o OpenSSLCertificate ; anteriormente se aceptaba un resource de tipo OpenSSL key o OpenSSL X.509.

Ejemplos

Ejemplo #1 Ejemplo con openssl_csr_sign() - firmar una CSR (cómo ser su propia Autoridad de Certificación)

<?php
// Supongamos que este script está configurado para recibir CSR que han
// sido pegados en un campo textarea desde otra página
$csrdata = $_POST["CSR"];

// Vamos a firmar la solicitud con nuestro propio certificado, como
// "autoridad de certificación". Puede utilizarse cualquier certificado para firmar otro,
// pero el proceso es inútil a menos que el certificado de firma tenga la confianza de los usuarios
// que utilizarán el nuevo certificado firmado.

// Necesitamos nuestro certificado y la clave privada
$cacert = "file://path/to/ca.crt";
$privkey = array("file://path/to/ca.key", "la_clave_secreta_de_su_certificado");

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

// Mostramos ahora el certificado generado, de forma que el usuario
// pueda copiarlo/pegarlo en su configuración local (como un
// archivo que contiene los certificados de su servidor SSL)
openssl_x509_export($usercert, $certout);
echo
$certout;

// Muestra todos los errores ocurridos
while (($e = openssl_error_string()) !== false) {
echo
$e . "\n";
}
?>

add a note

User Contributed Notes 3 notes

up
-1
eric at ypass dot net
23 years ago
To generate a self-signed certificate, pass NULL as the signing certificate (2nd parameter). For example:

$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);
up
-2
thomas dot lussnig at bewegungsmelder dot de
23 years ago
Here is an sample how to create valid X.509 Public and Private Key (cert/key).
When not using self signed the 4.2.1 segault. You need the CVS code at least for openssl.

<?
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 "Failed Cert\n";
}
else echo "FailedKey\n";
?>
up
-2
Sriraam
9 years ago
config_section_section is incorrect. The correct keyword to use is "config_section_name".
To Top