Опции контекста SSL

Опции контекста SSLСписок опций контекста SSL

Описание

Опции контекста для протоколов ssl:// и tls://

Опции

peer_name string

Имя узла. Если его значение не задано, тогда имя подставляется основываясь на имени хоста, использованного при открытии потока.

verify_peer boolean

Требовать проверки используемого SSL-сертификата.

По умолчанию TRUE.

verify_peer_name boolean

Требовать проверки имени узла.

По умолчанию TRUE.

allow_self_signed boolean

Разрешить самоподписанные сертификаты. Требует verify_peer.

По умолчанию FALSE

cafile string

Расположение файла сертификата в локальной файловой системе, который следует использовать с опцией контекста verify_peer для проверки подлинности удалённого узла.

capath string

Если параметр cafile не определён или сертификат не найден, осуществляется поиск в директории, указанной в capath. Путь capath должен быть к корректной директории, содержащей сертификаты, имена которых являются хешем от поля subject, указанного в сертификате.

local_cert string

Путь к локальному сертификату в файловой системе. Это должен быть файл, закодированный PEM, который содержит ваш сертификат и приватный ключ. Он дополнительно может содержать публичный ключ эмитента.

passphrase string

Идентификационная фраза, с которой ваш файл local_cert был закодирован.

CN_match string

Имя хоста (Common Name), которое мы ожидаем. PHP будет производить ограниченное сопоставление, учитывающее символы подстановки (*,?). Если имя хоста не совпадает со строкой, соединение будет сброшено.

Замечание: Эта опция устарела. Начиная с PHP 5.6.0 используйте peer_name.

verify_depth integer

Прервать, если цепочка сертификата слишком длинная.

По умолчанию проверка отсутствует.

ciphers string

Устанавливает список доступных алгоритмов шифрования. Формат этой строки описан в разделе » шифры(1).

По умолчанию принимает значение DEFAULT.

capture_peer_cert boolean

Если установлено в TRUE, то будет создана опция контекста peer_certificate, содержащая сертификат удаленного узла.

capture_peer_cert_chain boolean

Если установлено в TRUE, то будет создана опция контекста peer_certificate_chain, содержащая цепочку сертификатов.

SNI_enabled boolean

Если установлено в TRUE, то будет включено указание имени сервера. Включение SNI позволяет использовать разные сертификаты на одном и том же IP-адресе.

SNI_server_name string

Если эта опция установлена, то это значение будет использоваться для указания имени сервера. Если это значение не установлено, то имя сервера определяется из имени хоста, использовавшегося при открытии потока.

Замечание: Эта опция устарела. Начиная с PHP 5.6.0 используйте peer_name.

disable_compression boolean

Отключает сжатие TLS, что помогает предотвратить атаки типа CRIME.

peer_fingerprint string | array

Прерваться, если дайджест сообщения не совпадает с указанным хэшом.

Если указана строка (string), то её длина определяет какой алгоритм хэширования будет использован: "md5" (32) или "sha1" (40).

Если указан массив (array), то ключи определяют алгоритм хэширования, а каждое соответствующее значение является требуемым хэшом.

Список изменений

Версия Описание
5.6.0 Добавлены peer_fingerprint и verify_peer_name. Значение по умолчанию для verify_peer изменено на TRUE.
5.4.13 Добавлен disable_compression. Требуется OpenSSL >= 1.0.0.
5.3.2 Добавлены параметры SNI_enabled и SNI_server_name.
5.0.0 Добавлены параметры capture_peer_cert, capture_peer_chain и ciphers.

Примечания

Замечание: Так как ssl:// - это низлежащий транспортный протокол для оберток https:// и ftps://, то любые опции контекста, которые применяются к ssl:// будут также применяться к https:// и ftps://.

Замечание: Чтобы была доступна возможность указания имени сервера (SNI, Server Name Indication), PHP должен быть скомпилирован с OpenSSL 0.9.8j или более поздней. Используйте константу OPENSSL_TLSEXT_SERVER_NAME чтобы определить, поддерживается ли SNI.

Коментарии

Автор:
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.
2010-02-20 13:11:10
http://php5.kiev.ua/manual/ru/context.ssl.html
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`.
2014-01-31 14:06:08
http://php5.kiev.ua/manual/ru/context.ssl.html
There is also a crypto_type context. In older versions this was crypto_method. This is referenced on function.stream-socket-enable-crypto
2016-09-05 16:48:40
http://php5.kiev.ua/manual/ru/context.ssl.html
Автор:
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).
2016-12-02 21:28:14
http://php5.kiev.ua/manual/ru/context.ssl.html
Автор:
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;
2016-12-05 21:53:46
http://php5.kiev.ua/manual/ru/context.ssl.html
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
2018-11-09 15:09:05
http://php5.kiev.ua/manual/ru/context.ssl.html
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.
2020-01-13 11:21:38
http://php5.kiev.ua/manual/ru/context.ssl.html
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
2022-04-19 06:41:48
http://php5.kiev.ua/manual/ru/context.ssl.html
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',
        ],
    ]
]);
?>
2022-12-09 18:52:49
http://php5.kiev.ua/manual/ru/context.ssl.html

    Поддержать сайт на родительском проекте КГБ