ΠžΠΏΡ†ΠΈΠΈ SSL-контСкста

ΠžΠΏΡ†ΠΈΠΈ SSL-контСкста β€” Бписок ΠΎΠΏΡ†ΠΈΠΉ SSL-контСкста

ОписаниС

ΠžΠΏΡ†ΠΈΠΈ контСкста для ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»ΠΎΠ² ssl:// ΠΈ tls://.

ΠžΠΏΡ†ΠΈΠΈ

peer_name string

Имя ΡƒΠ·Π»Π°. Если Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° Π½Π΅ Π·Π°Π΄Π°Π»ΠΈ, имя подставляСтся Π½Π° основС ΠΈΠΌΠ΅Π½ΠΈ хоста, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ использовался ΠΏΡ€ΠΈ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΠΈΠΈ ΠΏΠΎΡ‚ΠΎΠΊΠ°.

verify_peer bool

Π’Ρ€Π΅Π±ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ SSL-сСртификата.

По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ true.

verify_peer_name bool

Π’Ρ€Π΅Π±ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ ΠΈΠΌΠ΅Π½ΠΈ ΡƒΠ·Π»Π°.

По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ true.

allow_self_signed bool

Π Π°Π·Ρ€Π΅ΡˆΠΈΡ‚ΡŒ самоподписанныС сСртификаты. ВрСбуСтся опция verify_peer.

По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ false

cafile string

РасполоТСниС Ρ„Π°ΠΉΠ»Π° Ρ†Π΅Π½Ρ‚Ρ€Π° сСртификации Π² локальной Ρ„Π°ΠΉΠ»ΠΎΠ²ΠΎΠΉ систСмС, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ слСдуСт ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ с ΠΎΠΏΡ†ΠΈΠ΅ΠΉ контСкста verify_peer для ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ подлинности ΡƒΠ΄Π°Π»Ρ‘Π½Π½ΠΎΠ³ΠΎ ΡƒΠ·Π»Π°.

capath string

Если ΠΎΠΏΡ†ΠΈΡŽ cafile Π½Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΠ»ΠΈ ΠΈΠ»ΠΈ функция Π½Π΅ смогла Π½Π°ΠΉΡ‚ΠΈ сСртификат, выполняСтся поиск Π² Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΈ, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΡƒΠΊΠ°Π·Π°Π»ΠΈ Π² ΠΎΠΏΡ†ΠΈΠΈ capath. ΠŸΡƒΡ‚ΡŒ capath Π΄ΠΎΠ»ΠΆΠ΅Π½ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ Π½Π° ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΡƒΡŽ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΡŽ, которая содСрТит сСртификаты, ΠΈΠΌΠ΅Π½Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… β€” Ρ…Π΅Ρˆ ΠΎΡ‚ поля subject, ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠ³ΠΎ Π² сСртификатС.

local_cert string

ΠŸΡƒΡ‚ΡŒ ΠΊ Π»ΠΎΠΊΠ°Π»ΡŒΠ½ΠΎΠΌΡƒ сСртификату Π² Ρ„Π°ΠΉΠ»ΠΎΠ²ΠΎΠΉ систСмС. ВрСбуСтся Ρ„Π°ΠΉΠ», ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π·Π°ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²Π°Π»ΠΈ Π² Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅ PEM, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ содСрТит ваш сСртификат ΠΈ Π·Π°ΠΊΡ€Ρ‹Ρ‚Ρ‹ΠΉ ΠΊΠ»ΡŽΡ‡. Π€Π°ΠΉΠ» Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹ΠΉ ΠΊΠ»ΡŽΡ‡ эмитСнта. Π—Π°ΠΊΡ€Ρ‹Ρ‚Ρ‹ΠΉ ΠΊΠ»ΡŽΡ‡ Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒΡΡ Π² ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠΌ Ρ„Π°ΠΉΠ»Π΅, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π·Π°Π΄Π°Π»ΠΈ ΠΎΠΏΡ†ΠΈΠ΅ΠΉ local_pk.

local_pk string

ΠŸΡƒΡ‚ΡŒ ΠΊ Π»ΠΎΠΊΠ°Π»ΡŒΠ½ΠΎΠΌΡƒ Ρ„Π°ΠΉΠ»Ρƒ с ΠΏΡ€ΠΈΠ²Π°Ρ‚Π½Ρ‹ΠΌ ΠΊΠ»ΡŽΡ‡ΠΎΠΌ Π² случаС ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Ρ… Ρ„Π°ΠΉΠ»ΠΎΠ² сСртификата (local_cert) ΠΈ ΠΏΡ€ΠΈΠ²Π°Ρ‚Π½ΠΎΠ³ΠΎ ΠΊΠ»ΡŽΡ‡Π°.

passphrase string

Π˜Π΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΎΠ½Π½Π°Ρ Ρ„Ρ€Π°Π·Π°, с ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Π·Π°ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²Π°Π»ΠΈ ваш Ρ„Π°ΠΉΠ» local_cert.

verify_depth int

ΠŸΡ€Π΅Ρ€Π²Π°Ρ‚ΡŒ, Ссли Ρ†Π΅ΠΏΠΎΡ‡ΠΊΠ° сСртификата слишком длинная.

По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° отсутствуСт.

ciphers string

УстанавливаСт список доступных Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠΎΠ² ΡˆΠΈΡ„Ρ€ΠΎΠ²Π°Π½ΠΈΡ. Π€ΠΎΡ€ΠΌΠ°Ρ‚ этой строки описываСт страница Β»Β ΡˆΠΈΡ„Ρ€Ρ‹(1).

По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ DEFAULT.

capture_peer_cert bool

Если для ΠΎΠΏΡ†ΠΈΠΈ установили Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ true, Π±ΡƒΠ΄Π΅Ρ‚ создана опция контСкста peer_certificate, которая содСрТит сСртификат ΡƒΠ΄Π°Π»Ρ‘Π½Π½ΠΎΠ³ΠΎ ΡƒΠ·Π»Π°.

capture_peer_cert_chain bool

Если для ΠΎΠΏΡ†ΠΈΠΈ установили Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ true, Π±ΡƒΠ΄Π΅Ρ‚ создана опция контСкста peer_certificate_chain, которая содСрТит Ρ†Π΅ΠΏΠΎΡ‡ΠΊΡƒ сСртификатов.

SNI_enabled bool

Если для ΠΎΠΏΡ†ΠΈΠΈ установили Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ true, Π²ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡΡ индикация ΠΈΠΌΠ΅Π½ΠΈ сСрвСра. Π’ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ SNI Ρ€Π°Π·Ρ€Π΅ΡˆΠ°Π΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ€Π°Π·Π½Ρ‹Π΅ сСртификаты Π½Π° ΠΎΠ΄Π½ΠΎΠΌ IP-адрСсС.

disable_compression bool

ΠžΡ‚ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ TLS-сТатиС, Ρ‡Ρ‚ΠΎ ΠΏΠΎΠΌΠΎΠ³Π°Π΅Ρ‚ ΠΏΡ€Π΅Π΄ΠΎΡ‚Π²Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ Π°Ρ‚Π°ΠΊΠΈ Ρ‚ΠΈΠΏΠ° CRIME.

peer_fingerprint string | array

ΠŸΡ€Π΅Ρ€Π²Π°Ρ‚ΡŒΡΡ, Ссли дайдТСст сообщСния Π½Π΅ совпадаСт с ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹ΠΌ Ρ…Π΅ΡˆΠ΅ΠΌ.

Если ΡƒΠΊΠ°Π·Π°Π»ΠΈ строку (string), Π΅Ρ‘ Π΄Π»ΠΈΠ½Π° опрСдСляСт, ΠΊΠ°ΠΊΠΎΠΉ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ Ρ…Π΅ΡˆΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡ Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ: Β«md5Β» (32) ΠΈΠ»ΠΈ Β«sha1Β» (40).

Если ΡƒΠΊΠ°Π·Π°Π»ΠΈ массив (array), ΠΊΠ»ΡŽΡ‡ΠΈ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‚ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ Ρ…Π΅ΡˆΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡ, Π° ΠΊΠ°ΠΆΠ΄ΠΎΠ΅ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ прСдставляСт собой Ρ‚Ρ€Π΅Π±ΡƒΠ΅ΠΌΡ‹ΠΌ Ρ…Π΅ΡˆΠ΅ΠΌ.

security_level int

УстанавливаСт ΡƒΡ€ΠΎΠ²Π΅Π½ΡŒ бСзопасности. Если Π½Π΅ ΡƒΠΊΠ°Π·Π°Π»ΠΈ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ стандартный ΡƒΡ€ΠΎΠ²Π΅Π½ΡŒ бСзопасности, ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹ΠΉ Π² Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ΅. Π£Ρ€ΠΎΠ²Π½ΠΈ бСзопасности описываСт страница » SSL_CTX_get_security_level(3).

Доступна с PHP 7.2.0 ΠΈ OpenSSL 1.1.0.

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

ВСрсия ОписаниС
7.2.0 Π”ΠΎΠ±Π°Π²ΠΈΠ»ΠΈ ΠΎΠΏΡ†ΠΈΡŽ security_level. ВрСбуСтся OpenSSL >= 1.1.0.

ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΡ

Π—Π°ΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅: ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ssl:// β€” Π½ΠΈΠΆΠ΅Π»Π΅ΠΆΠ°Ρ‰ΠΈΠΉ транспортный ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ» для ΠΎΠ±Ρ‘Ρ€Ρ‚ΠΎΠΊ https:// ΠΈ ftps://, Π»ΡŽΠ±Ρ‹Π΅ ΠΎΠΏΡ†ΠΈΠΈ контСкста, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡŽΡ‚ΡΡ ΠΊ транспорту ssl://, Π±ΡƒΠ΄ΡƒΡ‚ Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒΡΡ ΠΊ ΠΎΠ±Ρ‘Ρ€Ρ‚ΠΊΠ°ΠΌ https:// ΠΈ ftps://.

Π—Π°ΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅: Π§Ρ‚ΠΎΠ±Ρ‹ ΡƒΠΊΠ°Π·Π°Π½ΠΈΠ΅ ΠΈΠΌΠ΅Π½ΠΈ сСрвСра (SNI, Server Name Indication) Π±Ρ‹Π»ΠΎ доступно, трСбуСтся ΡΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ PHP с OpenSSL 0.9.8j ΠΈΠ»ΠΈ Π±ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ·Π΄Π½Π΅ΠΉ. Π§Ρ‚ΠΎΠ±Ρ‹ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ, поддСрТиваСтся Π»ΠΈ SNI, ΡƒΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‚ константу OPENSSL_TLSEXT_SERVER_NAME.

οΌ‹Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ

ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΡ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ 9 notes

up
9
website at meezaan dot net ΒΆ
9 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
6
tianyiw at vip dot qq dot com ΒΆ
3 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
4
gabri dot ns at gmail dot com ΒΆ
6 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 ΒΆ
9 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 ΒΆ
16 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
borbas dot geri at gmail dot com ΒΆ
12 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
consatangmail dot com ΒΆ
4 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
Charlie ΒΆ
9 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).
up
-1
mechtecs at gmail dot com ΒΆ
7 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