PHP 8.4.2 Released!

SSL-Kontext-Optionen

SSL-Kontext-OptionenListe der SSL-Kontext-Optionen

Beschreibung

Kontextoptionen für die ssl:// und tls:// Übermittlung.

Optionen

peer_name string

Zu verwendender Peer-Name. Wird dieser Wert nicht gesetzt, so wird der Name anhand des Hostnamen erraten, sobald der Stream geöffnet wird.

verify_peer bool

Die Überprüfung des verwendeten SSL-Zertifikats ist erforderlich.

Standardmäßig true.

verify_peer_name bool

Erfordere die Verifikation des Peernamens.

Standardmäßig true.

allow_self_signed bool

Selbst signifizierte Zerifikate erlauben. Setzt verify_peer voraus.

Standardmäßig false

cafile string

Speicherort der Zertifizierungsstellendatei auf dem lokalen Dateisystem, welche im Zusammenhang mit der verify_peer Option verwendet werden soll, um die Identität der Gegenstelle zu authentifizieren.

capath string

Falls cafile nicht angegeben wurde, oder dort das Zertifikat nicht gefunden wurde, so wird das durch capath angegebene Verzeichnis nach einem passenden Zertifikat durchsucht. capath muss ein korrekt gehashtes Zertifikatsverzeichnis sein.

local_cert string

Pfad zur lokalen Zertifikatsdatei im Dateisystem. Dies muss eine im PEM-Format gespeicherte Datei sein, welche das Zertifikat und den privaten Schlüssel enthält. Optional kann dies die Kette an Herausgeberzertifikaten enthalten. Der private Schlüssel kann ebenfalls in einer eigenen Datei enthalten sein, die durch local_pk angegeben wird.

local_pk string

Pfad zu einer lokalen Datei, die den privaten Schlüssel enthält, falls es unterschiedliche Dateien für Zertifikate (local_cert) und private Schlüssel gibt.

passphrase string

Passphrase mit der die local_cert-Datei gespeichert wurde.

verify_depth int

Abbruch, wenn die Zertifikatskette zu tief ist.

Standardmäßig keine Prüfung.

ciphers string

Setzt die Liste der verfügbaren Verschlüsselungsverfahrenn. Das Format dieser Zeichenkette wird in » ciphers(1) beschrieben.

Standardmäßig auf DEFAULT gesetzt.

capture_peer_cert bool

Falls dies auf true gesetzt ist, so wird die Kontextoption peer_certificate angelegt, welche das Zertifikat der Gegenstelle enthält.

capture_peer_cert_chain bool

Falls dies auf true gesetzt ist, so wird die Kontextoption peer_certificate_chain angelegt, welche die Zertifikatskette enthält.

SNI_enabled bool

Falls dies auf true gesetzt wird, so wird Server Name Indication eingeschaltet. Die Verwendung von SNI erlaubt die Benutzung von mehreren Zertifikaten unter der gleichen IP-Adresse.

disable_compression bool

Wenn dies gesetzt wird, so wird TLS-Komprimierung ausgeschaltet. Dies kann den CRIME-Angriffsvektor entschärfen.

peer_fingerprint string | array

Beendet die Verbindung, wenn der Fingerabdruck des entfernten Zertifikats nicht dem angegebenen Hashwert entspricht.

Wird ein String verwendet, so wird der zu verwendende Hashalgorithmus anhand der Länge der Zeichenkette ermittelt, entweder "md5" (32) oder "sha1" (40).

Wird ein Array verwendet, so geben die Schlüsselnamen den Namen des Hashalgorithmus an, und jeder zugehörige Wert entspricht dem erwarteten Fingerabdruck.

security_level int

Legt die Sicherheitsstufe fest. Falls nicht angegeben, wird die Standard-Sicherheitsstufe der Bibliothek verwendet. Die Sicherheitsstufen sind in » SSL_CTX_get_security_level(3) beschrieben.

Verfügbar von PHP 7.2.0 und OpenSSL 1.1.0 an.

Changelog

Version Beschreibung
7.2.0 security_level hinzugefügt. Erfordert OpenSSL >= 1.1.0.

Anmerkungen

Hinweis: Weil ssl:// die den Wrappern https:// und ftps:// zugrunde liegende Übertragungsschicht ist, gelten alle Optionen, die für ssl:// angewendet werden, ebenfalls für https:// und ftps://.

Hinweis: Damit SNI (Server Name Indication) verfügbar ist muss PHP mit OpenSSL 0.9.8j oder neuer kompiliert sein. Die Konstante OPENSSL_TLSEXT_SERVER_NAME kann zur Prüfung, ob SNI verfügbar ist, herangezogen werden.

add a note

User Contributed Notes 9 notes

up
7
tianyiw at vip dot qq dot com
2 years ago
Enable SNI (Server Name Indication):
PEM must be contains certificate and private key.
<?php
$context
= stream_context_create([
'ssl' => [
'SNI_enabled' => true,
'SNI_server_certs' => [
'host1.com' => '/path/host1.com.pem',
'host2.com' => '/path/host2.com.pem',
],
]
]);
?>
up
9
website at meezaan dot net
8 years ago
There is also a crypto_type context. In older versions this was crypto_method. This is referenced on http://php.net/manual/en/function.stream-socket-enable-crypto.php
up
3
gabri dot ns at gmail dot com
4 years ago
i usually download root CA certificate from https://curl.haxx.se/docs/caextract.html then put it as 'cafile' and it work almost all of the time.

the only problem i'v ever found is when the server does not properly sending intermediete CA certificate, then, you must add it manually to the file.
up
4
Charlie
8 years ago
I am unable to load a PEM that was generated with the stunnel tools. However, I am able to use PHP calls to generate a working PEM that is recognized both by stunnel and php, as outlined here:

http://www.devdungeon.com/content/how-use-ssl-sockets-php

This code fragment is now working for me, and with stunnel verify=4, both sides confirm the fingerprint. Oddly, if "tls://" is set below, then TLSv1 is forced, but using "ssl://" allows TLSv1.2:

$stream_context = stream_context_create([ 'ssl' => [
'local_cert' => '/path/to/key.pem',
'peer_fingerprint' => openssl_x509_fingerprint(file_get_contents('/path/to/key.crt')),
'verify_peer' => false,
'verify_peer_name' => false,
'allow_self_signed' => true,
'verify_depth' => 0 ]]);

$fp = stream_socket_client('ssl://ssl.server.com:12345',
$errno, $errstr, 30, STREAM_CLIENT_CONNECT, $stream_context);
fwrite($fp, "foo bar\n");
while($line = fgets($fp, 8192)) echo $line;
up
4
Botjan kufca
14 years ago
CN_match works contrary to intuitive thinking. I came across this when I was developing SSL server implemented in PHP. I stated (in code):

- do not allow self signed certs (works)
- verify peer certs against CA cert (works)
- verify the client's CN against CN_match (does not work), like this:

stream_context_set_option($context, 'ssl', 'CN_match', '*.example.org');

I presumed this would match any client with CN below .example.org domain.
Unfortunately this is NOT the case. The option above does not do that.

What it really does is this:
- it takes client's CN and compares it to CN_match
- IF CLIENT's CN CONTAINS AN ASTERISK like *.example.org, then it is matched against CN_match in wildcard matching fashion

Examples to illustrate behaviour:
(CNM = server's CN_match)
(CCN = client's CN)

- CNM=host.example.org, CCN=host.example.org ---> OK
- CNM=host.example.org, CCN=*.example.org ---> OK
- CNM=.example.org, CCN=*.example.org ---> OK
- CNM=example.org, CCN=*.example.org ---> ERROR

- CNM=*.example.org, CCN=host.example.org ---> ERROR
- CNM=*.example.org, CCN=*.example.org ---> OK

According to PHP sources I believe that the same applies if you are trying to act as Client and the server contains a wildcard certificate. If you set CN_match to myserver.example.org and server presents itself with *.example.org, the connection is allowed.

Everything above applies to PHP version 5.2.12.
I will supply a patch to support CN_match starting with asterisk.
up
2
consatangmail dot com
2 years ago
recommended use "ssl://" transport.

in php 5.5 ~ 7.1
ssl:// transport = ssl_v2|ssl_v3|tls_v1.0|tls_v1.1|tls_v1.2
tls:// transport = tls_v1.0

after 7.2 ssl:// and tls:// transports is same
php 7.2 ~ 7.3 = tls_v1.0|tls_v1.1|tls_v1.2
php 7.4 ~ 8.1 = tls_v1.0|tls_v1.1|tls_v1.2|tls_v1.3
up
1
borbas dot geri at gmail dot com
10 years ago
I used this for Apple Push Notification Service.
Passed in a local certificate filename `cert.pem` trough local_cert option.
Worked fine, when invoked the script directly.

But when I included/required the script from a different location, it stopped working, without any explicit error message.

Resolved by passed in the full path for the file `<FullPathTo>cert.pem`.
up
-1
mechtecs at gmail dot com
6 years ago
If you want to validate the server against a local certificate, which you already saved, to further validate the target server, you have to use a fullchain.pem. Then the verify_peer option will work. So just get the server certificate, and search the root CA's pem's and copy everything into a single file. For example:

My certificate has the "GeoTrust TLS RSA CA G1" certificate in the chain, so you google that string. Go to the official digicert Geotrust page and download the "GeoTrustTLSRSACAG1.crt" certificate. Then you can use the following command to convert it into the pem format:
openssl x509 -inform DER -in GeoTrustTLSRSACAG1.crt -out GeoTrustTLSRSACAG1.crt.pem -outform PEM
up
-2
Charlie
8 years ago
It appears that "allow_self_signed" does not and cannot apply to the local_cert option.

The stunnel verify=4 option, which verifies but ignores a CA, has no analog in these settings, which is unfortunate.

Even more perplexingly, while the "openssl verify -CAfile" is successful, PHP appears unable to use the new ca/crt pair in any configuration.

I did actually link my PHP against a copy of LibreSSL 2.3.8, but PHP oddly is unable to use TLS1.1 or 1.2. It does, however, enable EC secp521r1 (of which my native OpenSSL 0.9.8e is incapable).
To Top