openssl_csr_new

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

openssl_csr_newGenera una CSR

Descripción

openssl_csr_new(
    array $distinguished_names,
    #[\SensitiveParameter] ?OpenSSLAsymmetricKey &$private_key,
    ?array $options = null,
    ?array $extra_attributes = null
): OpenSSLCertificateSigningRequest|bool

openssl_csr_new() genera una nueva CSR (requisición de firma de certificado), basada en la información proporcionada por distinguished_names.

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

distinguished_names

El nombre distintivo (Distinguished Name) o los campos del sujeto a incluir en el certificado. El distinguished_names es un array asociativo cuyas claves representan los nombres de atributos de los Distinguished Names, y los valores pueden ser cadenas (para un valor único) o arrays (si se deben definir varios valores).

private_key

private_key debe ser una clave privada que haya sido generada por openssl_pkey_new() (u obtenida de otro modo mediante alguna de las funciones de la familia openssl_pkey), o la variable null. Si su valor es una variable null, se genera una nueva clave privada según las options proporcionadas y se asigna a la variable suministrada. La parte pública correspondiente de la clave se utilizará para firmar la CSR.

options

Por omisión, se utiliza el archivo openssl.conf del sistema para inicializar la requisición; puede especificarse una sección del archivo de configuración configurando la clave config_section_section en options. También puede especificarse un archivo de configuración alternativo de OpenSSL configurando el valor de config con la ruta del archivo a utilizar. Si las claves siguientes están presentes en options, se comportan como sus equivalentes en openssl.conf, según la lista siguiente.

Sobrescribir configuración
options tipo Equivalente de openssl.conf descripción
digest_alg string default_md Método de digest o firma de hash, generalmente uno de openssl_get_md_methods()
x509_extensions string x509_extensions Selecciona qué extensión utilizar al crear un certificado x509
req_extensions string req_extensions Selecciona qué extensión utilizar al crear una CSR
private_key_bits int default_bits Especifica la longitud en bits de la clave privada
private_key_type int none Especifica el tipo de clave privada a crear. Puede ser uno de OPENSSL_KEYTYPE_DSA, OPENSSL_KEYTYPE_DH, OPENSSL_KEYTYPE_RSA o OPENSSL_KEYTYPE_EC. El valor por omisión es OPENSSL_KEYTYPE_RSA.
encrypt_key bool encrypt_key ¿Debe estar cifrada la clave (con contraseña) exportada?
encrypt_key_cipher int none Una de las constantes cipher.
curve_name string none Uno de openssl_get_curve_names().
config string N/A Ruta hacia su archivo openssl.conf alternativo.

extra_attributes

extra_attributes se utiliza para especificar atributos adicionales para la CSR. Se trata de un array asociativo cuyas claves se convierten en OID y se aplican como atributos de CSR.

Valores devueltos

Devuelve la CSR en caso de éxito, true si la creación de la CSR tiene éxito pero falla la firma o false en caso de error.

Historial de cambios

Versión Descripción
8.4.0 El array asociativo distinguished_names ahora admite arrays como valores, permitiendo especificar varios valores para un mismo atributo.
8.4.0 El parámetro extra_attributes ahora define correctamente los atributos del CSR, en lugar de modificar el nombre distintivo del sujeto como hacía anteriormente de forma incorrecta.
8.0.0 csr ahora acepta una instancia de OpenSSLCertificateSigningRequest ; anteriormente, se aceptaba un recurso de tipo OpenSSL X.509 CSR.
8.0.0 En caso de éxito, esta función ahora devuelve una instancia de OpenSSLAsymmetricKey ; anteriormente se devolvía una recurso de tipo OpenSSL key.
7.1.0 options ahora admite curve_name.

Ejemplos

Ejemplo #1 Creación de un certificado autosignado

<?php
// para certificados SSL de servidor, el commonName es el nombre de dominio a proteger
// para certificados de correo electrónico S/MIME el commonName es el propietario de la dirección de correo
// los campos de ubicación e identificación hacen referencia al propietario del dominio o al objeto del correo a proteger
$dn = array(
"countryName" => "GB",
"stateOrProvinceName" => "Somerset",
"localityName" => "Glastonbury",
"organizationName" => "The Brain Room Limited",
"organizationalUnitName" => "PHP Documentation Team",
"commonName" => "Wez Furlong",
"emailAddress" => "wez@example.com"
);

// Genera un nuevo par de claves privada (y pública)
$privkey = openssl_pkey_new(array(
"private_key_bits" => 2048,
"private_key_type" => OPENSSL_KEYTYPE_RSA,
));

// Genera una requisición de firma de certificado
$csr = openssl_csr_new($dn, $privkey, array('digest_alg' => 'sha256'));

// Genera un certificado autosignado, válido durante 365 días
$x509 = openssl_csr_sign($csr, null, $privkey, $days=365, array('digest_alg' => 'sha256'));

// Guarde su clave privada, CSR y certificado autosignado para uso posterior
openssl_csr_export($csr, $csrout) and var_dump($csrout);
openssl_x509_export($x509, $certout) and var_dump($certout);
openssl_pkey_export($privkey, $pkeyout, "mypassword") and var_dump($pkeyout);

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

Ejemplo #2 Crear un certificado ECC autosignado (a partir de PHP 7.1.0)

<?php
$subject
= array(
"commonName" => "docs.php.net",
);

// Genera un nuevo par de claves privada (y pública)
$private_key = openssl_pkey_new(array(
"private_key_type" => OPENSSL_KEYTYPE_EC,
"curve_name" => 'prime256v1',
));

// Genera una requisición de firma de certificado
$csr = openssl_csr_new($subject, $private_key, array('digest_alg' => 'sha384'));

// Genera un certificado EC autosignado
$x509 = openssl_csr_sign($csr, null, $private_key, $days=365, array('digest_alg' => 'sha384'));
openssl_x509_export_to_file($x509, 'ecc-cert.pem');
openssl_pkey_export_to_file($private_key, 'ecc-private.key');
?>

Ver también

  • openssl_csr_sign() - Firma un CSR con otro certificado (o consigo mismo) y genera un certificado