Софт

Win32openssl

Рейтинг: 4.0/5.0 (520 проголосовавших)

Категория: Windows

Описание

Самостоятельная генерация сертификата

Самостоятельная генерация сертификата

  1. Скачиваем инсталлятор openssl с сайта openssl.org (для Windows). Устанавливаем openssl, если при установке openssl на Windows он потребует Microsoft Redistributables Package, то предварительно, скачиваем и устанавливаем соответствующий пакет.

Например, на данный момент доступна версия openssl v1.0.1c и соответствующий ему Visual C++ 2008 Redistributables (x86/x64) по следующим ссылкам: openssl и Redistributables

  • После установки openssl запускаем командную строку cmd и выполняем следующие команды, предварительно перейдя в каталог bin установленного openssl (по умолчанию c:\OpenSSL-Win32\bin ):
    • Указываем путь к конфигурации openssl:
      set OPENSSL_CONF=C:\OpenSSL-Win32\bin\openssl.cfg ;
    • Генерируем приватный ключ (в процессе генерации приватного ключа необходимо задать пароль):
      openssl genrsa -des3 -out c:\certificate\private.key 2048 ;
    • Генерируем запрос на сертификат:
      openssl req -new -key c:\certificate\private.key -out c:\certificate\csr.csr
      В процессе генерации запроса будут запрошены параметры для сертификата, которые необходимо вводить в латинской раскладке.
      Достаточными являются:
      - Country Name (2 letter code) [AU] - страна регистрации организации, для которой готовим сертификат (для Росcии - RU)
      - State or Province Name (full name) [Some-State] - область, регион регистрации организации (Москва - Moscow)
      - Locality Name (eg, city) [] - город регистрации организации (Москва - Moscow)
      - Organization Name (eg, company) [Internet Widgits Pty Ltd] - наименование организации
      - Common Name (e.g. server FQDN or YOUR name) [] - доменное имя, для которого генерируется сертификат (в данном случае может не совпадать с действительным доменным именем) (localhost, companyname.com)
    • Генерируем сам сертификат сроком на 365 дней (можно больше или меньше):
      openssl x509 -req -days 365 -in c:\certificate\csr.csr -signkey c:\certificate\private.key -out c:\certificate\certificate.pem

    В результате в каталоге c:\certificate будет создан приватный ключ (private.key) и сертификат (certificate.pem), который, в случае самостоятельно генерируемого сертификата, будет являться и сертификатом центра сертификации.

    Для того чтобы браузер не выдавал предупреждения по поводу недостоверности сертификата, можно установить сертификат (certificate.pem) в систему (предварительно поменяв его расширение на.crt) или в браузер, если он использует собственное хранилище сертификатов.

  • Win32openssl:

  • скачать
  • скачать
  • Другие статьи, обзоры программ, новости

    Создание сертификатов RSA в OpenSSL под Windows

    Втр, 23/02/2010 - 23:14

    Для интеграции сайта на Drupal (как и любого другого) со службами Google App нам необходимо сгенерировать пару ассиметричных ключей шифрования и создать сертификат X.509.
    Для выполнения данной задачи я воспользовался программой OpenSSL (версия для Windows).
    Итак, ниже приведена пошаговая инструкция:

    1. Скачиваем средство OpenSSL для Windows с сайта slproweb.com. Я скачал версия для Win32 полную (около 7МБ). Оттуда же скачиваем Visual C++ 2008 Redistributables, так как он потребуется для установки OpenSSL;
    2. Устанавливаем Visual C++ 2008 Redistributables и OpenSSL на компьтер. Запускаем файл openssl.exe из папки bin в директории, куда установился OpenSSL. Должно появиться окно с командной строкой OpenSSL, куда будем вводить последующие команды;
    3. Генерируем секретный ключ RSA. openssl> genrsa -out privateRSA.pem 1024 (где после слова -out указываем полный путь к файлу с секретным ключом);
    4. Генерируем по готовому секретному ключу открытый ключ. openssl> rsa -in privateRSA.pem -pubout -out publicRSA.pem (параметр -pubout указывает, что никакие изменения в формате ключа проводить не надо);
    5. Создаем сертификат, содержащий открытый ключ. openssl> req -new -x509 -key privateRSA.pem -out cert.pem (хотя сертификат будет содержать публичный ключ, в параметре -key указываем секретный, иначе OpenSSL выдает ошибку);

    * В инструкции модуля Grupal приведена следующая команда, генерирующая и сертификат и ключ для работы с Google. openssl> req -new -x509 -newkey rsa:2048 -keyout grupal.key -out grupal.crt -subj '/CN=grupal/' -nodes

    Комментарии

    Спасибо большое очень помогло!
    правильная ссылка на citforum Основы работы с OpenSSL

    В чем проблема, если вылетает такая ошибка?

    Error opening Private Key privateRSA.pem

    Содержимое сайта публикуется на условиях CreativeCommons Attribution-ShareAlike 3.0 или более поздней версии.

    Программные коды в тексте статей — на условиях GNU GPL v2 или более поздней версии.

    18+ Материалы этого сайта могут содержать информацию, согласно законодательству РФ, не предназначенную для лиц младше 18 лет.

    Что такое win32openssl_light-0_9_?

    Что такое " win32openssl_light-0_9_8l.exe ". Variant 12502228

    В базе содержится один файл с именем win32openssl_light-0_9_8l.exe. Этот файл принадлежит продукту OpenSSL Light (32-bit) и разработан компанией OpenSSL Win32 Installer Team. Описание этого файла - OpenSSL Light (32-bit) Setup. Это исполняемый файл. Вы можете найти его выполняющимся в диспетчере задач как процесс win32openssl_light-0_9_8l.exe.

    Продукт: OpenSSL Light (32-bit) Компания: OpenSSL Win32 Installer Team Описание: OpenSSL Light (32-bit) Setup Версия: 0.0.0.0 MD5: 4f1d1b3a37a3f7515513c21399048887 SHA1: f73404eb59d91e118d28f164a5658d2226a6f2a6 SHA256: c179525dd7d926b07a32b93a60934251ddf985146a01df4ae87c759970b6ba3a Размер: 1162343 Папка: %PROGRAMFILES%\Anomos\w32_dependancies ОС: Windows 7 Частота: Низкая

    Проверьте свой ПК с помощью нашей бесплатной программы

    System Explorer это наша бесплатная. удостоенная наград программа для быстрой проверки всех работающих процессов с помощью нашей базы данных. Эта программа поможет вам держать систему под контролем.

    Процесс "win32openssl_light-0_9_8l.exe" безопасный или опасный?

    Нет комментариев для "win32openssl_light-0_9_8l.exe" с определёнными атрибутами. Если вы хотите проверить сумму MD5 файла через базу VirusTotal, нажмите .

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

    Вызывает ли Процесс у вас подозрения? Ваш компьютер стал работать медленнее? Замечаете ли вы какое-либо подозрительное поведение ПК? Рекомендуем вам проверить компьютер с помощью нашей бесплатной утилиты .

    Комментарии пользователей для "win32openssl_light-0_9_8l.exe"

    Этот файл не имеет подтверждённых комментариев. Если вы знаете этот файл, то можете добавить свой комментарий.

    Добавить комментарий для "win32openssl_light-0_9_8l.exe" с определёнными выше параметрами

    (*) Пожалуйста, пишите комментарии на РУССКОМ языке. Если вы хотите использовать иной язык, перейдите на страницы с этим языком. Отправляя сведения, вы обязуетесь не публиковать материалы, защищённые авторскими правами, содержащие секретные данные или как-то иначе нарушающие права сторонних владельцев, если только вы не владелец таких прав или не имеете разрешение от соответствующих владельцев на публикацию.

    Проверьте свой ПК с помощью нашей бесплатной программы

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

    Установка WoW 3

    Представляю вашему вниманию видео-урок по настройке сборки сервера для новичков.

    Качество HD присутствует

    1. Для запуска сервера Вам потребуется распаковать карты:
    - экстрактор карт из \core\tools\extractor(4файла) в папку с игрой (пример "D:\Games\World of Warcraft")
    - Запустите запусти_только_меня.bat и ждите
    - Полученые 3 папки MAPS DBC VMAPS положить в папку data рядом с ядром сервера. Можно отредактировать конфиг и положить карты куда угодно!

    2. Необходимо установить библиотеки С++ 2008 и 2010 (так как они использовались при компиляции ядра):
    !Новый установщик сервера сделает это (второй пункт) за Вас!
    - Для этого запустите установщик vcredist_x86.exe если у вас 32 битная система
    - Если у вас 64 битная установите vcredist_x64.exe
    - Так же обязательно треубется установка последнего нетфрэймворка (dotNetFx40_Full_setup.exe) (Это относится и к старым ос Windows и новым!)
    - Так же потребуеться установка OpenSSL библиотек (Win32OpenSSL-1_0_0d.exe)
    http://www.slproweb.com/download/Win32OpenSSL-1_0_0d.exe
    http://www.slproweb.com/download/Win64OpenSSL-1_0_0d.exe

    3. Теперь ядро запуститься без проблем на локальной мащине! Для этого:
    - Запускаем Denver (портативный веб сервер Apache с базой MySQL и PHP) Файл запуска в /denwer/Run.exe (либой ярлык на рабочем столе)
    - Запускаем authserver.exe потом worldserver.exe и по окончанию загрузки можно тестить серв!
    Все вопросы по установке на другой машине настройке реалмов и тд обсуждаются в разделе установка.

    Дата добавления статьи: 5 лет назад


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

    Openssl создание сертификатов и ключей - SibCode

    openssl создание сертификатов и ключей

    Потребовалось проверять сообщения от клиентов из вне. Механизм md5 от сообщение сразу был отменен поскольку не безопасен. Передавать в хешированом виде пароль показалось так же не безопасно. Немного погуглив наткнулся на шифрование с помощью подписи.

    Немного теории

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

    Где взять/скачать openssl windows? Как создать openssl ключи?

    Openssl как создать .crt

    При выполнении команды будут заданы следующие вопросы:

    После чего будут созданы два файла:

    certificate.crt и privateKey.key — приватный ключ

    Будет запрошен пароль, только не забудьте его.

    При генерации pfx сертификата может возникнуть ошибка unable to write ‘random state’. Решить можно так:

    В домашней директории находим файл и удаляем. Под ubuntu работает.

    P.S. По просьбам комментаторов написал маленький sh скрипт для создания сертификатов (.pem .pfx .crt) и ключей (public.key, secret.key)

    Созданные файлы с расширением pfx, crt, pem — это сертификаты которые содержат в себе как ключ так и сертификат. Ключ -nodes указывает не создавать секретную фразу для шифрования секретного ключа.

    Команда pkcs12 позволяет создавать сертификаты для использования в MS Outlook, Internet Explorer.

    Более подробно о ключах можно почитать на официальном сайте

    Навигация по записям

    OpenSSL - это

    OpenSSL это:

    OpenSSL  — криптографический пакет с открытым исходным кодом для работы с SSL /TLS. Позволяет создавать ключи RSA. DH, DSA и сертификаты X.509. подписывать их, формировать CSR и CRT. Также имеется возможность шифрования данных и тестирования SSL/TLS соединений.

    OpenSSL основана на SSLeay. написанной Эриком Янгом (Eric A. Young) и Тимом Хадсоном (Tim Hudson), которые неофициально закончили работать над ней в декабре 1998 года, когда они начали работать в проекте RSA Security.

    Содержание Основные релизы
    • OpenSSL 0.9.3 релиз 25 мая 1999 г.
    • OpenSSL 0.9.4 релиз 9 августа 1999 г.
    • OpenSSL 0.9.5 релиз 28 февраля 2000 г.
    • OpenSSL 0.9.6 релиз 25 сентября 2000 г.
    • OpenSSL 0.9.7 релиз 31 декабря 2002 г.
    • OpenSSL 0.9.8 релиз 5 июля 2005 г.
    • OpenSSL 1.0.0 релиз 29 марта 2010 г.
    • OpenSSL 1.0.1 с поддержкой TLS 1.2 релиз 14 марта 2012 г.
    Алгоритмы

    OpenSSL поддерживает разные алгоритмы шифрования и хеширования :

    Поддержка алгоритмов ГОСТ появилась в версии 1.0.0, выпущенной 29 марта 2010 г. и была реализована сотрудниками фирмы Криптоком [4] .

    Полезные команды openssl

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

    Следует исправить раздел согласно стилистическим правилам Википедии.

    • Создание ключа для SSL-сертификата. Если не указывать -des3, то он будет без пароля:

    В случае утери пароля или файла ключа придется пересоздавать сертификат.

    Имя домена на который создается запрос прописывается в Common Name - example.com, A challenge password и An optional company name вводить не нужно (просто нажимаем enter).

    • Убрать пароль с ключа (необходимо когда сертификат ставится в конфигурацию Apache иначе он при запуске будет просить пароль):

    и вводим пароль с консоли (либо -passin pass:supersecretpassword что считается менее безопасным)

    • Прочитать содержимое CSR-файла в более удобном для чтения текстовом виде:
    Примечания Ссылки

    Основы работы с OpenSSL

    Основы работы с OpenSSL 1 2

    Статья была опубликована 1 февраля 2010 года в 00:00, а последний раз правилась 13 августа в 03:30.

    OpenSSL — это система защиты и сертификации данных, название SSL переводится, как система безопасных сокетов (secure socket layer). OpenSSL используется практически всеми сетевыми серверами для защиты передаваемой информацией.

    OpenSSL — это система защиты и сертификации данных, название SSL переводится, как система безопасных сокетов (secure socket layer). OpenSSL используется практически всеми сетевыми серверами для защиты передаваемой информацией. Существует программное API SSL (SSLEAY), позволяющее создавать безопасные сокеты с шифрацией передаваемых данных в собственных разработках. Но в данной статье я бы хотел рассказать о самой системе OpenSSL, вызываемой через командную строку.

    Т.к. OpenSSL поддерживает очень много различных стандартов сертификации, шифрования, хеширования, то использование данной команды достаточно сложно. Внутри OpenSSL существуют отдельные компоненты, отвечающие за то или иное действие, для получения списка доступных компонентов можно вызвать openssl с параметрами list-standart-commands. Можно также получить список доступных алгоритмов хеширования (list-message-digest-commands) и алгоритмов шифрования (list-cipher-commands).

    OpenSSL может использоваться во множестве случаев и умеет выполнять следующие задачи:

    • создавать и управлять ключами RSA и DSA — команды rsa, dsa, dsaparam;
    • создавать сертификаты формата x509, запросы на сертификацию, восстановление — команды x509, req, verify, ca, crl, pks12, pks7;
    • зашифровывать данные с помощью симметрического или асимметрического шифрования — команды enc, rsautl;
    • высчитывать хеши различных типов — команда dgst;
    • работать с S/MIME — команда s/mime;
    • проверять работу серверов и клиентов ssl — команды s_client, s_server.

    Cуществует также несколько вспомогательных утилит ssl:

    • openssl speed [список_алгоритмов_хеширования_или шифрования]: тестирование скорости различных алгоритмов, если запускать без параметров, то тестируются все алгоритмы; алгоритмы внутри списка разделяются пробелом, например: openssl speed md5 rsa idea blowfish des 3des sha1. В конце работы выводится общая скорость работы различных алгоритмов (в 1000-х байт в секунду), для обработки различной длины блоков. Вот результат работы тестов скорости на моем домашнем компьютере (Celeron 366), на других машинах значения будут другими:

    Проверка алгоритмов асимметрического шифрования:

  • openssl rand [-out file] [-rand file] num: генерация num рандомных байт, можно использовать для проверки рандомизационной последовательности rand:
  • openssl ciphers [-ssl2] [-ssl3] [-tls1] NAME: вывод доступных алгоритмов для обеспечения уровня безопасности NAME, где NAME — это символическое название группы алгоритмов. Обычно используются значения:
    • LOW — алгоритмы низкого уровня безопасности (<128 бит);
    • MEDIUM — алгоритмы среднего уровня стойкости (128 бит);
    • HIGH — алгоритмы высокой стойкости (>128 бит);
    • ALL — все алгоритмы;
    • NULL — алгоритмы без шифрования.

    Обычно в настоящее время используются алгоритмы групп MEDIUM и HIGH, которые еще долго не смогут быть взломаны прямым перебором. Можно также вывести список алгоритмов из нескольких групп, разделив их «:» (например, MEDIUM:HIGH).

    Теперь я бы хотел рассказать об основных утилитах openssl. Для начала о методах генерации ключей, затем о командах шифрования, и, наконец, о сертификатах, s/mime. Итак, пару слов о генерации ключей. Для создания rsa-ключей используется команда genrsa:

    Команда genrsa создает секретный ключ длиной bits в формате PEM, шифрует его одним из алгоритмов: des (56 бит), des3 (3-й des 168 бит) или idea (128 бит). При выборе алгоритма шифрования будет запрошен пароль для шифрации создаваемого секретного ключа (если алгоритм не указан, то секретный ключ не шифруется, чего делать ни в коем случае нельзя для личных ключей, т.к. некоторые серверы требуют отсутствие шифрации для сектетного ключа сервера). Опция -out говорит программе, что вывод нужно осуществлять не в stdout, а в файл file (опция -out присутствует во множестве других компонентов openssl и используется аналогичным образом для указания выходного файла). Опция -rand указывает на файл[ы] (разделенные «:»), из которых будут считываться данные для установки seed (зерна) генератора случайных чисел. В качестве таких файлов сразу же приходит на ум использовать что-то вроде /dev/random или /dev/urandom, но у меня с этим возникли проблемы: все вешалось наглухо, поэтому я рекомендую в этом случае использовать какие-нибудь сложно угадываемые файлы, вроде /var/log/messages или /boot/vmlinuz, думаю, что угадать содержимое этих файлов не намного проще, чем содержимое /dev/random, но работает этот фокус в любом *nix (опция -rand также присутствует во всех компонентах генерации и управления ключами и сертификатами). Использовать /dev/random и /dev/urandom, конечно, можно, но я для этого скопировал из /dev/random 32768 байт в файл .rnd таким образом:

    Кроме этого, можно указывать в качестве -rand-файла EGD-сокет, который обеспечивает генерацию определенного количества случайных байт, EGD доступен на узле http://www.lothar.com/tech/crypto/. Установка генератора случайных чисел производится на основании хеша -rand файла, поэтому можно указывать файлы различной длины, т.к. хеш все равно имеет фиксированное число бит. Пример генерации 4096 битового секретного ключа RSA:

    После этого секретный ключ зашифровывается и записывается в файл (в текстовом виде). В начале ключа указывается алгоритм шифрования. Для создания публичного ключа rsa на основе секретного используется команда openssl rsa. Даная команда имеет следующий формат:

    Утилита openssl rsa способна изменять пароль и алгоритм шифрования секретного ключа, будучи вызвана с параметром -in и -out. Если применить параметр -pubout, то в указанный файл -out будет записан публичный ключ, вычисленный на основе -in секретного. Например, создание публичного ключа на основании секретного:

    Изменение пароля и алгоритма шифрования секретного ключа с des3 на idea:


    Для создания ключей DSA используется утилита openssl gendsa, аналогичная genrsa, но есть два отличия: во-первых, для ключей DSA нельзя прямо указывать длину в битах и, во-вторых, ключи DSA могут генерироваться согласно некоторым параметрам, записанным в файл paramfile утилитой openssl dsaparam. dsaparam имеет следующий формат:

    где numbits — длина желаемого ключа, -С заставляет dsaparam вывести на stdout код на СИ для программной генерации DSA на основе необходимых параметров, а опция -genkey говорит, что в выходной файл, наряду с параметрами, дополнительно записывается созданный секретный ключ DSA, но нельзя его сразу же зашифровать, поэтому удобнее воспользоваться утилитой openssl gendsa, которая имеет схожий синтаксис с командой genrsa, но вместо числа бит указывается файл параметров, созданный dsaparam:


    Для управления ключами dsa используется программа openssl dsa, которая абсолютно аналогична (в параметрах) утилите openssl rsa. Поэтому я просто приведу пример генерации публичного ключа DSA:

    Теперь настало время рассказать о компонентах openssl, выполняющих шифрование и хеширование данных. Для выполнения симметрического шифрования используется утилита openssl enc -cipher или ее сокращенная запись openssl cipher, где cipher — это одно из символических имен симметрических шифров. Наиболее популярными являются следующие: base-64 (преобразование в текстовый вид), bf (blowfish — 128 бит), des (56 бит), des3 (168 бит), rc4 (128 бит), rc5 (128 бит), rc2 и idea (128 бит). Для указания входного и выходного файлов используется опции -in и -out соответственно. Пароль для шифрования вводится с клавиатуры (можно указать в командной строке параметром -k, но это очень плохо по соображениям безопасности, т.к. большинство шеллов умеют сохранять историю командной строки, IMHO намного лучше ввести пароль непосредственно перед шифрованием, хотя эта опция полезна для скриптов, так что забывать о ней нельзя :). Учтите, что пароль не спрашивается при обработке файла base64, т.к. шифрования не происходит. Для расшифровки зашифрованных данных примените openssl cipher с опцией -d (алгоритм шифрования и дешифрования должен совпадать!), а для одновременной обработки данных base64 можно воспользоваться опцией -a. Шифрование по умолчанию происходит с подмешиванием, т.е. для выбора алгоритма подмешивания используется случайная соль (salt), в этом случае, если вы шифруете один и тот же файл в разное время одним и тем же алгоритмом и паролем, то результаты скорее всего будут разными (это затрудняет атаку по словарю). Также по умолчанию используется cbc-режим алгоритмов, когда ключ меняется в течение всего сеанса работы согласно передаваемым данным, этот прием очень сильно затрудняет брутфорс, т.к. атакующему сложно поймать нужный момент времени. Приведу несколько примеров:

    • Зашифруем файл, используя алгоритм des3:
    • Расшифруем полученный файл:
    • Зашифруем файл, используя алгоритм blowfish(bf), и закодируем base64:
    • Расшифруем его и обработаем сразу же base64:

    Для вычисления хешей (их еще называют отпечатками или контрольными суммами) используется команда openssl dgst -hashalg или краткая форма openssl hashalg (первая команда может также выполнять манипуляции с ЭЦП, но об этом далее). Обычное использование данной команды таково:

    Вычисляется хеш-сообщения фиксированной длины в виде одной строки или, если указана опция -c, строки, разделенной на пары HEX-чисел двоеточием. Из алгоритмов хеширования могут применяться следующие: md2 (128 бит), md4(128 бит), md5 (128 бит), mdc2 (128 бит), sha (160 бит), sha1 (160 бит), ripemd160 (160 бит). Опять же приведу пару примеров:

    • Вычислим MD5-хеш файла:
    • И SHA1-хеш этого же файла:

    Как я уже говорил, утилита openssl dgst может использоваться для подписывания сообщения секретным ключом и проверки ЭЦП публичным ключом. Для этого используется следующий синтаксис:

    Подписывание file с помощью секретного ключа «private_key», используя алгоритм хеширования «hasalg» (обычно применяются sha1 или md5).

    Проверка подписи в «file», используя публичный ключ «public_key» и ЭЦП «signature». Данная программа выводит «Verification OK» при правильной подписи или «Verification Failure» в любом другом случае. Учтите, что ЭЦП в таком случае хранится отдельно от файла, который ею подписан (причем в каком-то кривом формате).

    Для шифрации и дешифрации RSA алгоритмом используется программа rsautl. Данная утилита имеет также возможность подписывать и проверять подпись сообщений (однако работать все равно приходится с хешем сообщения, т.к. подписывать можно только небольшой объем данных, по этой причине лучше применять openssl dgst). Для шифрации/дешифрации используется следующий синтаксис:


    (Шифрация file с использованием публичного ключа pubkey.pem.)


    (Дешифрация file.cr с использованием секретного ключа secretkey.pem.)

    Теперь настало время рассказать об одном из главных применений openssl — управление сертификатами. OpenSSL имеет возможность генерировать сертификаты, управлять ЭЦП и шифрацией с помощью сертификатов. Однако применение утилит управления сертификатами — достаточно сложная задача. Поэтому для начала я дам общие представления о сертификатах. Сертификат содержит публичный ключ, подписанный одним из корневых доверенных центров сертификации (или комплементарным секретным ключом), данные об организации, выдавшей сертификат и в некоторых случаях зашифрованный секретный ключ, а также отпечаток (хеш) публичного ключа. Сертификаты имеют время действия, по окончанию которого они автоматически считаются недействительными, иерархия сертификатов обычно строится на основании сети доверия (бывают довольно длинные цепочки сертификатов, ведущие к доверенному ключу из root CA). Таким образом, сертификат — это полный комплекс системы асимметрического шифрования, предоставляющий гораздо больше возможностей, чем сами по себе ключи (а также являющийся более защищенной системой). Основным привлекательным моментом сертификата является возможность записи в него информации об организации, этот ключ выдавшей. Таким образом, явно напрашивается применение собственной системы сертификации в данной организации. Можно, например, выдавать сотрудникам их персональные сертификаты, подписанные сертификатом организации (его можно сгенерировать самому или получить от сторонней компании). Причем эти сертификаты впоследствии можно использовать для удостоверения личности сотрудника, например, при почтовой переписке или аутентификации на http-сервере (apache+ssl). Единственное условие, которое должно выполняться, — это наличие на машине клиента сертификата организации в списке корневых доверенных ключей. Общее содержание сертификатов определено стандартом x509, в то время как форматы записей сертификатов могут внести некоторую путаницу. Openssl по умолчанию использует формат PKCS#10, Microsoft использует по умолчанию формат PKCS#12 (в руководстве по openssl этот формат охарактеризован, как один большой баг :), формат PKCS#7 используется для запросов на сертификацию к CA (центр сертификации) и не может содержать секретного ключа, также для этой цели может использоваться DER-закодированный сертификат (DER-кодирование подобно кодированию base64, но имеет специальное назначение для использования в криптографических системах) также без секретного ключа. Учтите, что при использовании DER-формата убираются маркеры начала и конца сертификата, а его содержимое кодируется base64, поэтому в файле DER можно хранить только один сертификат, с другой стороны DER сертификаты поддерживаются M$ (стандартное расширение .cer), поэтому иногда бывает нужно преобразовать сертификаты из одного формата в другой (я здесь имею в виду PEM или DER):

    Таким же образом можно конвертировать и ключи асимметрического шифрования (используя утилиты rsa или dsa).

    Думаю, что не сильно запутал вас всеми этими стандартами. Если объяснять на пальцах, то все выглядит следующим образом: клиент создает сертификат и отправляет свой публичный сертификат (PKCS#7) в центр сертификации. В центре сертификации обрабатывается запрос клиента (запрос на сертификацию), и сертификат клиента подписывается секретным ключом центра сертификации. Клиент, имея публичный ключ центра сертификации, проверяет подлинность подписи и может далее использовать свой сертификат. Для организации можно предложить следующее решение: на сервере создается сертификат организации; генерируется запрос на сертификацию и отправляется к некоему доверенному центру сертификации (который будет известен всем клиентам и персоналу данной организации); получается сертификат организации, который можно использовать при создании сертификатов клиентов. Последние создаются так: клиент посылает запрос на выдачу сертификата; сервер создает сертификат клиента и подписывает его сертификатом организации; клиент получает сертификат клиента и сертификат организации; после проверки достоверности ключа организации (предполагается, что клиент доверяет CA, которым был подписан сертификат организации) проверяется достоверность сертификата клиента. После такой операции клиент будет точно уверен, что получил сертификат от данной организации, и может его использовать для работы с ней. По такой схеме построены все центры выдачи сертификатов (правда, зачастую сертификат организации бывает подписан самим собой, что требует от клиента добавить сертификат организации к доверенным, а в первой схеме сертификат организации принадлежит к группе промежуточных центров сертификации, и этот случай предпочтительнее с точки зрения безопасности и удобства клиента, но требует больше работы от администратора). Да, хорошенькое объяснение на пальцах! Но что тут поделать: сертификаты — это довольно запутанная вещь. Сейчас я объясню, как создавать сертификаты с помощью openssl, и приведу пример только что описанного безобразия…

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

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


    Пример интерактивного файла конфигурации:

    Спешу обрадовать некоторых ленивых товарищей: если вы намереваетесь создавать просто сертификат сервера (например, для LDAP-сервера), то указывать конфиг необязательно, будет использоваться конфиг по умолчанию /usr/lib/ssl/openssl.cnf, который содержит все необходимое. Ну а теперь традиционно приведу примеры использования openssl req(я не собираюсь подробно описывать данную команду, т.к. думаю, что для большинства случаев хватит примеров, а для особых случаев можно почитать man req).

    Создание запроса на сертификацию (-new) на основе создаваемого секретного ключа rsa (-newkey rsa:2048), который записывается в файл -keyout(и шифруется тройным DES). Запрос на сертификацию создается на основе конфигурационного файла — config.

    Создание (-new) self-signed сертификата (-x509) для использования в качестве сертификата сервера или сертификата CA. Сертификат создается с использованием секретного ключа -key и конфигурационного файла -config. Создаваемый сертификат будет действителен в течение 365 дней (-days), опция -days не применима к запросам на сертификацию.

    Для управления сертификатами x509 используется утилита openssl x509. С ее помощью можно подписать сертификат или запрос на сертификацию сертификатом CA. Также можно просмотреть содержимое сертификата в читаемой форме (DN, публичный ключ, время действия, отпечаток и т.д.). Приведу примеры вышеописанных действий:

    Просмотреть информацию о сертификате в «нормальной» форме. Вот что примерно будет выведено, также можно использовать дополнительные опции: -fingerprint (необходимо сочетать с одной из опций -sha1, -md5 или -mdc2), -modulus (вывод публичного ключа), -serial, -subject, -issuer (организация, выдавшая сертификат), -email, -startdate, -enddate:

    Подписать запрос на сертификацию (-req) файла -in, используя доверенный CA сертификат -CA и его секретный ключ -CAkey. В конечный сертификат клиента (-out), записываются дополнительные параметры сертификата 3-й версии из файла /usr/lib/ssl/openssl.cnf (конфигурационный файл по умолчанию). Но об этом я расскажу после на конкретном примере. Такое поведение x509 позволяет организовать свой центр сертификации, подписывающий запросы клиентов на сертификацию.

    Преобразование сертификата -in в доверенный сертификат для использования в SSL-клиентах (sslserver — использование в качестве сертификата сервера, emailProtection — использование в качестве сертификата S/MIME).

    Я еще раз хотел бы вернуться к проблеме построения CA. Для использования внутри организации можно использовать self-signed сертификат, но для использования CA вне организации приходится использовать сертификаты, выданные или подписанные сторонней организацией. Во втором случае возникает проблема выбора такой сторонней организации (она легко разрешается для дочерних компаний), которая требует юридического анализа (в разных странах существуют свои законы криптографии и поэтому дать какой-либо конкретный совет я не могу). Если вам довелось работать в российской правительственной компании, то считайте, что вам не повезло — использовать openssl для работы с правительственными организациями нельзя. Наши уважаемые гос. деятели добавили геморроя админам, разрешив использовать только алгоритмы ГОСТ (симметрические, асимметрические, хеширования), поэтому использовать вам придется только специальные программы, реализующие эти алгоритмы. Я же приведу здесь пример построение собственного CA с self-signed сертификатом:

    1) Генерируем секретный ключ:

    2) Создаем self-signed сертификат:


    Содержимое конфигурационного файла зависит от организации, можно даже воспользоваться утилитой /usr/lib/ssl/misc/CA.pl -newcert, которая создаст ключ и сертификат в одном файле в интерактивном режиме (хотя мне этот вариант не очень понравился, лучше один раз написать нормальный конфиг) — о дополнительных требованиях к конфигурации CA сертификата см. ниже.

    3) Приведу пример скрипта, генерирующего клиентские сертификаты:

    Дополнительные свойства, описанные в скрипте (v3_req), означают, что клиент может использовать сертификат для подписывания и шифрации, но его сертификат не является CA сертификатом. Для CA-сертификата значение basicConstraits должно быть равно CA:TRUE (об этом забывать нельзя!). Поле nsCertType определяет дополнительные назначения данного ключа (для использования в качестве клиента, подписывания, использования в почтовых сообщениях). Для CA-сертификатов обычно применяют следующие значения nsCertType: sslCA, emailCA. Для ssl-ключей серверов (например, Apache) используется значение nsCertType = server. Полученный таким образом сертификат клиента будет содержать информацию о поставщике сертификата (то есть о вашем сертификате организации). Клиенту необходимо будет передать его сертификат, его секретный ключ (зашифрованный!) и ваш сертификат организации. Для клиентов Micro$oft необходимо еще и перевести сертификаты в формат PKCS#12.

    Для этого воспользуемся командой openssl pkcs12:

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

    В выходной файл записываются сертификат клиента, ca сертификат, секретный ключ клиента (его можно зашифровать опцией -des3, -idea и.т.д.). Такое поведение позволяет использовать для вывода только формат pem (маркеры здесь обязательны!). Для экспорта сертификата организации можно воспользоваться командой pkcs12 (конечно же, без параметра inkey ;), можно также обработать сертификат организации base64 и сохранить в файле .cer (openssl x509 -in CA.pem -outform DER -out CA.cer).

    В openssl существует компонент управления s/mime-сообщениями, называющийся openssl smime. Данная утилита позволяет зашифровывать, расшифровывать, управлять ЭЦП и MIME-заголовками писем. Приведу опять же несколько примеров ее использования:

    Подписывает сообщение -in (в текстовом виде) и подписывает (-sign) его с помощью сертификата (-signer) и секретного ключа (-inkey). Вывод идет непосредственно к sendmail, для этого определены MIME-заголовки from, to и subject.

    Проверяет подпись в файле -in, записывает сообщение в файл -out, а полученный сертификат — в файл -signer (для проверки s/mime-сообщения не требуется ничего, кроме него самого, т.к. ЭЦП s/mime содержит публичный ключ!).

    Шифрация файла -in с помощью сертификата получателя «user.pem», используя алгоритм «des3». Вывод программы посылается непосредственно в sendmail.

    Расшифровка файла -in с помощью секретного ключа -inkey и сертификата -recip (ваш собственный сертификат).

    Есть альтернатива не указывать smime-заголовки from, to и subject. Можно просто указать необходимый файл -out и добавить заголовки с помощью программы sendmail вручную. Кроме этого, есть еще одна деталь использования smime: некоторые почтовые клиенты используют в качестве подписи вложение в формате PKCS#7 (чаще всего закодированное base64). В таком случае необходимо применять smime следующим образом:

    PEM используется для стандартного формата PKCS#7, а DER заставляет произвести дополнительную обработку base64. Учтите, что в данном случае файл -in представляет собой только подпись (аттачмент), а -content — непосредственно текст письма. Можно также заставить smime подписывать сообщения подобным образом, если указать опцию -pk7out (PEM формат). Для преобразования PKCS#7 структуры из формата PEM в формат DER можно воспользоваться утилитой openssl base64 (обратное преобразование достигается за счет использования опции -d).

    Итак, думаю, что для большинства операций с использованием SSL этого будет достаточно.

  • Win32openssl


    OpenSSL is designed to build easily under Microsoft Visual C++. However, the requirement that you go and obtain the 25MB Win98 DDK and have the latest service pack (SP5 is 120MB) installed can prove to be a hinderance to some people (particularly those with modems).

    So, the installation of the Win32 OpenSSL binaries is a fairly simple process (similar to the Borland C++ Builder process).

    The first thing to do (assuming a default installation of 'C:\OpenSSL') is to go to 'C:\OpenSSL\lib\VC' and copy all of the files to your Visual C++ 'lib' directory. This directory is sometimes located in a somewhat cryptic location such as 'C:\Program Files\Microsoft Visual Studio\VC98\lib' or 'C:\Program Files\Microsoft Visual C++\lib'.

    Next, copy everything in the 'C:\OpenSSL\include' directory to your Visual C++ 'include' directory.

    That's it! You are ready to go write OpenSSL-capable code!

    После линковки получил ошибки


    Linking.
    state_machine.obj : error LNK2001: unresolved external symbol _ERR_error_string_n
    state_machine.obj : error LNK2001: unresolved external symbol _ERR_get_error
    state_machine.obj : error LNK2001: unresolved external symbol _SSL_set_accept_state
    state_machine.obj : error LNK2001: unresolved external symbol _SSL_set_bio
    state_machine.obj : error LNK2001: unresolved external symbol _BIO_new
    state_machine.obj : error LNK2001: unresolved external symbol _BIO_s_mem
    state_machine.obj : error LNK2001: unresolved external symbol _SSL_new
    state_machine.obj : error LNK2001: unresolved external symbol _SSL_CTX_use_PrivateKey_file
    state_machine.obj : error LNK2001: unresolved external symbol _SSL_CTX_use_certificate_file
    state_machine.obj : error LNK2001: unresolved external symbol _SSL_CTX_new
    state_machine.obj : error LNK2001: unresolved external symbol _SSLv23_server_method
    state_machine.obj : error LNK2001: unresolved external symbol _BIO_write
    state_machine.obj : error LNK2001: unresolved external symbol _SSL_read
    state_machine.obj : error LNK2001: unresolved external symbol _SSL_get_error
    state_machine.obj : error LNK2001: unresolved external symbol _SSL_accept
    state_machine.obj : error LNK2001: unresolved external symbol _SSL_state
    state_machine.obj : error LNK2001: unresolved external symbol _BIO_ctrl
    state_machine.obj : error LNK2001: unresolved external symbol _BIO_read
    state_machine.obj : error LNK2001: unresolved external symbol _SSL_write
    state_machine.obj : error LNK2001: unresolved external symbol _ERR_load_crypto_strings
    state_machine.obj : error LNK2001: unresolved external symbol _SSL_load_error_strings
    state_machine.obj : error LNK2001: unresolved external symbol _SSL_library_init
    Debug/state_machine.exe : fatal error LNK1120: 22 unresolved externals
    Error executing link.exe.
    Creating browse info file.

    Это сообщение отредактировал(а) neosapient - 2.4.2008, 17:58

    #include <stdio.h>
    #include <memory.h>
    #include <errno.h>
    #include <sys/types.h>
    //#include <sys/socket.h>
    #include <winsock2.h>
    #pragma comment (lib,"ws2_32.lib")
    #include <windows.h>
    //#include <process.h>
    //#include <stdio.h>
    //#include <stdlib.h>


    //#include <netinet/in.h>
    //#include <arpa/inet.h>
    //#include <netdb.h>

    #include <openssl/crypto.h>
    #include <openssl/x509.h>
    #include <openssl/pem.h>
    #include <openssl/ssl.h>
    #include <openssl/err.h>
    /*#include <crypto.h>
    #include <x509.h>
    #include <pem.h>
    #include <ssl.h>
    #include <err.h> */

    void main(int argc, char **argv)
    <
    SSL *ssl;
    SSL_CTX *ctx;
    SSL_METHOD *client_method;
    X509 *server_cert;
    int sd,err;
    char *str,*hostname,outbuf[4096],inbuf[4096],host_header[512];
    struct hostent *host_entry;
    struct sockaddr_in server_socket_address;
    struct in_addr ip;
    WSADATA wsd;

    SSLeay_add_ssl_algorithms( );
    client_method = SSLv2_client_method( );
    SSL_load_error_strings( );
    ctx = SSL_CTX_new(client_method);

    printf("(1) SSL context initialized\n\n");

    hostname = argv[1];
    host_entry = gethostbyname(hostname);
    //bcopy(host_entry->h_addr, &(ip.s_addr), host_entry->h_length);
    memcpy(host_entry->h_addr, &(ip.s_addr), host_entry->h_length);

    printf("(2) '%s' has IP address '%s'\n\n", hostname, inet_ntoa(ip));

    sd = socket (AF_INET, SOCK_STREAM, 0);

    memset(&server_socket_address, '\0', sizeof(server_socket_address));
    server_socket_address.sin_family = AF_INET;
    server_socket_address.sin_port = htons(443);
    memcpy(&(server_socket_address.sin_addr.s_addr),
    host_entry->h_addr, host_entry->h_length);

    printf("(3) TCP connection open to host '%s', port %d\n\n",
    hostname, server_socket_address.sin_port);

    ssl = SSL_new(ctx); /* create SSL stack endpoint */
    SSL_set_fd(ssl, sd); /* attach SSL stack to socket */
    err = SSL_connect(ssl); /* initiate SSL handshake */

    printf("(4) SSL endpoint created & handshake completed\n\n");

    printf("(5) SSL connected with cipher: %s\n\n", SSL_get_cipher(ssl));

    printf("(6) server's certificate was received:\n\n");

    str = X509_NAME_oneline(X509_get_subject_name(server_cert), 0, 0);
    printf(" subject: %s\n", str);

    str = X509_NAME_oneline(X509_get_issuer_name(server_cert), 0, 0);
    printf(" issuer: %s\n\n", str);

    /* certificate verification would happen here */

    sprintf(host_header,"Host: %s:443\r\n",hostname);
    strcpy(outbuf,"GET / HTTP/1.0\r\n");
    strcat(outbuf,host_header);
    strcat(outbuf,"Connection: close\r\n");
    strcat(outbuf,"\r\n");

    err = SSL_write(ssl, outbuf, strlen(outbuf));
    shutdown (sd, 1); /* send EOF to server */

    printf("(7) sent HTTP request over encrypted channel:\n\n%s\n",outbuf);

    err = SSL_read(ssl, inbuf, sizeof(inbuf) - 1);
    inbuf[err] = '\0';
    printf ("(8) got back %d bytes of HTTP response:\n\n%s\n",err,inbuf);

    SSL_shutdown(ssl);
    //close (sd);
    closesocket ( sd ) ;
    SSL_free (ssl);
    SSL_CTX_free (ctx);

    printf("(9) all done, cleaned up and closed connection\n\n");

    // либо
    //char buff[1024];
    //DWORD dwSize=1024;
    //HttpQueryInfo(hRequest, HTTP_QUERY_RAW_HEADERS_CRLF, buff, &dwSize, NULL);
    //cout << buff;

    При попытке сборки в VC6 ругается на не подключенные либы


    Linking.
    wasm-example.obj : error LNK2001: unresolved external symbol _SSL_CTX_free
    wasm-example.obj : error LNK2001: unresolved external symbol _SSL_free
    wasm-example.obj : error LNK2001: unresolved external symbol _SSL_shutdown
    wasm-example.obj : error LNK2001: unresolved external symbol _SSL_read
    wasm-example.obj : error LNK2001: unresolved external symbol _SSL_write
    wasm-example.obj : error LNK2001: unresolved external symbol _X509_free
    wasm-example.obj : error LNK2001: unresolved external symbol _X509_get_issuer_name
    wasm-example.obj : error LNK2001: unresolved external symbol _X509_NAME_oneline
    wasm-example.obj : error LNK2001: unresolved external symbol _X509_get_subject_name
    wasm-example.obj : error LNK2001: unresolved external symbol _SSL_get_peer_certificate
    wasm-example.obj : error LNK2001: unresolved external symbol _SSL_CIPHER_get_name
    wasm-example.obj : error LNK2001: unresolved external symbol _SSL_get_current_cipher
    wasm-example.obj : error LNK2001: unresolved external symbol _SSL_connect
    wasm-example.obj : error LNK2001: unresolved external symbol _SSL_set_fd
    wasm-example.obj : error LNK2001: unresolved external symbol _SSL_new
    wasm-example.obj : error LNK2001: unresolved external symbol _SSL_CTX_new
    wasm-example.obj : error LNK2001: unresolved external symbol _SSL_load_error_strings
    wasm-example.obj : error LNK2001: unresolved external symbol _SSLv2_client_method
    wasm-example.obj : error LNK2001: unresolved external symbol _SSL_library_init
    Debug/wasm_example.exe : fatal error LNK1120: 19 unresolved externals
    Error executing link.exe.

    wasm_example.exe - 20 error(s), 0 warning(s)

    Какую либу следует подключить.