PHP.mk документација

openssl_csr_new

Почист и полокален преглед на PHP референцата, со задржана структура од PHP.net и подобра читливост за примери, секции и белешки.

function.openssl-csr-new.php PHP.net прокси Преводот се освежува
Оригинал на PHP.net
Патека function.openssl-csr-new.php Локална патека за оваа страница.
Извор php.net/manual/en Оригиналниот HTML се реупотребува и локално се стилизира.
Режим Прокси + превод во позадина Кодовите, табелите и белешките остануваат читливи во истиот тек.
openssl_csr_new

Референца за `function.openssl-csr-new.php` со подобрена типографија и навигација.

function.openssl-csr-new.php

openssl_csr_new

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

openssl_csr_newГенерира CSR

= NULL

openssl_csr_new(
         array $distinguished_names,
         Иницијализира контекст за инкрементално хеширање ?OpenSSLAsymmetricKey &$private_key,
         ?array $options = null,
         ?array $extra_attributes = null
): OpenSSLCertificateSigningRequest|bool

openssl_csr_new() генерира нов CSR врз основа на информациите дадени од distinguished_names.

Забелешка: Треба да имате валиден openssl.cnf инсталиран за оваа функција да работи правилно. Погледнете ги белешките под делот за инсталација Користење на PHP од командната линија

Параметри

distinguished_names

Името на разликувањето или полињата на субјектот што треба да бидат вклучени во сертификатот. The distinguished_names е асоцијативен низ каде клучевите ги претставуваат имињата на атрибутите на Имињата на разликувањето, а вредностите можат да бидат низи (за единечна вредност) или низи (ако треба да се постават повеќе вредности).

private_key

private_key (или на друг начин добиен од другите функции од семејството openssl_pkey). Соодветниот јавен дел од клучот ќе се користи за потпишување на openssl_pkey_new() (или на друг начин добиени од другите функции од семејството openssl_pkey), или null променлива. Ако нејзината вредност е null променлива, нов приватен клуч се генерира врз основа на дадениот options и доделен на дадената променлива. Соодветниот јавен дел од клучот ќе се користи за потпишување на CSR.

options

Стандардно, информациите во вашиот систем openssl.conf се користи за иницијализирање на барањето; можете да наведете дел од конфигурациската датотека со поставување на config_section_section клуч во options. Можете исто така да наведете алтернативна OpenSSL конфигурациска датотека со поставување на вредноста на config клуч до патеката на датотеката што сакате да ја користите. Следниве клучеви, ако се присутни во options се однесуваат како нивните еквиваленти во openssl.conf, како што е наведено во табелата подолу.

Преклопувања на конфигурацијата
options key type openssl.conf equivalent description
digest_alg string default_md Digest method or signature hash, usually one of openssl_get_md_methods()
x509_extensions string x509_extensions Метод за дигест или хеш на потпис, обично еден од
req_extensions string req_extensions Избира кои екстензии треба да се користат при креирање на x509 сертификат CSR
private_key_bits int default_bits Избира кои екстензии треба да се користат при креирање на
private_key_type int none Специфицира колку битови треба да се користат за генерирање на приватен клуч OPENSSL_KEYTYPE_DSA, OPENSSL_KEYTYPE_DH, OPENSSL_KEYTYPE_RSA or OPENSSL_KEYTYPE_ECСпецифицира каков тип на приватен клуч да се креира. Ова може да биде еден од OPENSSL_KEYTYPE_RSA.
encrypt_key bool encrypt_key . Стандардната вредност е
encrypt_key_cipher int none Еден од Дали извезениот клуч (со лозинка) треба да биде шифриран?.
curve_name string none Еден од openssl_get_curve_names().
config string N/A константи за шифрирање
extra_attributes

extra_attributes Патека до вашата сопствена алтернативна openssl.conf датотека. CSRсе користи за специфицирање на дополнителни атрибути за CSR attributes.

Вратени вредности

Низа претстава на грешката CSR при успех, true if CSR . Тоа е асоцијативен низ каде клучевите се претвораат во OID и се применуваат како false при неуспех.

Дневник на промени

Верзија = NULL
8.4.0 На distinguished_names креирањето е успешно, но потпишувањето не успее или
8.4.0 На extra_attributes асоцијативниот низ сега поддржува низови како вредности, дозволувајќи да се специфицираат повеќе вредности за еден атрибут.
8.0.0 При успех, оваа функција враќа OpenSSLCertificateSigningRequest инстанца сега; претходно, а resource од тип OpenSSL X.509 CSR .
8.0.0 private_key прифаќа OpenSSLAsymmetricKey инстанца сега; претходно, а resource од тип OpenSSL key беше прифатено.
7.1.0 options параметарот сега правилно ги поставува CSR атрибутите, наместо да го менува Име на субјект на разликување како што претходно погрешно правеше. curve_name.

Примери

сега исто така поддржува

<?php
// for SSL server certificates the commonName is the domain name to be secured
// for S/MIME email certificates the commonName is the owner of the email address
// location and identification fields refer to the owner of domain or email subject to be secured
$dn = array(
"countryName" => "GB",
"stateOrProvinceName" => "Somerset",
"localityName" => "Glastonbury",
"organizationName" => "The Brain Room Limited",
"organizationalUnitName" => "PHP Documentation Team",
"commonName" => "Wez Furlong",
"emailAddress" => "[email protected]"
);

// Generate a new private (and public) key pair
$privkey = openssl_pkey_new(array(
"private_key_bits" => 2048,
"private_key_type" => OPENSSL_KEYTYPE_RSA,
));

// Generate a certificate signing request
$csr = openssl_csr_new($dn, $privkey, array('digest_alg' => 'sha256'));

// Generate a self-signed cert, valid for 365 days
$x509 = openssl_csr_sign($csr, null, $privkey, $days=365, array('digest_alg' => 'sha256'));

// Save your private key, CSR and self-signed cert for later use
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);

// Show any errors that occurred here
while (($e = openssl_error_string()) !== false) {
echo
$e . "\n";
}
?>

Пример #1 Креирање самопотпишан сертификат

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

// Generate a new private (and public) key pair
$private_key = openssl_pkey_new(array(
"private_key_type" => OPENSSL_KEYTYPE_EC,
"curve_name" => 'prime256v1',
));

// Generate a certificate signing request
$csr = openssl_csr_new($subject, $private_key, array('digest_alg' => 'sha384'));

// Generate self-signed EC cert
$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');
?>

Види Исто така

  • openssl_csr_sign() - Потпиши CSR со друг сертификат (или самиот себе) и генерирај сертификат

Белешки од корисници 11 белешки

The_Lost_One
пред 16 години
Not sure whether the "bug" (undocumented behavior) I encountered is common to other people, but this comment might save hours of painful debug:
If you can't generate a new private key using openssl_pkey_new() or openssl_csr_new(), your script hangs during the call of these functions and in case you specified a "private_key_bits" parameter, ensure that you cast the variable to an int. Took me ages to notice that.

<?php
$SSLcnf = array('config' => '/usr/local/nessy2/share/ssl/openssl.cnf',
        'encrypt_key' => true,
        'private_key_type' => OPENSSL_KEYTYPE_RSA,
        'digest_alg' => 'sha1',
        'x509_extensions' => 'v3_ca',
        'private_key_bits' => $someVariable // ---> bad
        'private_key_bits' => (int)$someVariable // ---> good
        'private_key_bits' => 512 // ---> obviously good
        );
?>
Пример #2 Креирање самопотпишан ECC сертификат (од PHP 7.1.0)
пред 10 години
When in doubt, read the source code to PHP!

$configargs is fairly opaque as to what is going on behind the scenes.  That is, until you actually look at php_openssl_parse_config() in '/ext/openssl/openssl.c':

    SET_OPTIONAL_STRING_ARG("digest_alg", req->digest_name,
        CONF_get_string(req->req_config, req->section_name, "default_md"));
    SET_OPTIONAL_STRING_ARG("x509_extensions", req->extensions_section,
        CONF_get_string(req->req_config, req->section_name, "x509_extensions"));
    SET_OPTIONAL_STRING_ARG("req_extensions", req->request_extensions_section,
        CONF_get_string(req->req_config, req->section_name, "req_extensions"));
    SET_OPTIONAL_LONG_ARG("private_key_bits", req->priv_key_bits,
        CONF_get_number(req->req_config, req->section_name, "default_bits"));

    SET_OPTIONAL_LONG_ARG("private_key_type", req->priv_key_type, OPENSSL_KEYTYPE_DEFAULT);

Here we can see that SET_OPTIONAL_STRING_ARG() is called for most inputs but for 'private_key_bits' SET_OPTIONAL_LONG_ARG() is called.  Both calls are C macros that expand to code that enforces the expected input type.  The generated code ignores the input without warning/notice if an unexpected type is used and just uses the default from the configuration file.  This is why using a string with 'private_key_bits' will result in unexpected behavior.

Further inspection of the earlier initialization in the same function:

    SET_OPTIONAL_STRING_ARG("config", req->config_filename, default_ssl_conf_filename);
    SET_OPTIONAL_STRING_ARG("config_section_name", req->section_name, "req");
    req->global_config = CONF_load(NULL, default_ssl_conf_filename, NULL);
    req->req_config = CONF_load(NULL, req->config_filename, NULL);

    if (req->req_config == NULL) {
        return FAILURE;
    }

And elsewhere in another function:

    /* default to 'openssl.cnf' if no environment variable is set */
    if (config_filename == NULL) {
        snprintf(default_ssl_conf_filename, sizeof(default_ssl_conf_filename), "%s/%s",
                X509_get_default_cert_area(),
                "openssl.cnf");
    } else {
        strlcpy(default_ssl_conf_filename, config_filename, sizeof(default_ssl_conf_filename));
    }

Reveals that 'config' in $configargs is an override for any default setting elsewhere.  This actually negates the comment in the documentation that says "Note: You need to have a valid openssl.cnf installed for this function to operate correctly. See the notes under the installation section for more information."  A more correct sentence would be "Note:  You need to either have a valid openssl.cnf set up or use $configargs to point at a valid openssl.cnf file for this function to operate correctly."

All of that goes to show that looking at the PHP source code is the only real way to figure out what is actually happening.  Doing so saves time and effort.
Анонимен
пред 11 години
For those of you using Debian-based systems, the openssl configuration file is at: /etc/ssl/openssl.cnf
james at kirk dot com
пред 17 години
To set the "basicConstraints" to  "critical,CA:TRUE", you have to define configargs, but in the openssl_csr_sign() function !

That's my example of code to sign a "child" certificate :

$CAcrt = "file://ca.crt";
$CAkey = array("file://ca.key", "myPassWord");

$clientKeys = openssl_pkey_new();
$dn = array(
    "countryName" => "FR",
    "stateOrProvinceName" => "Finistere",
    "localityName" => "Plouzane",
    "organizationName" => "Ecole Nationale d'Ingenieurs de Brest",
    "organizationalUnitName" => "Enib Students",
    "commonName" => "www.enib.fr",
    "emailAddress" => "[email protected]"
);
$csr = openssl_csr_new($dn, $clientPrivKey);

$configArgs = array("x509_extensions" => "v3_req");
$cert = openssl_csr_sign($csr, $CAcrt, $CAkey, 100, $configArgs);

openssl_x509_export_to_file($cert, "childCert.crt");

Then if you want to add some more options, you can edit the "/etc/ssl/openssl.cnf" ssl config' file (debian path), and add these after the [ v3_req ] tag.
main ATT jokester DOTT fr
пред 11 години
In the PHP example above it uses "UK" as the country name which is incorrect, the country name must be "GB"
tigger (AT) tiggerswelt d0t net
empiredesrtroyer12 at gmail dot com
When using `openssl_csr_new()` or `openssl_csr_sign()` for X25519 or Ed25519 certs, you have to set the `["digest_alg" => ""]` or if you use the `"config"` option to `null`, like so:

<?php
// Setting the "digest_alg" option:
$csr = openssl_csr_new(
    $distinguished_names,
    $private_key,
    ["digest_alg" => ""]
);

// Setting with "config":
$csr = openssl_csr_new(
    $distinguished_names,
    $private_key,
    ["config" => "/path/to/openssl.conf"]
);
?>

openssl.conf
```
[req]
default_md = null
// ...
```
Анонимен
20 години пред
If you get the error:

error:0D11A086:asn1 encoding routines:ASN1_mbstring_copy:string too short

then look at your key:value pairs in the $dn (distinguished name) array.

If you have one value (like "organizationalUnitName" = "") set to an empty string, it will throw the above error.

Fix the error by either eliminating that array element from $dn completely, or using a space " " instead of an empty string.
robertliu AT wiscore DOT com
20 години пред
I am using PHP-4.3.11.
The type of configargs--private_key_bits is a INTEGER, not a string.
An example of configration:
<?php
$config = array(
  "digest_alg" => "sha1",
  "private_key_bits" => 2048,
  "private_key_type" => OPENSSL_KEYTYPE_DSA,
  "encrypt_key" => false
);
?>
dankybastard на hotmail
21 години пред
As you probably guessed from the example, the documentation is misinforming.  openssl_csr_new returns a CSR resource or FALSE on failure.

mixed openssl_csr_new (assoc_array dn, resource_privkey, [...])
Ричард Линч
12 години пред
There appears to be no openssl_csr_free function.

At least not here.

If it's in the source, one might be able to just call it.

If it's not in the source, it probably should be.
@operator
пред 9 години
One command to create modern certificate request with 4 SAN subdomain.
According to RFC you can change CN (common name) and subjectAltName. When cert validated searching in CN and subjectAltName.

openssl req -new -nodes -config <( cat <<-EOF
[req]
default_bits = 2048
prompt = no
default_md = sha256
req_extensions = re
distinguished_name = dn
[ dn ]
CN = my.tld
C = country
ST = state
L = location
O = ORGANISATION
[ re ]
subjectAltName = DNS.1: www.my.tld, DNS.2: www2.my.tld, DNS.3: www3.my.tld, DNS.4: www4.my.tld
EOF
) -keyout secret.key -out req.csr
На оваа страница

Автоматски outline од активната документација.

Насловите ќе се појават тука по вчитување.

Попрегледно читање

Примерите, changelog табелите и user notes се визуелно издвоени за да не се губат во долгата содржина.

Брз совет Користи го outline-от Скокни директно на главните секции од активната страница.
Извор Оригиналниот линк останува достапен Кога ти треба целосен upstream context, отвори го PHP.net во нов tab.