openssl_csr_new

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

openssl_csr_newBir sertifika imzalama isteği (CSR) üretir

Açıklama

mixed openssl_csr_new ( array $dn , resource &$gizanh [, array $ayarlar [, array $ek_seçenekler ]] )

dn ile belirtilen, sertifika için kullanılacak ayırt edilebilir isim ile sağlanan bilgiye dayanarak yeni bir sertifika imzalama isteği (CSR) üretir.

Bilginize: Bu işlevin gerektiği gibi çalışması için geçerli bir openssl.cnf kurulu olmalıdır. Daha ayrıntılı bilgi için kurulum bölümüne bakınız.

Değiştirgeler

dn

Sertifika için kullanılacak ayırt edilebilir isim.

gizanh

openssl_pkey_new() (veya başka bir openssl_pkey işlevi) ile üretilmiş bir gizli anahtar. Anahtar çiftinin genel anahtar parçası CSR'yi imzalamakta kullanılır.

ayarlar

İsteği ilklendirmek için öntanımlı olarak sisteminizdeki openssl.conf kullanılır. ayarlar dizisinin config_section_section anahtarında başka bir yapılandırma dosyası bölümü belirtebileceğiniz gibi config anahtarında başka bir openssl yapılandırma dosyasının yolunu da belirtebilirsiniz. ayarlar dizisi aşağıdaki anahtarları içerebilir. Bu anahtarlar openssl.conf dosyasındaki eşdeğerleri gibi davranırlar.

Yapılandırma Geçersizleştiricileri
ayarlar anahtarı Türü openssl.conf eşdeğeri Açıklama
digest_alg string default_md Kullanılacak özet yöntemini belirler.
x509_extensions string x509_extensions Bir x509 sertifikası üretilirken kullanılacak eklentileri belirler.
req_extensions string req_extensions Bir CSR üretilirken kullanılacak eklentileri belirler.
private_key_bits integer default_bits Bir gizli anahtarın kaç bitlik olacağını belirler.
private_key_type integer none Üretilecek gizli anahtarın türünü belirler. Şu sabitlerden biri olabilir: OPENSSL_KEYTYPE_DSA, OPENSSL_KEYTYPE_DH, OPENSSL_KEYTYPE_RSA. Öntanımlı değer OPENSSL_KEYTYPE_RSA olup şimdilik desteklenen tek anahtar türüdür.
encrypt_key boolean encrypt_key İhraç edilecek anahtar (bir parola ile) şifrelenececek mi?

ek_seçenekler

CSR için kullanılacak ek seçenekleri belirtmek için kullanılır. dn ve ek_seçenekler birer ilişkisel dizi olup anahtarları nesne kimliklerine (OID) dönüştürülerek isteğin ilgili parçasına uygulanır.

Dönen Değerler

Üretilen CSR'yi döndürür.

Örnekler

Örnek 1 - Öz-imzalı sertifika üretimi

<?php
// Sertifikada ayırt edilebilir isim için kullanılacak veriyi oluşturalım.
// Bu anahtar değerlerinde, isminiz, şirketiniz ve hatta sertifikanın adına
// üretildiği şirketin veya şahsın isminin bulunmasını sağlayın.
// SSL sertifikaları için commonName genellikle sertifikayı kullanacak
// alan ismidir. Fakat S/MIME sertifikalar için commonName, sertifikayı
// kullanacak şahsın ismidir.
$dn = array(
    
"countryName" => "UK",
    
"stateOrProvinceName" => "Somerset",
    
"localityName" => "Glastonbury",
    
"organizationName" => "The Brain Room Limited",
    
"organizationalUnitName" => "PHP Documentation Team",
    
"commonName" => "Wez Furlong",
    
"emailAddress" => "wez@example.com"
);

// Yeni bir gizli/genel anahtar çifti üretelim
$privkey openssl_pkey_new();

// Bir sertifika imzalama isteği üretelim
$csr openssl_csr_new($dn$privkey);

// CA'nız isteği yerine getirene kadar bir öz-imzalı sertifika üretelim.
// Bu sertifika 365 günlük olsun.
$sscert openssl_csr_sign($csrnull$privkey365);

// (Sertifikanın kullanılacağı yere bağlı olarak) posta istemcisine,
// posta sunucusuna veya HTTP sunucusuna kurulacak öz-imzali sertifikayı,
// CSR'yi ve gizli anahtarı alalım. Örnekte bunlar değişkenlere atanmıştır.
// Fakat siz bunları doğrudan dosyalarına kaydedebilirsiniz.
// CSR genellikle "gerçek" sertifikayı üretecek CA'ya gönderilir.
openssl_csr_export($csr$csrout); var_dump($csrout);
openssl_x509_export($sscert$certout); var_dump($certout);
openssl_pkey_export($privkey$pkeyout"mypassword"); var_dump($pkeyout);

// Oluşan hatalar varsa gösterelim
while (($e openssl_error_string()) !== false) {
    echo 
$e "\n";
}
?>

add a note add a note

User Contributed Notes 12 notes

up
6
alex at nodex dot co dot uk
3 years ago
In the PHP example above it uses "UK" as the country name which is incorrect, the country name must be "GB"
up
9
The_Lost_One
8 years ago
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
       
);
?>
up
1
main ATT jokester DOTT fr
9 years ago
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" => "ilovessl@php.net"
);
$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.
up
1
james at kirk dot com
2 years ago
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.
up
1
Anonymous
2 years ago
For those of you using Debian-based systems, the openssl configuration file is at: /etc/ssl/openssl.cnf
up
0
@operator
1 year ago
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
up
0
Richard Lynch
4 years ago
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.
up
0
Anonymous
12 years ago
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.
up
0
dankybastard at hotmail
12 years ago
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, [...])
up
-1
robertliu AT wiscore DOT com
12 years ago
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
);
?>
up
-6
gonzak at op dot pl
11 years ago
How in openssl_csr_new  usign [, array configargs [, array extraattribs]]
because I am have add this extension to certificate
/********************
basicConstraints = critical,CA:TRUE,pathlen:0
nsCertType = sslCA,emailCA,objCA
**********************************/

Rafal
up
-3
dylan at pow7 dot com
10 years ago
Is there some way to change the distinguished name using this function? I have tried adding overrides to the dn to configargs and extraattribs but this did not have an impact on the certificate.

Example: A CSR is submitted and I want to change only the commonName (CN) before signing the certificate.
To Top