Как создавать надежные ssl-сертификаты для локальной разработки

Express.js

const https = require("https");const fs = require("fs");const express = require("express");// прочитайте ключиconst key = fs.readFileSync("localhost.key");const cert = fs.readFileSync("localhost.crt");// создайте экспресс-приложениеconst app = express();// создайте HTTPS-серверconst server = https.createServer({ key, cert }, app);// добавьте тестовый роутapp.get("/", (req, res) => {  res.send("this is an secure server");});// запустите сервер на порту 8000server.listen(8000, () => {  console.log("listening on 8000");});

Как только вы настроите обслуживающий ваше приложение инструмент на работу с вашим сертификатом, ваше приложение будет доступно по URL’у с HTTPS.

Следуя приведенному выше примеру с Express, вы можете открыть вкладку браузера по адресу https://localhost:8000 и увидеть ваш контент:

Погодите секунду! Где же сообщение «это защищенный сервер»?

Вы рассчитывали увидеть кое-что другое, но именно этого и следовало ожидать — потому что источник сертификата еще не входит в число доверенных.

Доверие к сертификатам

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

Для чего необходим SSL-сертификат

Наверняка вы замечали, что адреса некоторых сайтов начинаются буквами http, а некоторые — https. И то, и другое указывает на протокол передачи данных, то есть ряд правил, по которым браузер и сервер обмениваются информацией. 

Передача данных по протоколу http происходит в открытом виде. Рассмотрим на примере: когда вы покупаете что-то онлайн и вводите данные банковской карты, браузер сообщает их серверу. Если сайт работает по http-соединению, данные, которые вы указали, никак не защищены, а это значит, что злоумышленник может получить к ним доступ и расплатиться вашей картой в интернете. 

Чтобы таких ситуаций не происходило, было создано специальное расширение для протокола http, отвечающее за защиту передаваемых данных — https. Чтобы эту защиту обеспечить, данные необходимо зашифровать — вот для чего нужен SSL-сертификат.

Меры безопасности в TLS[править]

  • Защита от downgrade-атаки — понижения версии протокола к предыдущей (менее защищённой) версии или менее надёжному алгоритму шифрования;
  • Нумерация последовательных записей приложения и использование порядкового номера в коде аутентификации сообщения (MAC);
  • Использование ключа в идентификаторе сообщения (только владелец ключа может сгенерировать код аутентификации сообщения).
  • Сообщение, которым заканчивается подтверждение связи («Finished»), содержит хэш всех handshake-сообщений, отправленных обеими сторонами, что позволяет проверить подлинность выбранных параметров TLS-соединения.
  • Псевдослучайная функция делит подаваемые ей на вход данные пополам, применяет к половинкам разные хэш-алгоритмы (MD5 и SHA-1), а затем XOR’ит результаты для получения MAC. Это повышает безопасность в случае, если в одном из алгоритмов обнаружится уязвимость.

Ключевые отличия SSL и TLS[править]

  • Аутентификация сообщений: в TLS используется HMAC, работающий с любой хэш-функцией (а не только с MD5 или SHA, как в SSL).
  • Генерация ключа: в TLS при создании ключа используется псевдослучайная функция стандарта HMAC; в SSL — RSA, Diffie-Hellman или Fortezza/DMS.
  • Проверка сертификата: в SSL проверка требует передачи сложной последовательности сообщений; в TLS информация о проверке полностью передается в сообщениях во время handshake.
  • Методы шифрования: SSL поддерживает только алгоритмы RSA, Diffie-Hellman и Fortezza/DMS. В TLS отказались от поддержки Fortezza/DMS, но возможно добавление новых методов шифрования в последующих версиях.

Создание файла цепочки сертификатов

Когда приложение (например, веб-браузер) пытается проверить сертификат, подписанный промежуточным центром сертификации, оно также должно проверить промежуточный сертификат от корневого центра сертификации. Для выполнения проверки цепочки доверия создадим цепочку сертификатов центра сертификации для предоставления приложениям.

Чтобы создать цепочку сертификатов требуется объеденить промежуточные и корневые сертификаты вмете. Позже мы будем использовать этот файл для проверки сертификатов подписанных промежуточным центром сертификации.

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

Подписывание серверного и клиентского сертификатов

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

Указанные ниже шаги с вашей точки сзрения, где вы выступаете в качестве центра сертификации. Стороннее лицо, однако, вместо этого может создать свой собственный частный ключ и запрос на подпись сертификата (CSR) без раскрытия вам своего частного ключа. Они дают вам собственный CSR, а вы отдаете им подписанный сертификат. В этом случае, пропустите команды genrsa и req.

Технология SSL/TLS и ее роль в безопасности сайта

SSL (Secure Sockets Layer) и TLS (Transport Layer Security) — стандартизированная технология шифрования, которая защищает передаваемые сайтом и сайту данные. Она напрямую связана с HTTPS (Hypertext Transfer Protocol Secure): если сайт использует HTTPS-подключение, это значит, что данные передаются по протоколу SSL или TLS.

SSL была представлена в 1995 году и обновлена до TLS в 1999-м — технология видоизменялась, реагируя на новые уязвимости. Протоколы постоянно обновляются и большинство их предыдущих версий считаются устаревшими

Важно следить за обновлениями и использовать самую актуальную версию SSL/TLS

Защита Wi-Fi сети: WEP, WPA, WPA2

Есть три варианта защиты. Разумеется, не считая «Open» (Нет защиты).

  • WEP (Wired Equivalent Privacy) – устаревший и небезопасный метод проверки подлинности. Это первый и не очень удачный метод защиты. Злоумышленники без проблем получают доступ к беспроводным сетям, которые защищены с помощью WEP. Не нужно устанавливать этот режим в настройках своего роутера, хоть он там и присутствует (не всегда).
  • WPA (Wi-Fi Protected Access) – надежный и современный тип безопасности. Максимальная совместимость со всеми устройствами и операционными системами.
  • WPA2 – новая, доработанная и более надежная версия WPA. Есть поддержка шифрования AES CCMP. На данный момент, это лучший способ защиты Wi-Fi сети. Именно его я рекомендую использовать.

WPA/WPA2 может быть двух видов:

  • WPA/WPA2 — Personal (PSK) – это обычный способ аутентификации. Когда нужно задать только пароль (ключ) и потом использовать его для подключения к Wi-Fi сети. Используется один пароль для всех устройств. Сам пароль хранится на устройствах. Где его при необходимости можно посмотреть, или сменить. Рекомендуется использовать именно этот вариант.
  • WPA/WPA2 — Enterprise – более сложный метод, который используется в основном для защиты беспроводных сетей в офисах и разных заведениях. Позволяет обеспечить более высокий уровень защиты. Используется только в том случае, когда для авторизации устройств установлен RADIUS-сервер (который выдает пароли).

Думаю, со способом аутентификации мы разобрались. Лучшие всего использовать WPA2 — Personal (PSK). Для лучшей совместимости, чтобы не было проблем с подключением старых устройств, можно установить смешанный режим WPA/WPA2. На многих маршрутизаторах этот способ установлен по умолчанию. Или помечен как «Рекомендуется».

Как решить проблему с параметрами безопасности TLS

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

  • Для антивируса Avast — откройте настройки, выберите раздел «Активная защита», нужный пункт должен быть возле пиктограммы щитка. Уберите с него галочку и включите HTTP сканирование. Сохраните настройки;
  • Для антивируса Kaspersky — найдите раздел «не проверять защищенное соединение». Его можно найти во вкладке «Сканирование». Или в дополнительных настройках найдите «Установить сертификат». Сохраните настройки и перезагрузите ПК.


В антивирусе Avast включаем сканирование HTTPS
В антивирусе Kaspersky устанавливаем сертификат

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

  1. Для этого нажмите WIN+R и введите команду «services.msc»;
  2. Нажмите ENTER;
  3. Найдите в списке служб Windows «Центр обновления»;
  4. Нажмите правой кнопкой мыши на этой строке и выберите «Свойства»;
  5. В открывшемся окошке убедитесь, что установлено значение в блоке «Тип запуска» — «Автоматически»;
  6. Далее выберите кнопку «Пуск», «Панель управления»;
  7. Выберите «Система и безопасность»;
  8. Затем «Центр обновления» и нажмите кнопку «Проверить обновления».


Проверяем последние обновления в Windows

Если существуют обновления для вашей операционной системы, они будут найдены и загружены. После этого нужно перезагрузить компьютер и дождаться завершения установки ПО. Затем снова попробуйте проверить, появляется ли сообщение — возможно, на данном сайте используется ненадежные параметры безопасности передачи данных по TLS.

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

Теперь рассмотрим, что делать, если в вашем компьютере поселился вирус, который блокирует безопасное соединение. Для начала попробуйте открыть установленный на вашем компьютере антивирус и запустите разные типы сканирования: «Полное сканирование», «Быстрое», «Интеллектуальное» и др. Попробуйте сканировать не только весь жесткий диск, но и отдельные тома и папки. Проверьте папки, в которых находятся файлы вашего браузера.


Утилита Dr.Web-CureIt для сканирования ПК на вирусы

Если это не дало результатов, воспользуйтесь специальными утилитами, которые предназначены для разового сканирования и поиска вредоносного программного обеспечения. Практически каждый разработчик полноценного антивирусного ПО (Dr.WEB, Kaspersky, ESET и др.) имеет специальную утилиту, которую можно взять на официальном сайте. Это по размеру небольшие программы, которые не нужно устанавливать на диск. Их достаточно запустить и указать путь для сканирования. Обязательно воспользуйтесь этим эффективным инструментом.

Ошибки «Invalid CSR» при генерации сертификата из панели управления облачного провайдера

В процессе активации сертификата можно столкнуться с ошибкой «Invalid CSR». Такая ошибка возникает по следующим причинам:

  • Неправильное имя FQDN (полное имя домена) в качестве Common Name (в некоторых панелях управления это поле может также называться Host Name или Domain Name). В этом поле должно быть указано полное доменное имя вида domain.com или subdomain.domain.com (для субдоменов). Имя домена указывается без https://. В качестве данного значения нельзя использовать интранет-имена (text.local). В запросе для wildcard-сертификатов доменное имя необходимо указывать как *.domain.com.
  • В CSR или пароле есть не латинские буквы и цифры. В CSR поддерживаются только латинские буквы и цифры – спецсимволы использовать запрещено. Это правило распространяется и на пароли для пары CSR/RSA: они не должны содержать спецсимволов.
  • Неверно указан код страны. Код страны должен быть двухбуквенным ISO 3166-1 кодом (к примеру, RU, US и т.д.). Он указывается в виде двух заглавных букв.
  • В управляющей строке не хватает символов. CSR-запрос должен начинаться с управляющей строки ——BEGIN CERTIFICATE REQUEST—— и заканчиваться управляющей строкой ——END CERTIFICATE REQUEST——. С каждой стороны этих строк должно быть по 5 дефисов.
  • В конце или начале строки CSR есть пробелы. Пробелы на концах строк в CSR не допускаются.
  • Длина ключа меньше 2048 бит. Длина ключа должна быть не менее 2048 бит.
  • В CRS-коде для сертификата для одного доменного имени есть SAN-имя. В CSR-коде для сертификата, предназначенного защитить одно доменное имя, не должно быть SAN (Subject Alternative Names). SAN-имена указываются для мультидоменных (UCC) сертификатов.
  • При перевыпуске или продлении сертификата изменилось поле Common Name. Это поле не должно меняться.

«Прослушка» информации о сертификате при помощи openssl

Для проверки взаимодействия сервера с клиентскими сертификатами можно проверить, устанавливается ли соединение с использованием TLS/SSL.

На стороне сервера запускаем прослушку порта при помощи openssl:

openssl s_server -accept 443 -cert server.pem -key server.key -state

На стороне клиента обращаемся к серверу, например, culr’ом:

curl -k https://127.0.0.1:443

В консоли со стороны сервера можно наблюдать процесс обмена информацией между сервером и клиентом.

Можно также использовать опции -verify и -Verify . Опция с маленькой буквы запрашивает у клиента сертификат, но он не обязан его предоставлять. С большой буквы — если сертификат не предоставлен, возникнет ошибка. Запустим прослушку со стороны сервера таким образом:

openssl s_server -accept 443 -cert server.pem -key server.key -state -Verify 3

Со стороны сервера ошибка выглядит так:

140203927217808:error:140890C7:SSL routines:SSL3_GET_CLIENT_CERTIFICATE:peer did not return a certificate:s3_srvr.c:3287:

Со стороны клиента так:

curl: (35) error:14094410:SSL routines:SSL3_READ_BYTES:sslv3 alert handshake failure

Добавим с клиентской стороны сертификат и доменное имя (можно для проверки вписать в файл /etc/hosts имя хоста для адреса 127.0.0.1):

curl https://www.mycompany.com:443 --cacert root.pem --cert client.pem --key client.key

Теперь соединение пройдет успешно и можно устанавливать серверный сертификат на веб-сервер, клиентский отдать клиенту, и работать с ними.

Firefox

Даже после того, как вы установите доверенный источник сертификата в хранилище, Firefox все равно будет выдавать предупреждения. Этого может не случиться в Windows 10, но почти наверняка случится в macOS. Справиться с этим достаточно просто. Firefox демонстрирует вот такой экран:

Чтобы добавить разрешения сертификату, кликните «Дополнительно…». Сразу же после этого кликните на «Принять риск и продолжить», чтобы дать понять, что вы знаете о риске.

Это нужно сделать всего один раз, но для каждого локального домена.

Заключение

Теперь, когда сертификат создан и доверие к нему обеспечено, вы без проблем можете посещать свой локальный домен! Обслуживание приложений стало безопасным, и вы можете спокойно продолжать разработку. Возвращаясь к примеру с Express, результат на экране будет таким:

Сайт полностью загружен, и рядом с URL в Chrome теперь отображается символ безопасного соединения.

Надеюсь, эта статья помогла вам превозмочь трудности с HTTPS.

Удачного программирования!

  • Как исправить ошибки сертификатов в Node-приложениях при работе с SSL
  • Как установить несколько версий Python в WSL2 и управлять ими
  • Работа с HTML и CSS: 10 полезных приемов для дизайнеров

Читайте нас в Telegram, VK и

Регистрация на портале

Сертификат выдается при регистрации в системе

  • Получаем список подключенных к компьютеру устройств Рутокен ЭЦП
  • Генерируем ключевую пару ГОСТ Р 34.10-2001 на выбранном Рутокен ЭЦП
  • Cоздаем запрос PKCS#10 на сертификат для сгенерированной ключевой пары
  • Отправляем запрос на сервер
  • На сервере создаем сертификат, привязываем к аккаунту (сам сертификат или его дескриптор). Следует отметить, что дескрипторы сертификатов, полученные при вызове функции enumerateCertificates, являются уникальными и неизменными
  • Отправляем сертификат на клиент
  • На клиенте визуализируем полученный сертификат
  • Импортируем полученный сертификат в Рутокен ЭЦП

Сертификат уже имеется на токене, выдан внешним УЦ

  • Получаем список подключенных к компьютеру устройств Рутокен ЭЦП
  • Получаем список всех имеющихся пользовательских сертификатов на выбранном Рутокен ЭЦП
  • Визуализируем каждый сертификат
  • Пользователь выбирает нужный сертификат
  • Сервер формирует начальную последовательность случайных данных (строку salt) и отправляет ее на клиент
  • Вызываем на клиенте . При передаче salt в функцию плагина authenticate данная последовательность дополняется дополнительными случайными данными размером в 32 символа, и происходит подпись итоговой последовательности на выбранном пользователем сертификате в формате CMS attached
  • Подпись отправляется на сервер
  • На сервере происходит проверка CMS attached подписи с использованием корневого сертификата
  • Из CMS attached сообщения извлекается итоговая случайная последовательность, “отсоединяется” salt и происходит сравнение
  • Если сравнение успешно, то регистрируем пользователя по сертификату, который содержится в CMS attached сообщении

Шифрование[править]

Существует два основных способа шифрования данных: симметричный ключ (общий секретный ключ) и асимметричный ключ (открытый ключ).

Открытый ключправить

Суть асимметричного шифрования заключается в том, что используется пара ключей. Один из них используется в качестве открытого (как правило, он публикуется в самом сертификате владельца), второй ключ называется секретным — он держится в тайне и никогда никому не открывается. Оба ключа работают в паре: один используется для запуска противоположных функций другого ключа. Если открытый ключ используется для того, чтобы зашифровать данные, то расшифровать их можно только секретным ключом и наоборот. Такая взаимосвязь позволяет делать две важные вещи.

Любой пользователь может получить открытый ключ по назначению и использовать его для шифрования данных, расшифровать которые может только пользователь, владеющий секретным ключом. (RSA)

Если заголовок шифрует данные, используя свой секретный ключ, каждый может расшифровать данные, используя соответствующий открытый ключ. Именно это является основой для цифровых подписей. (DSA)

RSA — самый распространенный алгоритм шифрования с использованием асимметричных ключей.

Комбинированный подходправить

Алгоритмы симметричного шифрования часто включают установленное число добавок и сдвигов. Такие алгоритмы часто используют ключ для помощи при битовых манипуляциях или для того, чтобы шифруемые данные стали более случайными. Другими словами, при увеличении размера секретного ключа может увеличиться случайность шифруемых данных, но не обязательно возрастет сложность вычислений при расшифровке.
Однако, шифрование открытым ключом использует ключ как экспоненту, поэтому значительное увеличения ключа сильно увеличивает количество вычислений, требуемых для шифрования / дешифрования данных.

Таким образом хотя алгоритмы шифрования открытым ключом не сталкиваются с проблемой распределения, с которой сталкиваются алгоритмы шифрования секретным ключом, они требует значительно больше вычислительной мощности. Для использования сильных сторон обоих типов алгоритмов протоколы безопасности обычно используют шифрование открытым ключом для передачи секретных ключей. Как только секретный ключ доставлен начинается передача данных с использованием симметричного шифрования.

Ошибки конфигурирования сетей

  1. Излишне «доверительные» отношения между подсетями. Сюда относятся проблемы разграничения доступа между подсетями, при которых становится возможен несанкционированный сетевой доступ между внутренними подсетями организации. В результате злоумышленник при компрометации небольшой части сети может беспрепятственно взять под контроль ключевые узлы всей сети.
  2. Доступ узлов инфраструктуры ко внешним DNS-серверам. При использовании внутренней системы доменных имен DNS-запросы должны обрабатываться только на собственных DNS-серверах организации. Если DNS на клиентах сконфигурирован неверно, в случае запроса к публичному DNS-серверу существует риск утечки внутренних доменных имен, а также обход фильтрации известных адресов командных серверов вредоносного ПО.
  3. Открытые для внешней сети «наружу» сетевые порты и сервисы порты без необходимости в этом (например, базы данных). Вследствие у злоумышленника появляются большие возможности для проведения атаки. Например, из-за хранения сведений в незащищенной базе данных, в сеть утекли данные пациентов скорой помощи из Подмосковья.

воспользовались

  1. Настроить Access Control List (ACL) на сетевом оборудовании для корректного разграничения прав доступа между подсетями. ACL — это набор разрешающих или запрещающих правил для сетевого трафика (в контексте сетевого оборудования). В большинстве случаев списки доступа применяют для пакетной фильтрации на границе интернета и частной сети, однако фильтрация может также потребоваться на границе DMZ и других подсетей.
  2. Настроить межсетевой экран. Межсетевые экраны также должны быть настроены не только на границе с внешней сетью, но и между внутренними подсетями организации.
  3. Запретить изменения сетевых настроек пользователей. Для этого настройте параметр в групповых политиках Windows: «User Configuration -> Administrative Templates -> Network -> Network Connections».

Клиентский сертификат

Клиентский сертификат может быть сгенерирован как для использования в устройствах, так и для использования пользователями. Обычно такие сертификаты используются при двусторонней верификации, когда клиент верифицирует, что сервер действительно тот, за кого себя выдает, и сервер в ответ делает то же самое. Такое взаимодействие называется двусторонней аутентификацией или mutual authentication. Двусторонняя аутентификация позволяет повысить уровень безопасности по сравнению с односторонней, а также может служить заменой аутентификации с использованием логина и пароля.

2: Настройка Nginx для поддержки SSL

Итак, на данном этапе ключ и сертификат созданы и хранятся в каталоге /etc/ssl. Теперь нужно отредактировать настройки Nginx:

  1. Создать сниппет, указывающий место хранения файлов SSL-сертификата и ключа.
  2. Добавить настройки SSL.
  3. Настроить блоки server для обслуживания запросов SSL и поддержки новых настроек.

Местонахождение ключа и сертификата

Создайте новый сниппет Nginx в каталоге /etc/nginx/snippets.

Рекомендуется указать в названии файла его назначение (к примеру, self-signed.conf):

В этот файл нужно добавить директиву ssl_certificate, которая будет указывать путь к сертификату, и директиву ssl_certificate_key, которая задаёт путь к соответствующему закрытому ключу.

Настройка SSL

Теперь нужно создать другой сниппет, предназначенный для настроек SSL. Он позволит серверу Nginx использовать надёжный механизм шифрования и включит некоторые дополнительные функции безопасности.

Эти установленные параметры можно повторно использовать в будущих конфигурациях Nginx, потому этому файлу лучше дать какое-нибудь общее имя:

Для безопасной настройки SSL обратимся к рекомендациям Remy van Elst на сайте Cipherli.st. Этот сайт предназначен для распространения простых и надёжных параметров шифрования для популярного программного обеспечения. Больше параметров для Nginx можно найти здесь.

Скопируйте все предложенные параметры. Остаётся только добавить в них DNS распознаватель для восходящего канала запросов. В руководстве для этого используется Google.

Также нужно добавить параметр ssl_dhparam, чтобы настроить поддержку ключей Диффи-Хеллмана.

Примечание: Поскольку сертификат является самоподписанным, SSL stapling не будет использоваться. Nginx выдаст предупреждение, отключит stapling для данного сертификата и продолжит работу.

Сохраните и закройте файл.

Настройка Nginx для поддержки SSL

Примечание: В руководстве предполагается, что вы используете виртуальный хост (блок server) default, который хранится в каталоге /etc/nginx/sites-available. Если вы используете другой файл, пожалуйста, укажите его имя.

Для начала создайте резервную копию файла блока server.

Затем откройте файл блока server в текстовом редакторе:

Файл должен выглядеть примерно так:

Теперь нужно отредактировать настройки, чтобы незашифрованные запросы HTTP были автоматически перенаправлены на HTTPS. Если вы хотите поддерживать и HTTP, и HTTPS, используйте альтернативный вариант настроек, о котором речь пойдёт ниже.

Настройки нужно разделить на два отдельных блока. После двух директив listen будет идти директива server_name, в которой нужно указать доменное имя или IP. После этого нужно настроить переадресацию на второй блок server.

Примечание: Во время настройки рекомендуется использовать временный редирект 302. Убедившись в правильности настроек, можно включить постоянный редирект 301.

Ниже нужно добавить новый блок server и поместить в него оставшиеся настройки. Раскомментируйте директивы listen, которые используют порт 443. Затем добавьте директиву http2, которая отвечает за поддержку HTTP/2. После этого нужно просто выключить в файл созданные ранее сниппеты.

Примечание: В файле может быть только одна директива listen, включающая модификатор default_server для комбинаций IP и портов. Если модификатор default_server встречается в нескольких блоках server, оставьте его только в одном блоке, а из остальных удалите.

Сохраните и закройте файл.

Альтернативный вариант настройки: поддержка HTTP и HTTPS

Чтобы сайт поддерживал и HTTP, и HTTPS, используйте описанные в этом разделе настройки. Имейте в виду: такой вариант настройки использовать не рекомендуется.

В целом нужно только объединить два отдельных блока server в один блок и удалить редирект.

Сохраните и закройте файл.

Рейтинг
( Пока оценок нет )
Понравилась статья? Поделиться с друзьями:
Ваша ОС
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: