Opciones de contexto para SSL

Opciones de contexto para SSLListado de opciones de contexto para SSL

Descripción

Opciones de contexto para transportes ssl:// y tls://

Opciones

peer_name string

Nombre del par a utilizar. Si no se establece este valor, se averigua basándose en el nombre del host empleado al abrir el flujo.

verify_peer boolean

Requerir verificación del certificado SSL utilizado.

Por defecto es true.

verify_peer_name boolean

Requerir verificación de nombre del par.

Por defecto es true.

allow_self_signed boolean

Permite certificados auto-firmados. Requiere verify_peer.

Por defecto es false

cafile string

Ubicación del archivo de la entidad emisora de certificados en el sistema de archivos local, la cual debe ser utilizada con la opción de contexto verify_peer para autenticar la identidad del par remoto.

capath string

Si no se específica cafile o si no se encuentra el certificado, el directorio al que apunta capath sera explorado en busca de un certificado apropiado. capath debe ser un directorio con el hash correcto.

local_cert string

Ruta hacia el archivo del certificado local en el sistema de archivos. Debe ser un archivo codificado con PEM el cual contenga el certificado y la llave privada. Puede, opcionalmente, contener la cadena de los emisores del certificado. La clave privada también podría estar contenida en un fichero aparte especificado por local_pk.

local_pk string

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

passphrase string

La frase de contraseña con la cual el archivo local_cert fue codificado.

CN_match string

El nombre común que se está esperando. PHP realizará comparaciones limitadas de comodines. Si el nombre común no coincide con esto, el intento de conexión fallará.

Nota: Esta opción está obsoleta a favor de peer_name, a partir de PHP 5.6.0.

verify_depth integer

Abortar si la cadena de certificados es demasiado profunda.

Por defecto es no verificarlo.

ciphers string

Establece la lista de sistemas de cifrado disponibles. El formato de la cadena se describe en » ciphers(1).

Por defecto es DEFAULT.

capture_peer_cert boolean

Si se establece en true, una opción de contexto peer_certificate será creada, conteniendo el certificado par.

capture_peer_cert_chain boolean

Si se establece en true, una opción de contexto peer_certificate_chain será creada, conteniendo la cadena del certificado.

SNI_enabled boolean

Si se establece en true, la indicación del nombre del servidor se activará. Activando SNI se permiten múltiples certificados en la misma dirección IP.

SNI_server_name string

Si se establece, entonces este valor se utilizará como nombre del servidor para la indicación de nombre de servidor. Si este valor no está establecido, entonces el nombre del servidor se supone basado en el nombre de host utilizado cuando se abre el flujo.

Nota: Esta opción está obsoleta a favor de peer_name, a partir de PHP 5.6.0.

disable_compression boolean

Si está establecido, deshabilita la comprensión TLS. Esto puede ayudar a mitigar el vector de ataque CRIME.

peer_fingerprint string | array

Aborta cuando el resumen del certificado remoto no coincide con el has especificado.

Cuando se emplea un string, la longitud determinará qué algoritmo hash se aplica, si "md5" (32) o "sha1" (40).

Cuando se emplea un array, las claves indican el nombre del algoritmo hash y cada valor correspondiente es el resumen previsto.

Historial de cambios

Versión Descripción
5.6.0 Se añadieron peer_fingerprint and verify_peer_name. El valor predeterminado de verify_peer se cambió a true.
5.4.13 Se añadió disable_compression. Requiere OpenSSL >= 1.0.0.
5.3.2 Se añadió SNI_enabled y SNI_server_name.

Notas

Nota: Debido a que ssl:// el es transporte subyacente para las envolturas https:// y ftps://, cualquier opción de contexto que aplique para ssl:// también aplica para https:// y ftps://.

Nota: Para que SNI (Server Name Indication) esté disponible, entonces PHP se debe compilar con OpenSSL 0.9.8j o superior. Se utiliza OPENSSL_TLSEXT_SERVER_NAME para determinar si SNI está soportado.

add a note add a note

User Contributed Notes 9 notes

up
6
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
7
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
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
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
3
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
1
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
0
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