PHP Conference Nagoya 2025

openssl_csr_sign

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

openssl_csr_signFirmar una CSR con otro certificado (o autofirmar) y generar un certificado

Descripción

openssl_csr_sign(
    mixed $csr,
    mixed $cacert,
    mixed $priv_key,
    int $days,
    array $configargs = ?,
    int $serial = 0
): resource

openssl_csr_sign() genera un recurso de certificado x509 desde la CSR dada.

Nota: Necesita tener instalado un openssl.cnf válido para que esta función opere correctamente. Vea las notas sobre la sección de instalación para más información.

Parámetros

csr

Una CSR previamente generada por openssl_csr_new(). También puede ser la ruta de una CSR codificada con PEM cuando se especifica con file://ruta/a/csr o una cadena exportada generada por openssl_csr_export().

cacert

El certificado generado será firmado por cacert. Si cacert es null, el certificado generado será un certificado autofirmado.

priv_key

priv_key es la clave privada que se corresponde con cacert.

days

days especifica la duración durante la cuál el certificado generado será válido, en días.

configargs

Se puede ajustar la firma de la CSR mediante configargs. Véase openssl_csr_new() para más información acerca de configargs.

serial

El número de serie opcional del certificado emitido. Si no se especifica será 0 por defecto.

Valores devueltos

Devuelve un recurso de certificado x509 si se tuvo éxito, false si falló.

Ejemplos

Ejemplo #1 Ejemplo de openssl_csr_sign() - firmar una CSR (cómo implementar su propia AC)

<?php
// Asumimos que este script está establecido para recivir una CSR que ha
// sido pegada al área de texto desde otra página
$csrdata = $_POST["CSR"];

// Firmaremos la petición usando nuestro propio certificado de "autoridad
// certificadora". También puede usar cualquier certificado para firmar otro, pero
// el proceso no vale de nada a menos que el certificado de firma sea acreditado
// por el software/usuarios que tratarán con el certificado recién firmado

// Necesitamos nuestro certificado de AC y su clave privada
$cacert = "file://ruta/a/ca.crt";
$privkey = array("file://ruta/a/ca.key", "su_frase_de_contraseña");

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

// Ahora mostramos el certificado generado por lo que el ususario puede
// copiarlo y pegarlo a su configuración local (tal como un archivo
// para guardar el certificado para su servidor SSL)
openssl_x509_export($usercert, $certout);
echo
$certout;

// Mostrar cualquier error que ocurra
while (($e = openssl_error_string()) !== false) {
echo
$e . "\n";
}
?>

add a note

User Contributed Notes 4 notes

up
0
thomas dot lussnig at bewegungsmelder dot de
22 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
-1
eric at ypass dot net
22 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
Sriraam
9 years ago
config_section_section is incorrect. The correct keyword to use is "config_section_name".
up
-5
Kai Sellgren
15 years ago
You can use file_get_contents() to directly pass the content instead of giving file paths.

Also, if you get an error "sec_error_reused_issuer_and_serial", put a serial into the last parameter:

<?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);

?>

In that above example the serial was "06".
To Top