Oc-windows.ru

IT Новости из мира ПК
1 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Php ssl сертификат

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

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

Описание

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

Опции

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

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

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

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

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

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

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

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

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

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

Путь к локальному файлу с приватным ключем в случае отдельных файлов сертификата (local_cert) и приватного ключа.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Если указана строка ( 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 .

Примечания

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

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

Смотрите также

User Contributed Notes 7 notes

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:

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 barn»);
while($line = fgets($fp, 8192)) echo $line;

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.

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 ` cert.pem`.

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.

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

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).

SSL из PHP: socket и cURL

Сегодня, этим сонным летним утром, я расскажу вам про SSL соединение из PHP скрипта. Расскажу исходя не только лишь из теории, а ещё и решая вполне себе практическую задачу — логин на гугловский блогосервис blogger.com.

Начнём с сокетов. В хелпе заявлена возможность использования HTTPS протокола, поэтому пробуем. Набор POST переменных взят из developer’s guide. Хабрапарсер обрамляет мыло ссылкой, поэтому «@» заменена на (at).

В функции fsockopen в качестве префикса перед именем сервера используем не https, а ssl. Так прямым текстом написано в хелпе. Дальше всё просто. Формируем HTTP-header, и пихаем его в открытый сокет. Читаем ответ, и получаем

Короче, если опустить часовые мытарства и пляски вокруг функций сокета, у меня ничего не вышло. Ну то есть не вышло передать POST данные, хотя GET запросы возвращаются нормально. Может это связано только с гугловским сервером, а где-то в другом месте получится.

UPD. Огромное спасибо хабраюзеру anabolik, который подсказал что если изменить одну строку заголовка и сделать
$send .= «Content-type: application/x-www-form-urlencodedrn»;
то всё сразу заработает. Ещё раз спасибо. Отблагодарил всякими способами =).

Переходим ко второму способу.

Открываем страницу мана про cURL и радуемся. Столько возможностей для запросов, для всякого конфигурирования. Должно получиться. Итак, лезем в curl_setopt. Нам понадобятся
CURLOPT_URL — это URL запроса.
CURLOPT_POST — говорим, что будем посылать POST запрос.
CURLOPT_POSTFIELDS — собственно POST переменыые.
CURLOPT_RETURNTRANSFER — вернуть результат запроса, а не выводить в браузер.

Теперь собственно о SSL параметрах:
CURLOPT_SSL_VERIFYPEER — если поставить его в 0, то удалённый сервер не будет проверять наш сертификат. В противном случае необходимо этот самый сертификат послать.
CURLOPT_CAINFO — указывать файл сертификата, если CURLOPT_SSL_VERIFYPEER установлен в 1.
CURLOPT_SSLVERSION — целое число, указывает версию SSL (2 или 3), обычно определяется автоматически.
CURLOPT_SSL_VERIFYHOST — будет ли производиться проверка имени удалённого сервера, указанного в сертификате. Если установить значение «2», то будет произведена ещё и проверка соответствия имени хоста. (если честно, я так и не понял что делает этот флаг)

Вот и всё. Нам для гугла понадобится только указать, что мы с собой никаких сертификатов не принесли, пустите нас так пожалуйста. Пишем код.

$postvars = array(
«Email» => «mail(at)gmail.com»,
«Passwd» => «pass»,
«service» => «blogger»
);

$postdata = «»;
foreach ( $postvars as $key => $value )
$postdata .= «&».rawurlencode($key).»=».rawurlencode($value);
$postdata = substr( $postdata, 1 );

$ch = curl_init();
curl_setopt ($ch, CURLOPT_URL, «https://www.google.com/accounts/ClientLogin»);
curl_setopt ($ch, CURLOPT_POST, 1);
curl_setopt ($ch, CURLOPT_POSTFIELDS, $postdata);
curl_setopt ($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1);
$result = curl_exec ($ch);
curl_close($ch);

В переменной $result у нас теперь находятся три строки, из которых нужна только одна — последняя, которая начинается с «Auth=». Но про это, наверное, в следующий раз.

Настройка SSL сертификата Let’s Encrypt для Nginx

В этой статье мы рассмотрим, как настроить бесплатный TLS/SSL сертфикат Let’s Encrypt для сайта на веб-сервере Nginx на Linux CentOS. Покажем, как выпустить сертификат для одного домена (или wildecard SSL-сертификат для всех поддоменов), настроить конфигурацию Nginx, автопродление сертфикатов.

Установка клиента Let’s Encrypt в Linux, выпуск SSL сертфиката

Актуальную версию клиента Let’s Encrypt мы получим с Git. Для

развертывания проекта понадобится установить дополнительные утилиты:

# yum install git bc -y

Теперь можно клонировать проект Let’s Encrypt из GitHub:

# git clone https://github.com/letsencrypt/letsencrypt /opt/letsencrypt

Копия проекта будет размещена в директорию /opt/letsencrypt. Чтобы выпустить сертификат с помощью плагина webroot, нужно перейти в директорию с проектом и воспользоваться приложением letsencrypt-auto:

# cd /opt/letsencrypt
# ./letsencrypt-auto certonly -a webroot —webroot-path=/var/www/build-centos.info -d build-centos.info -d www.build-centos.info

В значении —webroot-path нужно указать корневую директорию вашего сайта (не забудьте изменить имя домена).

В процессе скрипт будет запрашивать у вас данные, email, имя сервера и тд.

Если у вас нет проблем с DNS-записями домена и веб-сервером, то SSL сертификат должен выпуститься без ошибок.

Решилось это, добавлением в конфигурационный файл nginx для моего домена, следующих строк:

После выпуска сертификата, файл сертификата и закрытый ключ сохраняются в директории /etc/letsencrypt/live/build-centos.info/.

Установка SSL сертификата Let’s Encrypt на веб-сайт Nginx

Чтобы SSL сертификат Let’s Encrypt заработал на вашем сайте, нужно использовать следующий конфигурационный файл nginx для вашего домена:

Сохраните конфигурационный файл. Выполняем проверку валидности настроек в конфигурационном файле nginx:

[root@server letsencrypt]# nginx -t

Перезапустите веб-сервер nginx:

# service nginx restart

Теперь, если открыть в браузере сайт по протоколу https, высвечиваться значок защищенного соединения.

Если щёлкнуть по значку сертификата, можно получить полную информацию о нем:

Бесплатные Wildcard SSL сертификаты Let’s Encrypt для поддоменов

Чтобы выпустить wildcard сертификат Let’s Encrypt для всех поддоменов, используется другая команда. Кроме того, в DNS настройках вашего домена нужно создать специальную txt-запись. Чтобы выпустить wildcard сертификат для поддоменов, в директории /opt/letsencrypt/ запустите команду:

# ./letsencrypt-auto certonly -d *.build-centos.info -m admin@build-centos.info –server https://acme-v02.api.letsencrypt.org/directory —manual

После запуска команды, вам нужно будет пройти всю процедуру валидации домена, в том числе нужно будет создать специальную TXT запись в DNS.

Не нажимайте “Enter” пока не убедитесь, что запись доступна на глобальных DNS. В панели регистратора домена создайте DNS запись типа TXT с именем _acme-challenge и значением, скопированным из консоли certbot.

Дождитесь обновления информации в DNS, нажмите Enter и wildcard SSL сертификат будет успешно выпущен:

Директория хранения сертификатов и ключей в этом случае отличается от той, в который помещен сертификат для основного домена.

Проверим, работает ли сертификат на поддомене test.build-centos.info:

Как видно из скриншота, сертификат выпущен корректно и действителен для всех поддоменов.

Продление сертификатов Let’s Encrypt

Сертификаты Let’s Encrypt выдаются на 90 дней, рекомендуется продлевать эти сертификаты каждые 60 дней.

Чтобы перевыпустить устаревший SSL сертификат Let’s Encrypt, используется команда:

Запускается она так же из директории /opt/letsencrypt.

Если запустить команду сразу после того, как вы выпустили сертификаты, появится уведомление, что сертификат не требует перевыпуска:

Чтобы продление SSL сертификата Let’s Encrypt выполнялось автоматически, нужно добавить задание в cron:

00 00 * * 6 /opt/letsencrypt/letsencrypt-auto renew >> /var/log/le-renew.log
15 00 * * 6 /usr/bin/systemctl reload nginx

Данный cron job будет пытаться каждую субботу продлить сертификата и выполнять мягкую перезагрузку веб-сервера nginx. Все действия по перевыпуску SSL сертификатов будут фиксироваться в лог файле /var/log/le-renew.log.

Все логи Let’s Encrypt хранятся в директории /var/log/letsencrypt.

Не забывайте, что можно и нужно обновлять сам проект Let’s Encrypt. Туда добавляются все обновления от разработчиков проекта:

# cd /opt/letsencrypt
# git pull

Таким образом, мы установили бесплатный SSL сертификат Let’s Encrypt на свой web-сайт, работающий на Nginx.

Как установить SSL на хостинг

Убедитесь, что заказали хостинг в REG.RU

Прежде чем приступить к установке SSL-сертификата на сайт, закажите хостинг.

В инструкции описана установка SSL в интерфейсе REG.RU. Она не подойдет, если вы используете услугу другого хостинг-провайдера.

Как сделать сайт защищенным? Протокол HTTPS: как подключить его к сайту? Пошаговая инструкция приведена в статье: Как перевести сайт на HTTPS? В этой статье мы расскажем об одном из этапов — установке SSL-сертификата.

Перед установкой SSL перейдите к списку услуг в Личном кабинете, кликните по строке нужного SSL-сертификата и убедитесь, что статус услуги «Активна».

Если услуга неактивна, используйте инструкции в зависимости от типа сертификата:

Установка SSL-сертификата

В статье описан процесс установки сертификата на хостинг. Если вы хотите установить SSL на услуги другого типа, воспользуйтесь справочными статьями:

В REG.RU вы можете установить SSL-сертификат на хостинг двумя способами:

  • Автоматически в Личном кабинете — если заказали бесплатный SSL-сертификат;
  • Вручную в хостинг-панели управления — если заказали платный SSL-сертификат.

Автоматическая установка в ЛК

Кликните по строке нужного SSL-сертификата:

Нажмите Установить на вкладке «Управление»:

На открывшейся странице выберите сертификат, купленный в REG.RU, и приложите файл с приватным ключом в формате .txt или .key: Где взять приватный ключ установки SSL-сертификата. Затем выберите услугу хостинга, на которую хотите установить сертификат, и нажмите Отправить заявку на установку:

Готово! После установки вы получите уведомление на контактный e-mail.

Ручная установка в панели хостинга

Чтобы установить SSL-сертификат, войдите в вашу панель управления (ISPmanager, cPanel или Plesk*) и следуйте соответствующей инструкции ниже:

Перейдите в раздел «SSL-сертификаты» и нажмите Создать:

Выберите тип сертификата «Существующий» и нажмите Далее:

Заполните поля на открывшейся странице. Данные для установки сертификата высылаются на почту после активации услуги: Где взять данные для установки SSL-сертификата.

  • Имя SSL-сертификата — введите любое имя, под которым сертификат будет отображаться в панели управления (можно использовать только латиницу);
  • SSL-сертификат — вставьте данные SSL-сертификата (в информационном письме он находится после слов «Ваш сертификат предоставлен ниже»);
  • Ключ SSL-сертификата — вставьте приватный ключ сертификата;
  • Цепочка SSL-сертификатов — вставьте сначала промежуточный сертификат, а затем с новой строки без пробела — корневой.

После завершения установки перейдите в раздел «WWW-домены», дважды кликните по домену, для которого выпускался сертификат:

Поставьте галочку напротив Защищенное соединение (SSL). В раскрывающемся списке напротив SSL-сертификат выберите имя SSL-сертификата, установленного в 4 шаге. Затем нажмите Оk внизу страницы:

Готово! SSL-сертификат установлен. Проверка сертификата (HTTPS) на корректность установки осуществляется по инструкции ниже.

В блоке «Безопасность» нажмите SSL/TLS:

Нажмите Управление сайтами с SSL:

В раскрывающемся списке выберите домен, для которого устанавливаете SSL-сертификат:

Заполните поля. Данные для установки сертификата высылаются на почту после активации услуги: Где взять данные для установки SSL-сертификата.

  • Сертификат: (CRT) — вставьте SSL-сертификат (в информационном письме он находится после слов «Ваш сертификат предоставлен ниже»);
  • Закрытый ключ (KEY) — вставьте приватный ключ сертификата;
  • Пакет центра сертификации: (CABUNDLE) — вставьте сначала промежуточный сертификат, а затем с новой строки без пробела — корневой

Нажмите кнопку Установить сертификат:

Чтобы завершить установку, нажмите в появившемся окне:

В разделе «Сайты и домены» выберите блок того домена, для которого выпускался SSL-сертификат, и нажмите SSL/TLS-сертификаты:

Нажмите Добавить SSL/TLS-сертификат:

Заполните поля на открывшейся странице. Данные для установки сертификата высылаются на почту после активации услуги: Где взять данные для установки SSL-сертификата?

  • Имя сертификата — введите любое имя, под которым сертификат будет отображаться в панели управления (можно использовать только латиницу);
  • Закрытый ключ (.key) — вставьте приватный ключ сертификата;
  • Сертификат (.crt) — вставьте сам SSL-сертификат (в информационном письме он находится после слов «Ваш сертификат предоставлен ниже»);
  • Корневой сертификат (-ca.crt) — вставьте сначала промежуточный сертификат, а затем с новой строки без пробела — корневой.

Нажмите Загрузить сертификат:

После установки сертификата в панели появится уведомление о том, что нужно привязать SSL-сертификат к домену. Чтобы сделать это, вернитесь в раздел «Сайты и домены» и нажмите Настройки хостинга:

В блоке «Безопасность» поставьте галочку напротив Поддержка SSL/TLS. Выберите в выпадающем списке имя сертификата, установленного в 4 шаге. Нажмите Применить внизу страницы:

Готово! SSL-сертификат установлен. Проверить наличие SSL-сертификата на сайте можно по инструкции.

Как проверить правильность установки SSL-сертификата?

Проверка SSL-сертификата на корректность установки производится с помощью сервиса sslshopper.com.

Проверить SSL-сертификат сайта онлайн можно по инструкции ниже:

При корректной установке SSL-сертификата вы увидите примерно такой результат:

В некоторых случаях результаты проверки кэшируются, и отображаются устаревшие данные. Об этом свидетельствует текст под строкой поиска. Чтобы получить актуальную информацию об установке SSL-сертификата, перейдите по ссылке clicking here и пройдите CAPTCHA-тест:

Если сертификат установлен некорректно, свяжитесь со службой технической поддержки.

Читать еще:  Install index php
Ссылка на основную публикацию
Adblock
detector