PHPKonf Istanbul PHP Conference 2019 - Call for Papers

Opções de contexto de SSL

Opções de contexto de SSLLista de opções de contexto de SSL

Descrição

Opções de contexto dos transportadores ssl:// e tls://.

Opções

peer_name string

Nome do peer a ser utilizado. Se este valor não for defino, o nome será adivinhado com base no nome do host utilizado na abertura da stream.

verify_peer boolean

Exige a verificação do certificado SSL utilizado.

TRUE como padrão.

verify_peer_name boolean

Exige a verificação do nome do peer.

TRUE como padrão.

allow_self_signed boolean

Permite certificados auto assinados. Necessita o parâmetro verify_peer.

FALSE como padrão.

cafile string

Localização do arquivo de Autoridade Certificadora no sistema de arquivos que deve ser usado pela opção de contexto verify_peer para autenticar a identidade do peer remoto.

capath string

Se a opção cafile não for especificada, ou o certificado não for encontrado, o diretório apontado pela opção capath será utilizado na busca de um certificado adequado. A opção capath deve ser um diretório de certificado com hash correto.

local_cert string

Caminho para o certificado local no sistema de arquivos. Deve ser um arquivo PEM codificado que contêm seu certificado e chave privada. Pode opcionalmente conter a cadeia de certificados dos emitentes. A chave privada também pode estar em um arquivo separado especificada pela opção local_pk.

local_pk string

Caminho para a chave privada local no sistema de arquivos, em caso de se usar arquivos separados para o certificado (local_cert) e a chave privada.

passphrase string

Senha usada para codificar seu arquivo local_cert

CN_match string

Common Name esperado. O PHP executará o casamento de curingas. Se o Common Name não casar com este, a tentativa de conexão falhará.

Nota: Esta opção foi depreciada em favor de peer_name, a partir do PHP 5.6.0.

verify_depth integer

Abortará se a cadeia de certificados for muito profunda.

Não verificar por padrão.

ciphers string

Define a lista de cifras disponíveis. O formato desta string é descrita em » ciphers(1).

DEFAULT como padrão.

capture_peer_cert boolean

Se definida como TRUE, a opção de contexto peer_certificate será criada contendo o certificado peer.

capture_peer_cert_chain boolean

Se definida como TRUE, a opção de contexto peer_certificate_chain será criada contendo a cadeia certificadora.

SNI_enabled boolean

Se definida como TRUE, o indicador do nome do servidor será habilitado. Habilitar a SNI permite múltiplos certificados no mesmo endereço IP.

SNI_server_name string

Se definida, o valor será usado como o nome do servidor no indicador do nome de servidor. Se este valor não for definido, o nome do servidor é adivinhado baseando-se o nome do servidor utilizado na abertura da stream.

Nota: Esta opção foi depreciada em favor de peer_name, a partir do PHP 5.6.0.

disable_compression boolean

Se definida, desabilita a compressão TLS. Pode ajudar a mitigar o ataque de vetor criminoso.

peer_fingerprint string | array

Abortará quando o certificado resumido remoto não corresponder a um hash especificado.

Quando uma string for utilizada, o tamanho determinará qual algoritmo de hash será aplicado, "md5" (32) ou "sha1" (40).

Quando um array for utilizado, as chaves indicarão o nome do hash e os valores correspondentes o resumo esperado.

Changelog

Versão Descrição
5.6.0 Adicionada as opções peer_fingerprint e verify_peer_name. verify_peer têm como padrão TRUE.
5.4.13 Adicionada a opção disable_compression. Exige OpenSSL >= 1.0.0.
5.3.2 Adicionada as opções SNI_enabled e SNI_server_name.
5.0.0 Adicionada as opções capture_peer_cert, capture_peer_chain, ciphers e local_pk.

Notas

Nota: Por ssl:// ser um transporte básico para os empacotadores https:// e ftps://, qualquer opção de contexto aplicáveis a ssl://, também se aplicam a https:// e ftps://.

Nota: Para SNI (Server Name Indication) estar disponível, o PHP deve ser compilado com o OpenSSL 0.9.8j ou superior. Utilize a constante OPENSSL_TLSEXT_SERVER_NAME para determinar o suporte ao SNI.

add a note add a note

User Contributed Notes 6 notes

up
6
Charlie
2 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
5
website at meezaan dot net
2 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
Botjan kufca
8 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
borbas dot geri at gmail dot com
4 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
0
mechtecs at gmail dot com
1 month 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
0
Charlie
2 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