PHP 8.4.1 Released!

openssl_csr_sign

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

openssl_csr_signAssina um CSR com outro certificado (ou ele mesmo) e gera um certificado

Descrição

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() gera um certificado x509 a partir do CSR fornecido.

Nota: É preciso ter um arquivo openssl.cnf válido instalado para que esta função funcione corretamente. Consulte as notas na seção de instalação para obter mais informações.

Parâmetros

csr

Um CSR gerado anteriormente por openssl_csr_new(). Também pode ser o caminho para um CSR codificado em PEM quando especificado como file://caminho/para/csr ou uma string exportada gerada por openssl_csr_export().

ca_certificate

O certificado gerado será assinado por ca_certificate. Se ca_certificate for null, o certificado gerado será um certificado autoassinado.

private_key

private_key é a chave privada que corresponde a ca_certificate.

days

days especifica o período de validade do certificado gerado, em dias.

options

A assinatura do CSR pode ter um ajuste fino usando options. Consulte openssl_csr_new() para mais informação sobre options.

serial

Um número de série opcional do certificado emitido. Se não for especificado, o padrão será 0.

Valor Retornado

Retorna um OpenSSLCertificate em caso de sucesso, false em caso de falha.

Registro de Alterações

Versão Descrição
8.0.0 Em caso de sucesso, esta função agora retorna uma instância de OpenSSLCertificate; anteriormente, retornava um resource do tipo OpenSSL X.509.
8.0.0 csr aceita uma instância OpenSSLCertificateSigningRequest agora; anteriormente, um resource do tipo OpenSSL X.509 CSR era aceito.
8.0.0 ca_certificate agora aceita uma instância de OpenSSLCertificate; anteriormente, um resource do tipo OpenSSL X.509 era aceito.
8.0.0 private_key agora aceita uma instância de OpenSSLAsymmetricKey ou de OpenSSLCertificate; anteriormente, um resource do tipo OpenSSL key ou do tipo OpenSSL X.509 era aceito.

Exemplos

Exemplo #1 Exemplo de openssl_csr_sign() - assinando um CSR (como implementar sua própria CA)

<?php
// Vamos supor que este script esteja configurado para receber
// um CSR que foi colado em uma área de texto de outra página
$csrdata = $_POST["CSR"];

// Assinaremos a solicitação usando nosso próprio certificado de "autoridade
// de certificação". Pode ser usado qualquer certificado para assinar outro, mas
// o processo é inútil, a menos que o certificado de assinatura seja confiável
// para o software/usuários que lidarão com o certificado recém-assinado

// Precisamos do nosso certificado CA e de sua chave privada
$cacert = "file://caminho/para/ca.crt";
$privkey = array("file://caminho/para/ca.key", "sua_senha_da_chave_CA");

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

// Agora o certificado gerado é exibido para que o usuário possa
// copiá-lo e colá-lo em sua configuração local (como um arquivo
// para armazenar o certificado para o servidor SSL)
openssl_x509_export($usercert, $certout);
echo
$certout;

// Mostra todos os erros que ocorreram aqui
while (($e = openssl_error_string()) !== false) {
echo
$e . "\n";
}
?>

adicione uma nota

Notas Enviadas por Usuários (em inglês) 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
0
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
-1
Sriraam
9 years ago
config_section_section is incorrect. The correct keyword to use is "config_section_name".
up
-4
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