PHP 8.3.21 Released!

Opciones de contexto SSL

Opciones de contexto SSLLista de opciones de contexto SSL

Descripción

Opciones de contexto para los protocolos ssl:// y tls://.

Opciones

peer_name string

Nombre de pares a utilizar. Si este valor no está definido, entonces el nombre será adivinado basándose en el nombre de host utilizado al abrir el flujo.

verify_peer bool

Requiere una verificación del certificado SSL utilizado.

Por omisión, vale true.

verify_peer_name bool

Requiere la verificación del nombre de pares.

Por omisión, vale true.

allow_self_signed bool

Permite los certificados autofirmados. Requiere el parámetro verify_peer.

Por omisión, vale false

cafile string

Ubicación del fichero de la autoridad del certificado en el sistema de ficheros local que deberá ser utilizado con la opción de contexto verify_peer para identificar el par distante.

capath string

Si cafile no está especificado o si el certificado no ha sido encontrado, se realizará una búsqueda en el directorio señalado por capath para encontrar un certificado válido. capath debe ser un directorio de certificados válido.

local_cert string

Ruta al certificado local, en el sistema de ficheros. Debe ser un fichero codificado PEM que contiene su certificado y su clave privada. Puede, opcionalmente, contener la cadena de certificación del emisor. La clave privada también puede estar contenida en un fichero separado especificado por local_pk.

local_pk string

Ruta de acceso al fichero de clave privada local en el sistema de ficheros en el caso de ficheros separados para el certificado (local_cert) y la clave privada.

passphrase string

La frase de paso con la que su fichero local_cert ha sido codificado.

verify_depth int

Fallará si la cadena de certificación es demasiado profunda.

Por omisión, no se realiza ninguna verificación.

ciphers string

Define la lista de cifrados. El formato de la cadena está descrito en la página » ciphers(1).

Por omisión, vale DEFAULT.

capture_peer_cert bool

Si se define a true, se creará una opción de contexto peer_certificate que contendrá el certificado del emisor.

capture_peer_cert_chain bool

Si se define a true, se creará una opción de contexto peer_certificate_chain que contendrá la cadena de certificación.

SNI_enabled bool

Si vale true, la indicación sobre el nombre del servidor estará activada. Activar SNI permite utilizar múltiples certificados en la misma dirección IP.

disable_compression bool

Si se define, la compresión TLS estará desactivada. Esto puede ayudar a mitigar el vector de ataque CRIME.

peer_fingerprint string | array

Se detiene cuando el digest del certificado distante no coincide con el hash especificado.

Cuando se utiliza una string, la longitud determinará el algoritmo de hachaje utilizado, ya sea "md5" (32) o "sha1" (40).

Cuando se utiliza un array, la clave indica el nombre del algoritmo de hachaje, y cada valor correspondiente representa el digest esperado.

security_level int

Define el nivel de seguridad. Si no se especifica, se utiliza el nivel de seguridad por omisión. Los niveles de seguridad están descritos en » SSL_CTX_get_security_level(3).

Disponible a partir de PHP 7.2.0 y OpenSSL 1.1.0.

Historial de cambios

Versión Descripción
7.2.0 Adición de security_level. Requiere OpenSSL >= 1.1.0.

Notas

Nota: Dado que ssl:// es un protocolo subyacente para los gestores https:// y ftps://, todas las opciones de contexto aplicadas a ssl:// también se aplicarán a https:// y ftps://.

Nota: Para que SNI (Server Name Indication) esté disponible, PHP debe ser compilado con OpenSSL 0.9.8j o superior. Utilice la constante OPENSSL_TLSEXT_SERVER_NAME para determinar si SNI es soportado o no.

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
5 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
15 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
3 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
11 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