PHP Doku:: Erzeugt einen CSR - function.openssl-csr-new.html

Verlauf / Chronik / History: (1) anzeigen

Sie sind hier:
Doku-StartseitePHP-HandbuchFunktionsreferenzKryptografische ErweiterungenOpenSSLOpenSSL Funktionenopenssl_csr_new

Ein Service von Reinhard Neidl - Webprogrammierung.

OpenSSL Funktionen

<<openssl_csr_get_subject

openssl_csr_sign>>

openssl_csr_new

(PHP 4 >= 4.2.0, PHP 5)

openssl_csr_newErzeugt einen CSR

Beschreibung

mixed openssl_csr_new ( array $dn , resource &$privkey [, array $configargs [, array $extraattribs ]] )

openssl_csr_new() erzeugt einen neuen CSR (Zertifikatssignierungsanfrage) basierend auf den Informationen, die mit dem Parameter dn angegeben werden. Dieser bestimmt den Distinguished Name, der im Zertifikat benutzt werden soll.

Hinweis: Die ordnungsgemäße Ausführung dieser Funktion setzt die Installation einer gültigen openssl.cnf-Datei voraus. Mehr Information hierzu finden sie im Installationsabschnitt.

Parameter-Liste

dn

Der Distinguished Name der im Zertifikat genutzt werden soll

privkey

privkey sollte auf einen privaten Schlüssel zeigen, der vorher mit openssl_pkey_new() erzeugt wurde (oder den Sie auf andere Weise von der Familie der openssl_pkey Funktionen erhalten haben). Der entsprechende öffentliche Teil des Schlüssels wird benutzt um den CSR zu signieren.

configargs

configargskönnen Sie benutzen um zusätzliche Konfigurationsoptionen für den CSR anzugeben. Sowohl dn als auch extraattribs sind assoziative Arrays, deren Schlüssel zu OIDs konvertiert und auf den relevanten Teil der Anfrage angewendet werden.

Im Standard werden die Informationen für die Anfrage aus der openssl.conf ihres Systems benutzt. Sie können einen Konfigurationsabsschnitt mit dem Schlüssel config_section_section des Arrays configargssetzen. Außerdem haben Sie die Möglichkeit eine alternative openssl Konfigurationsdatei anzugeben, indem Sie den Wert des Schlüssels config auf den Pfad zu der Datei setzen, die Sie benutzen möchten. Die unten in der Tabelle aufgeführten Schlüssel in configargs, falls Sie diese definiert haben, verhalten sich genau gleich wie die entsprechenden Werte in der openssl.conf
Überschreiben der Konfiguration
configargs Schlüssel Typ openssl.conf Entsprechung Beschreibung
digest_alg string default_md Bestimmt welche digest Methode benutzt wird
x509_extensions string x509_extensions Bestimmt welche Erweiterung benutzt werden soll, wenn ein x509 Zertifikat erzeugt werden soll.
req_extensions string req_extensions Bestimmt welche Erweiterung benutzt werden soll, wenn eine Zertifikatssignierungsanfrage (CSR) erzeugt werden soll.
private_key_bits string default_bits Bestimmt wieviele Bits verwendet werden, um einen privaten Schlüssel zu erzeugen.
private_key_type integer none Bestimmt den Typ des privaten Schlüssels der erzeugt werden soll. Der Typ kann einer der folgenden sein: OPENSSL_KEYTYPE_DSA, OPENSSL_KEYTYPE_DH oder OPENSSL_KEYTYPE_RSA. Der Standardwert ist OPENSSL_KEYTYPE_RSA, momentan ist das der einzige Schlüsseltyp, der unterstützt wird.
encrypt_key boolean encrypt_key Soll ein exportiertet Schlüssel (mit Passphrase) verschlüsselt werden?

Rückgabewerte

Gibt den CSR zurück.

Beispiele

Beispiel #1 Erzeugen eines selbstsignierten Zertifikats

<?php
// Angabe der Daten für den distinguished name, der in dem Zertifikat benutzt
// wird. Sie müssen die Werte dieser Schlüssel so anpassen, dass diese ihrem
// Namen und Firma entsprechen, oder um präziser zu sein, den Namen und die
// Firma der Person/Seite angeben, für die Sie das Zertifikat erzeugen.
// Für SSL Zertifikate entspricht der commonName gewöhnlich dem Domainnamen,
// für den das Zertifikat benutzt werden soll, aber bei S/MIME Zertifikaten
// entspricht der commonName dem Namen der Person, die das Zertifikat nutzen
// möchte.
$dn = array(
    
"countryName" => "UK",
    
"stateOrProvinceName" => "Somerset",
    
"localityName" => "Glastonbury",
    
"organizationName" => "The Brain Room Limited",
    
"organizationalUnitName" => "PHP Documentation Team",
    
"commonName" => "Wez Furlong",
    
"emailAddress" => "wez@example.com"
);

// Erzeugen eines neuen privaten (und öffentlichen) Schlüsselpaars
$privkey openssl_pkey_new();

// Erzeugen einer Zertifikatssignierungsanfrage
$csr openssl_csr_new($dn$privkey);

// Gewöhnlicherweise möchten Sie zu diesem Zeitpunkt ein selbstsigniertes
// Zertifikat erzeugen, das Sie benutzten können, bis ihre CA ihre Anfrage
// im positiven Sinne bearbeitet hat.
// Erzeugen eines selbstsignierten Zertifikts, das für die Dauer von 365 Tagen
// gültig ist.
$sscert openssl_csr_sign($csrnull$privkey365);

// Jetzt möchten Sie ihren privaten Schlüssel, ihren CSR und das
// selbstsignierte Zertifikat sichern, damit Sie dieses, abhängig vom
// beabsichtigten Verwendungszweck, auf ihrem Web-, Mailserver oder
// in ihrem Mailprogramm installieren können.
// Dieses Beispiel zeigt ihnen, wie Sie diese Dinge in Variablen abspeichern,
// aber genauso können Sie die Informationen direkt in Dateien speichern.
// Typischerweise schicken Sie den CSR an Ihre CA, die daraufhin diese Anfrage
// bearbeitet und Sie mit einem "richtigen" Zertifikat ausstattet.
openssl_csr_export($csr$csrout) and var_dump($csrout);;
openssl_x509_export($sscert$certout) and var_dump($certout);
openssl_pkey_export($privkey$pkeyout"mypassword") and var_dump($pkeyout);

// Anzeigen der möglichen aufgetretenen Fehler
while (($e openssl_error_string()) !== false) {
    echo 
$e "\n";
}
?>


8 BenutzerBeiträge:
- Beiträge aktualisieren...
The_Lost_One
18.09.2009 16:45
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
       
);
?>
AA
28.12.2008 18:52
*hint* openssl_csr_new() automatically generates private key / public key pair:

<?php
$configargs
= array(
   
'config' => '/etc/ssl/openssl.cnf',
   
'digest_alg' => 'md5',
   
'x509_extensions' => 'v3_ca',
   
'req_extensions'   => 'v3_req',
   
'private_key_bits' => 666,
   
'private_key_type' => OPENSSL_KEYTYPE_RSA,
   
'encrypt_key' => false,
    );

$dn = array(
   
"countryName" => "DE",
   
"stateOrProvinceName" => "wubbla wubbla",
   
"localityName" => "wubbla",
   
"organizationName" => "Internet Widgits Pty Ltd",
   
"organizationalUnitName" => "Organizational Unit Name",
   
"commonName" => "example.com",
   
"emailAddress" => "Email Address"
);

$privkey = null; // <--- !!

$csr = openssl_csr_new($dn, $privkey, $configargs);

var_dump(openssl_pkey_get_details($privkey));
/*
array(3) {
  ["bits"]=>
  int(666)
  ["key"]=>
  string(207) "-----BEGIN PUBLIC KEY-----
MG8wDQYJKoZIhvcN (...) gMBAAE=
-----END PUBLIC KEY-----
"
  ["type"]=>
  int(0)
}
*/
?>
main ATT jokester DOTT fr
2.09.2008 17:09
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.
dylan at pow7 dot com
5.07.2007 2:45
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.
gonzak at op dot pl
14.02.2006 19:57
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

24.06.2005 21:34
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
13.05.2005 5:12
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 at hotmail
9.02.2005 15:31
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, [...])



PHP Powered Diese Seite bei php.net
The PHP manual text and comments are covered by the Creative Commons Attribution 3.0 License © the PHP Documentation Group - Impressum - mail("TO:Reinhard Neidl",...)