Зміни OpenSSL у PHP 5.6.x

Обгортки потоків тепер за промовчанням перевіряють сертифікати вузлів та імена хостів під час використання SSL/TLS

Всі клієнтські потоки, що шифруються, тепер за замовчуванням включають перевірку бенкетів. За замовчуванням сертифікат бенкету перевіряється пакетом OpenSSL CA. Зазвичай нічого не потрібно робити для з'єднання з серверами з правильним SSL-сертифікатом, оскільки OpenSSL налаштований так, що вже працює з хорошими CA-пакетами.

Стандартний CA пакет може бути перевизначений глобально за допомогою установки або openssl.cafile або openssl.capath рядків конфігурації, або ж на рівні кожного запиту, використовуючи опції контексту cafile або capath

Хоча це і не рекомендується, але можна вимкнути перевірку сертифіката бенкету для запиту, встановивши verify_peerопцию контекста в**false, і можна вимкнути перевірку імені бенкету, встановивши verify_peer_nameвfalse**

Сигнатура сертифіката

Було додано підтримку вилучення та перевірки сигнатури сертифіката. Для отримання сигнатур сертифікатів X.509 додано функцію openssl_x509_fingerprint(). Також було додано дві опції контексту потоку SSL capture_peer_certдля захвата узлового сертификата X.509, иpeer_fingerprintдля проверки сертификата на соответствие заданной сигнатуре.

Оновлено шифри за замовчуванням

Список стандартних шифрів, що використовуються PHP, був оновлений на більш безпечний відповідно до »  рекомендаціями щодо шифрів від Mozilla, з двома додатковими винятками: анонімні шифри Діффі-Хеллмана та RC4.

Цей список доступний через нову константу OPENSSL_DEFAULT_STREAM_CIPHERS, і може бути перевизначений (як і в попередніх версіях PHP) установкою опцією контексту ciphers

Стиснення заборонено за умовчанням

Стиснення SSL/TLS було заборонено за замовчуванням для зменшення зменшення ймовірності атаки типу CRIME. У PHP 5.4.13 було додано опцію контексту disable_compression для можливості заборонити компресію і тепер вона за умовчанням встановлена ​​як true (тобто компресію заборонено).

Дозвіл серверу визначати свій власний порядок шифрів

Додано опцію контексту honor_cipher_order, яка дозволяє серверу, що обслуговує зашифрований потік, самому визначати шифри, якими буде користуватися клієнт. Це дозволить знизити ризик атаки типу BEAST.

Доступ до узгодженого протоколу та шифру

Протокол та шифр, узгоджені для шифрованого потоку, доступні за допомогою функцій stream_get_meta_data() або stream_context_get_options(), если опция контекста SSLcapture_session_metaустановлена как**true**

Loading...

Результат виконання наведеного прикладу:

array(4) {
  ["protocol"]=>
  string(5) "TLSv1"
  ["cipher_name"]=>
  string(20) "ECDHE-RSA-AES128-SHA"
  ["cipher_bits"]=>
  int(128)
  ["cipher_version"]=>
  string(11) "TLSv1/SSLv3"
}

Нові можливості для досконалої прямої секретності (PFS) для серверів, які обслуговують шифровані потоки

Шифровані потоки клієнта вже підтримують пряму таємність, оскільки вона, як правило, контролюється сервером. Сервери PHP, що обслуговують шифровані потоки, використовують сертифікати підтримують досконалу пряму секретність не потребують будь-яких додаткових дій для включення PFS; однак, було додано кілька нових опцій контексту SSL для більш точного контролю над PFS та для вирішення можливих проблем.

ecdh_curve

Ця опція дозволяє вибрати криву для використання у шифрах ECDH. Якщо не задано, то використовуватиметься prime256v1

dh_param

Шлях до файлу, що містить параметри для обміну ключами Діффі-Хеллмана, створеного, наприклад, за допомогою такої команди:

openssl dhparam -out /path/to/my/certs/dh-2048.pem 2048

single_dh_use

Если установлено как**true**, нова пара ключів буде створена, використовуючи параметри Діффі-Хеллмана, тим самим покращуючи пряму таємність.

single_ecdh_use

Если установлено как**true**, нова пара ключів буде генеруватися завжди, за узгодженням шифру ECDH. Це покращує пряму таємність.

Вибір версії SSL/TLS

Тепер можна вибирати конкретну версію SSL та TLS за допомогою опції контексту crypto_method або вказуючи конкретний транспорт під час створення обгортки потоку (наприклад, за допомогою виклику stream_socket_client() або stream_socket_server()

Опция контекста SSLcrypto_method приймає бітову маску, що перераховує допустимі протоколи, як і задається в параметрі crypto_type функції stream_socket_enable_crypto()

Вибрана версія протоколу та відповідні опції

ПротоколФлаг клиентаФлаг сервераТранспорт
Будь-які версії TLS або SSLSTREAM_CRYPTO_METHOD_ANY_CLIENTSTREAM_CRYPTO_METHOD_ANY_SERVERssl://
Будь-яка версія TLSSTREAM_CRYPTO_METHOD_TLS_CLIENTSTREAM_CRYPTO_METHOD_TLS_SERVERtls://
TLS 1.0STREAM_CRYPTO_METHOD_TLSv1_0_CLIENTSTREAM_CRYPTO_METHOD_TLSv1_0_SERVERtlsv1.0://
TLS 1.1STREAM_CRYPTO_METHOD_TLSv1_1_CLIENTSTREAM_CRYPTO_METHOD_TLSv1_1_SERVERtlsv1.1://
TLS 1.2STREAM_CRYPTO_METHOD_TLSv1_2_CLIENTSTREAM_CRYPTO_METHOD_TLSv1_2_SERVERtlsv1.2://
SSL 3STREAM_CRYPTO_METHOD_SSLv3_CLIENTSTREAM_CRYPTO_METHOD_SSLv3_SERVERsslv3://
Loading...

Добавлена функцияopenssl_get_cert_locations()

Була додана функція openssl_get_cert_locations(): вона повертає розташування, в яких PHP шукатиме пакети CA за замовчуванням.

Loading...

Результат виконання наведеного прикладу:

array(8) {
  ["default_cert_file"]=>
  string(21) "/etc/pki/tls/cert.pem"
  ["default_cert_file_env"]=>
  string(13) "SSL_CERT_FILE"
  ["default_cert_dir"]=>
  string(18) "/etc/pki/tls/certs"
  ["default_cert_dir_env"]=>
  string(12) "SSL_CERT_DIR"
  ["default_private_dir"]=>
  string(20) "/etc/pki/tls/private"
  ["default_default_cert_area"]=>
  string(12) "/etc/pki/tls"
  ["ini_cafile"]=>
  string(0) ""
  ["ini_capath"]=>
  string(0) ""
}

Підтримка SPKI

Було додано підтримку для створення, вилучення та перевірки підписаних публічних ключів та розпізнавальних рядків (SPKAC). Були додані функції openssl_spki_new() openssl_spki_verify() openssl_spki_export_challenge() і openssl_spki_export() для створення, перевірки експорту PEM публічних ключів та відповідних розпізнавальних рядків із SPKAC, створених з елементів HTML5 KeyGen

openssl_spki_new

Генерація нового SPKAC з використанням приватного ключа, розпізнавального рядка та алгоритму хешування.

Loading...

Результат виконання наведеного прикладу:

SPKAC=MIIBXjCByDCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA3L0IfUijj7+A8CPC8EmhcdNoe5fUAog7OrBdhn7EkxFButUp40P7+LiYiygYG1TmoI/a5EgsLU3s9twEz3hmgY9mYIqb/rb+SF8qlD/K6KVyUORC7Wlz1Df4L8O3DuRGzx6/+3jIW6cPBpfgH1sVuYS1vDBsP/gMMIxwTsKJ4P0CAwEAARYkYjViMzYxMTktNjY5YS00ZDljLWEyYzctMGZjNGFhMjVlMmE2MA0GCSqGSIb3DQEBAwUAA4GBAF7hu0ifzmjonhAak2FhhBRsKFDzXdKIkrWxVNe8e0bZzMrWOxFM/rqBgeH3/gtOUDRS5Fnzyq425UsTYbjfiKzxGeCYCQJb1KJ2V5Ij/mIJHZr53WYEXHQTNMGR8RPm7IxwVXVSHIgAfXsXZ9IXNbFbcaLRiSTr9/N4U+MXUWL7

openssl_spki_verify

Перевірка наданого SPKAC.

Loading...

openssl_spki_export_challenge

Експорт пов'язаного розпізнавального рядка із наданого SPKAC.

Loading...

Результат виконання наведеного прикладу:

challenge string

openssl_spki_export

Експорт публічного ключа (PEM) RSA у форматі SPKAC.

Loading...

Результат виконання наведеного прикладу:

-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDcvQh9SKOPv4DwI8LwSaFx02h7
l9QCiDs6sF2GfsSTEUG61SnjQ/v4uJiLKBgbVOagj9rkSCwtTez23ATPeGaBj2Zg
ipv+tv5IXyqUP8ropXJQ5ELtbXPUN/gvw7cO5EbPHr/7eMhbpw8Gl+AfWxW5hLW8
MGw/+AwwjHBOwong/QIDAQAB
-----END PUBLIC KEY-----