Руководство по установке и настройке OpenVPN

Введение ключа в запуск

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

Для того чтобы следовать общепринятой практике обращения с цифровыми сертификатами, например как в Apache HTTP Server Project, я продемонстрирую, как загружать сертификат из файла. Если вы уже ознакомились с Частью 1 данного цикла, то вы знаете, что загрузка сертификата походит на загрузку доверительного хранилища, которая была продемонстрирована в статье.

Начнем с открытого сертификата, отсылаемого клиенту.

Листинг 5. Загрузка открытого сертификата
/**
 * ctx - SSL контекст, созданный ранее
 */

if(SSL_CTX_use_certificate_file(ctx, "/path/to/certificate.pem", SSL_FILETYPE_PEM) 

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

Подготовка конфигурационных файлов

Необходимо создать конфигурационный файл для OpenSSL. Создадим файл , скопируем в него следующее содержимое root-config.txt.
Раздел является обязательным. Здесь мы говорим OpenSSL использовать параметры из раздела :

Раздел содержит ряд значений по умолчанию:

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

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

Параметры из секции применяются когда создаются сертификаты или запросы на подписывание сертификатов.

Секция определяет информацию, которая обычно требуется при запросе на подписывание сертификата. Можно указать некоторые значения по умолчанию.

Следующие несколько секций являются расширениями, которые могут применять при подписывании сертификатов. Например, при указании аргумента командной строки -extensions v3_ca будут применены расширения из секции . Эти расширения будут применяться при создании корневого сертификата.

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

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

Расширение будет применяться при подписывании серверных сертификатов, таких, которые используются для веб-серверов.

Расширение будет автоматически применяться при создании списков отзыва сертификатов (CRL — certificate revocation lists).

Расширение будет применяться при подписывании сертификата OCSP (Online Certificate Status Protocol, онлайн протокол статуса сертификатов).

Автоматическое продление

Linux

Смотрим полный путь до скрипта certbot:

which certbot

Открываем на редактирование cron и добавляем следующее:

crontab -e

0 0 * * 1,4 /bin/certbot renew

* в данном примере проверка и продление сертификата будет выполняться по понедельникам и четвергам (1,4) в 00:00. /bin/certbot — путь, который мне выдала команда which certbot.

Команда certbot renew проверяет для всех наших сертификатов срок окончания, и если осталось менее 30 дней, запрашивает новый, сохраняет его в каталоге /etc/letsencrypt/archive/ и обновляет симлинк.

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

0 0 * * 1,4 /bin/certbot renew && systemctl reload nginx

Windows

Настройка задания на автоматическое продление создается при получении сертификата. Проверить задание можно в планировщике заданий Windows.

Use OpenSSL on a Windows machine

The standard installation of OpenSSL under Windows is made on «C:\OpenSSL-Win32» and the executable is stored in the sub-repertory «bin«. To execute the programm via the Windows xommand Prompt, provide the full path: >C:\OpenSSL-Win32\bin\openssl.exe ( or >C:\OpenSSL-Win64\bin\openssl.exe )

a) Default configuration file: openssl.cnf

  • The version 1.0 of OpenSSL requires a «openssl.cnf» configuration file. The/usr/local/openssl repertory not being present on Windows machines.
    • a.1)You can download this example fileopenssl-dem-server-cert-thvs.cnf

      and save it in>C:\OpenSSL-Win32\ ( or >C:\OpenSSL-Win64\)
      and rename it «openssl.cnf»

    • a.2) Enter this command:

      set OPENSSL_CONF=c:\OpenSSL-Win32\openssl.cnf 

      or

      set OPENSSL_CONF=c:\OpenSSL-Win64\openssl.cnf 

N.B.: In order to execute this command on a Windows machine you have to be connected in a session with administrator rights.

If Apache is installed on your machine, you can use this option:

-config "C:\Program Files\Apache Software Foundation\Apache2.2\conf\openssl.cnf"

If you still encounter the error:

WARNING: can't open config file: /usr/local/ssl/openssl.cnf
openssl:Error: '-config' is an invalid command.

Execute the following command first:

 set OPENSSL_CONF=C:\Program Files\Apache Software Foundation\Apache2.2\conf\openssl.cnf

Concerning the version «OpenSSL v0.9.8t Light», no need for the opens.cnf file, a default configuration will be taken into account.

b)Generate the private key (.key) and the CSR (Certificate Signing Request)

To get a new certificate (or a renewal or a reissuance) you’ll have to generate a new private key and a new CSR. To do so, we advise you to use
our online wizard
to execute the OpenSSL command with the adequate parameters.

>C:\OpenSSL-Win32\bin\openssl.exe req -new -newkey rsa:2048 -nodes -out www.mywebsite.com.csr -keyout www.mywebsite.com.key -subj «/C=FR/ST=Calvados/L=CAEN/O=My organization/CN=www.mywebsite.com»

Save and keep safe the file containing the private key (.key) and only copy/paste the content of the .csr
file in the order form.

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

Теперь можно установить новый сертификат на сервере, или распространить сертификат на клиентов. При установке на серверное приложение (к примеру, Apache), понадобятся следующие файлы:

  • ca-chain.cert.pem
  • example.com.key.pem
  • example.com.cert.pem

Если вы подписывали CSR от стороннего лица, у вас нет доступа до их частного ключа, и вы должны им дать только файл цепочки ca-chain.cert.pem и сертификат www.example.com.cert.pem.

Списки отзывов сертификатов

Списки отзывов сертификатов (CRL) предоставляют список сертификатов, которые были отозваны. Клиентское приложение, к примеру, веб-браузер, может использовать CRL для проверки подлинности сервера. Серверные приложения, такие как Apache или OpenVPN, могут использовать CRL для запрета доступа клиентам, которые больше не являются доверенными.

Публикация CRL в публично доступном месте (к примеру, http://example.com/intermediate.crl.pem) позволит треьтим сторонам получать CRL из этого места, чтобы проверить, нет ли в нем сертификатов, которые могут быть отозваны. Некоторые разработчики приложений вместо устаревшего CRL используют Онлайн Протокол Статуса Сертификата (Online Certificate Status Protocol — OCSP).

Configuration[edit]

OpenSSL is configured for a particular platform with protocol and behavior options using Configure and config.

You should avoid custom build systems because they often miss details, like each architecture and platform has a unique opensslconf.h and bn.h generated by Configure.

Supported Platformsedit

You can run Configure LIST to see a list of available platforms.

$ ./Configure LIST
BC-32
BS2000-OSD
BSD-generic32
BSD-generic64
BSD-ia64
BSD-sparc64
BSD-sparcv8
BSD-x86
BSD-x86-elf
BSD-x86_64
Cygwin
Cygwin-x86_64
DJGPP
...

If your platform is not listed, then use a similar platform and tune the $cflags and $ldflags by making a copy of the configure line and giving it its own name. $cflags and $ldflags correspond to fields 2 and 6 in a configure line. An example of using a similar configure line is presented in .

Configure & Configedit

You use Configure and config to tune the compile and installation process through options and switches. The difference between is Configure properly handles the host-arch-compiler triplet, and config does not. config attempts to guess the triplet, so its a lot like autotool’s config.guess.

You can usually use config and it will do the right thing (from Ubuntu 13.04, x64):

$ ./config 
Operating system: x86_64-whatever-linux2
Configuring for linux-x86_64
Configuring for linux-x86_64
    no-ec_nistp_64_gcc_128   OPENSSL_NO_EC_NISTP_64_GCC_128 (skip dir)
    no-gmp            OPENSSL_NO_GMP (skip dir)
    no-jpake         OPENSSL_NO_JPAKE (skip dir)
    no-krb5          OPENSSL_NO_KRB5
    ...

Mac OS X can have issues (its often a neglected platform), and you will have to use Configure:

 ./Configure darwin64-x86_64-cc
Configuring for darwin64-x86_64-cc
    no-ec_nistp_64_gcc_128   OPENSSL_NO_EC_NISTP_64_GCC_128 (skip dir)
    no-gmp            OPENSSL_NO_GMP (skip dir)
    no-jpake         OPENSSL_NO_JPAKE (skip dir)
    no-krb5          OPENSSL_NO_KRB5
    ...

You can also configure on Darwin by exporting KERNEL_BITS:

$ export KERNEL_BITS=64
$ ./config shared no-ssl2 no-ssl3 enable-ec_nistp_64_gcc_128 --openssldir=/usr/local/ssl/macosx-x64/
Operating system: i686-apple-darwinDarwin Kernel Version 12.5.0: Sun Sep 29 13:33:47 PDT 2013; root:xnu-2050.48.12~1/RELEASE_X86_64
Configuring for darwin64-x86_64-cc
Configuring for darwin64-x86_64-cc
    no-gmp            OPENSSL_NO_GMP (skip dir)
    no-jpake         OPENSSL_NO_JPAKE (skip dir)
    no-krb5          OPENSSL_NO_KRB5
    ...

If you provide a option not known to configure or ask for help, then you get a brief help message:

$ ./Configure --help
Usage: Configure   
      threads] shared]
zlib|zlib-dynamic]      
 ]  os/compiler

And if you supply an unknown triplet:

$ ./Configure darwin64-x86_64-clang
Configuring for darwin64-x86_64-clang
Usage: Configure   
      threads] shared]
zlib|zlib-dynamic]      
 ]  os/compiler

pick os/compiler from:
BC-32 BS2000-OSD BSD-generic32 BSD-generic64 BSD-ia64 BSD-sparc64 BSD-sparcv8 
BSD-x86 BSD-x86-elf BSD-x86_64 Cygwin Cygwin-pre1.3 DJGPP MPE/iX-gcc OS2-EMX 
...

NOTE: If in doubt, on Unix-ish systems use './config'.

Dependenciesedit

If you are prompted to run make depend, then you must do so. For OpenSSL 1.0.2 and below, its required to update the standard distribution once configuration options change.

Since you've disabled or enabled at least one algorithm, you need to do
the following before building:

	make depend

OpenSSL 1.1.0 and above performs the dependency step for you, so you should not see the message. However, you should perform a make clean to ensure the list of objects files is accurate after a reconfiguration.

Форматы сертификатов

До этого в руководстве рассматривались только сертификаты X.509 с кодированием ASCII PEM. Однако существует множество других форматов. Некоторые форматы позволяют объединить компоненты – ключ, запрос, сертификат – в один файл.

Чтобы конвертировать PEM в DER, используйте такую команду:

Формат DER обычно использует Java.

Конвертация PEM в PKCS7

Чтобы добавить сертификаты PEM (domain.crt и ca-chain.crt) в файл PKCS7 (domain.p7b), введите:

Файлы PKCS7 (также известные как P7B) часто используются в Java Keystores и Microsoft IIS (Windows).

Конвертация to PKCS7 в PEM

Чтобы конвертировать PKCS7 в PEM, введите:

Обратите внимание: файл PKCS7 содержит много компонентов, а именно сертификат и промежуточный сертификат ЦС

Конвертация PEM в PKCS12

Следующая команда позволяет объединить закрытый ключ и сертификат в файл PKCS12.

Программа запросит пароль. Файл PKCS12 позволяет объединить несколько сертификатов в один PEM-файл (domain.crt).

Файлы PKCS12 (или PFX) обычно используются для перемещения наборов сертификатов в Micrsoft IIS (Windows).

Конвертация PKCS12 в PEM

Чтобы конвертировать файл PKCS12 в формат PEM, введите:

Если в файле PKCS12 было несколько объектов (например, ключ и сертификат), все они переместятся в файл PEM.

Ссылки[править]

ПО уровня предприятия

1C • 1C 7.7 • AnyDesk • Api.php • BricsCAD • Chromium-gost • Cisco Anyconnect VPN Client • Citrix Client • Citrix XenServer • DB2 • Dr.Web • DraftSight • Dropbox • Enterprise Software • Hyper-V • Kaspersky Endpoint Security • Lotus Domino • Lotus Notes • MSSQL • Monit • Nuxeo • OpenMeetings • OracleALS40 • OwnCloud9 • PVE • SAP GUI for Java • SAP R3 • SCOM • SecureCRT • Skype • Skype/isolation • Theme-mate-windows • Vargus • ViPNet CSP • ViPNet Coordinator • ViPNet Coordinator/СПТ7 • Vibe • Viber • VipNet Client • VirtualBox • Winbox • Zimbra • АЦК Финансы • Антивирус Касперского • Битрих24 • ГОСТ в OpenSSL • Континент АП • КриптоПро • Лисси-Софт • Совместимость программного обеспечения • СправкиБК • Спутник Браузер • Установка VMware View Client • ЭП • Яндекс Браузер

Что делать если нет сертификата в запросах заявок на сертификат

Бывают ситуации, что на вашем сервере по каким-то причинам, в папке запросы на сертификат, может не оказаться вашего, в этом случае вам необходимо будет перейти в этой же mmc в раздел «Личное-Сертификаты». Выбираем нужный и делаем экспорт.

Появится мастер экспорта сертификатов.

Обратите внимание, что в pfx выгрузить не получится, но это не страшно, нам подойдет и p7b, но с включенной галкой «Включить по возможности все сертификаты в путь сертификации»

Указываем путь сохраняемого файла.

Видим, что все успешно выполнено.

Преобразование p7b в pem

Попробует такое преобразование.

openssl pkcs7 -in cert.p7b -inform DER -print_certs -out cert.pem

Мой пример

openssl.exe pkcs7 -in new.pyatilistnik.ru.p7b -inform DER -print_certs -out new.pyatilistnik.ru.pem

В итоге я получил файл new.pyatilistnik.ru.pem

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

C:\AMD64-Win64OpenSSL-0_9_8g>openssl.exe rsa -in new.pyatilistnik.ru.pem -out new. pyatilistnik.ru.key unable to load Private Key 6944:error:0906D06C:PEM routines:PEM_read_bio:no start line:.\crypto\pem\pem_lib .c:647:Expecting: ANY PRIVATE KEY

То наш вариант это .crt в .der и уже .der в .pem

Преобразование CRT в PEM

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

Первое это crt в der

openssl x509 -in new.pyatilistnik.ru.crt -out new.pyatilistnik.ru.der -outform DER

Теперь der в pem.

openssl x509 -in new.pyatilistnik.ru.der -inform DER -out new.pyatilistnik.ru.pem -outform PEM

В итоге у меня получилось, вот так.

Использование CRL клиентами

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

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

Точки распространения CRL видны в спецификациях X509v3 сертификата.

Online Certificate Status Protocol

Online Certificate Status Protocol (OCSP) был создан в качестве альтернативы CRL. Как и CRL, OCSP позволяет запрашивающей стороне (к примеру, веб-браузеру) определять статус отзыва сертификата.

Когда центр сертификации подписывает сертификат, он обычно включает адрес сервера OCSP (к примеру, http://ocsp.example.com) в в сертификат. Это похоже на функцию , используемой для CRL.

Например, когда веб-браузеру предоставлен сертификат сервера, он посылает запрос на адрес сервера OCSP, указанном в сертификате. По этому адресу OCSP слушает запросы и отвечает статусом отзыва сертификата.

Рекомендуется использовать OCSP вместо CRL, где это возможно, хотя реально,  как правило, OCSP нужен только для сертификатов веб-сайтов. Некоторыми веб-браузерами поддержка CRL считается устаревшей, или вообще убрана.

Создание ключей[править]

1. Создаём закрытый ключ с алгоритмом ГОСТ-2001 (ca.key):

$ openssl genpkey -algorithm gost2001 -pkeyopt paramset:A -out ca.key

2. Создаём сертификат на 365 дней (ca.cer):

$ openssl req -new -x509 -days 365 -key ca.key -out ca.cer \
  -subj "/C=RU/ST=Russia/L=Moscow/O=SuperPlat/OU=SuperPlat CA/CN=SuperPlat CA Root"

3. Проверка сертификата (ca.cer):

$ openssl x509 -in ca.cer -text -noout
Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number:
            cc:54:ca:0b:b6:db:b0:3c
    Signature Algorithm: GOST R 34.11-94 with GOST R 34.10-2001
        Issuer: C=RU, ST=Russia, L=Moscow, O=SuperPlat, OU=SuperPlat CA, CN=SuperPlat CA Root
        Validity
            Not Before: Oct 10 11:37:49 2016 GMT
            Not After : Oct 10 11:37:49 2017 GMT
        Subject: C=RU, ST=Russia, L=Moscow, O=SuperPlat, OU=SuperPlat CA, CN=SuperPlat CA Root
        Subject Public Key Info:
            Public Key Algorithm: GOST R 34.10-2001
                Public key:
                   X:F02426CE38041BC250153A86DB138FB6B7CCBF6C0D220314D3FF3CA38490083
                   Y:FC5E3F8D99D2EA6ED51CC014E92E617CB32CAEBCB5B7D4FAA0CC9B0702CD0B6A
                Parameter set: id-GostR3410-2001-CryptoPro-A-ParamSet
        X509v3 extensions:
            X509v3 Subject Key Identifier: 
                38:17:87:F5:DF:60:3D:90:8A:41:D6:96:E0:F8:BD:DD:18:A8:A7:0D
            X509v3 Authority Key Identifier: 
                keyid:38:17:87:F5:DF:60:3D:90:8A:41:D6:96:E0:F8:BD:DD:18:A8:A7:0D

            X509v3 Basic Constraints: 
                CA:TRUE
    Signature Algorithm: GOST R 34.11-94 with GOST R 34.10-2001
         a4:12:d4:6c:d5:75:20:08:1e:a8:8d:9c:08:02:78:8a:f3:b6:
         e7:d5:54:44:ea:e3:8d:35:61:5a:d9:50:fe:3b:fb:ec:9d:5d:
         78:62:a2:fd:a6:3a:23:92:3d:b9:d3:12:d9:97:df:dd:8b:3b:
         de:0b:c7:47:30:b2:34:1d:ec:0b

Создание самозаверяемого сертификата

opensslreq -x509 -sha256 -nodes -newkey rsa:2048 -keyoutgfselfsigned.key -out gfcert.pem

Команда генерирует самозаверенный сертификат и файл 2048-битного RSA-ключа. Я также включил в команду хеш-функцию sha256, поскольку она считается наиболее безопасной.

Совет: По умолчанию команда генерирует самозаверенный сертификат, действительный только один месяц. Для увеличения этого срока переопределите параметра — days.

Пример: для получения сертификата, действительного два года.

opensslreq -x509 -sha256 -nodes -days 730 -newkey rsa:2048 -keyoutgfselfsigned.key -out gfcert.pem

SSL-сертификат, центр сертификации.

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

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

  • Серийный номер сертификата;
  • Объектный идентификатор алгоритма электронной подписи;
  • Имя удостоверяющего центра;
  • Срок годности;
  • Имя владельца сертификата (имя пользователя, которому принадлежит сертификат);
  • Открытые ключи владельца сертификата (ключей может быть несколько);

Сертификат также содержит полностью определенное имя домена (FQDN RFC 821) в строке Common Name. Одна из возможных атак — подмена DNS — будет обнаружена до отправки данных.

Виды SSL- сертификатов

Выделяют различные виды SSL- сертификатов в зависимости от типа проверки:

  • Сертификаты с проверкой домена – подтверждают подлинность доменного имени. Не содержат информации о компании.
  • Сертификаты с проверкой компании – содержат информацию не только о домене, но и о компании, которой выдан сертификат. Пользуются большим доверием у пользователей.
  • Сертификаты на домен и поддомены (Wildcard SSL) – обеспечивают защиту неограниченного количества субдоменов одним сертификатом. Сертификат выдается на определенное доменное имя и при этом защищает все поддомены. Данные сертификаты могут быть как с проверкой домена, так и с проверкой организации.
  • Сертификаты с расширенной проверкой организации (Extended Validation SSL (EV SSL)) – обеспечивают наивысшее доверие клиентов. Когда пользователь находится на сайте с EV SSL сертификатом, браузер подсвечивает адресную строку зеленым цветом.

Wildcard SSL — сертификаты — это сертификаты, защищающие не только основной домен(ваш_домен.ру), но и поддомены(www.ваш_домен.ру, ssl.ваш_домен.ру, secure.ваш_домен.ру и т.д.). Может использоваться на веб-сервере и почтовом сервере. При генерации запроса на Wildcard сертификат в качестве Common Name (CN) используйте «*.domain.com», где domain.com — это ваше доменное имя.

Ответ на входящий запрос

возвращает , когда принимает входящее соединение. Но вы не можете просто передать акцепт BIO. Вместо этого OpenSSL создает другой BIO, который должен быть вытолкнут из акцепта BIO c помощью .

Листинг 11. Выталкивание соединения для разговора
out = BIO_pop(abio);

if(BIO_do_handshake(out) 

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

Собственно общаться с клиентом сервер должен через различные функции считывания и записи, доступные библиотеке BIO. Об этом речь шла в Части 1.

Несколько конфигурационных файлов

Позволит держать несколько конфигураций для подключения к различным VPN-серверам. Между последними можно переключаться из клиентской программы.

Для Windows:

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

Пример каталога config:

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

Теперь при подключении клиентом к можно выбрать конкретный VPN-сервер:

Для Linux:

Также как для Windows, создаем для каждого сервера свой каталог, куда скопируем рабочие файлы. Для запуска, переходим в нужный каталог, например:

cd /etc/openvpn/server1

И запускаем OpenVPN:

openvpn —config /etc/openvpn/server1/client.conf

Проверка того, принимается ли конкретный шифр на URL-адресе

openssls_client -cipher 'ECDHE-ECDSA-AES256-SHA' -connect secureurl:443

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

Для этого необходимо задать шифр и URL-адрес. Если шифр будет принят, вы получите сообщение «CONNECTED», иначе – сообщение «handshake failure».

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

Данная публикация представляет собой перевод статьи «21 OpenSSL Examples to Help You in Real-World» , подготовленной дружной командой проекта Интернет-технологии.ру

Необходимое взаимодействие

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

Формат отзыва таков:

Листинг 3. Формат отзыва
int password_callback(char *buf, int size, int rwflag, void *userdata);

Для нас, последний параметр, , не
обязательный. Буфер распределяется до вызова этой функции, так что вы не контролируете размер буфера.

Секретные ключи сервера

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

Параметр — это флажок считывания/записи. Он используется для того, чтобы вы могли программно определить, используется ли пароль для шифровки ( = 1) или расшифровки ( = 0). информации. Если отзыв используется для запроса пароля для расшифровки информации, предпочтительнее запрашивать пароль дважды, на всякий случай, чтобы исключить опечатки.

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

Как только вы создали функцию отзыва пароля, установите ее в SSL контекст, используя , как показано ниже:

Листинг 4. Установка функции отзыва
/* ctx – указатель к предварительно созданному SSL контексту, а cb - указатель
 * на созданную функцию отзыва.
 */

SSL_CTX_set_default_passwd_cb(ctx, cb);

Создать тестовый SSL сервер.

Команда OpenSSL s_server реализует общий SSL/TLS-сервер. Она должна использоваться только для целей тестирования. В приведенном ниже примере данный сервер прослушивает соединения на порту 8080 и возвращает отформатированную HTML страницу статуса, который включает много информации о ciphers:

$ openssl s_server -key key.pem -cert cert.pem -accept 8080 -www

Конвертирование сертификатов с DER в PEM формат.

# openssl x509 -inform der -in LN.der -out LN.pem

Как правило, при покупке SSL сертификатов, его отдают вам в формате .der и если вам нужно использовать его в веб-сервере или .pem формате, вы можете использовать команду выше, чтобы преобразовать такие сертификаты.

Конвертирование сертификатов с PEM в DER формат.

В случае, если вам необходимо изменить .pem формат в .der:

# openssl x509 -outform der -in linux-notes.pem -out linux-notes.der

Конвертирование сертификата и приватного ключа  в PKCS#12 фотмат.

# openssl pkcs12 –export –out sslcert.pfx –inkey key.pem –in sslcert.pem

Если вам необходимо использовать сертификат с приложением Java или с любым другим, кто принимает формат PKCS# 12.

Совет: Вы можете включить «chain certificate» используя «-chain» опцию:

# openssl pkcs12 -export -out my_cert.pfx -inkey my_key.pem -in your_cert.pem -chain the_cert.pem

Создание CSR используя  приватный ключ (private key).

# openssl req -out some_cert.csr -key exists.key -new

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

Проверьте содержимое сертификата в PKCS12 формате.

# openssl pkcs12 -info -nodes -in my_certificate.p12

PKCS12 — это двоичный формат, так что вы не сможете просматривать содержимое в блокноте или другом редакторе. Таким образом, вы должны использовать команду что выше, для просмотра содержимого файла формата PKCS12.

Получить SHA-1 отпечаток сертификата или CSR

Чтобы получить отпечаток SHA1 сертификата с использованием OpenSSL, используйте команду, приведенную ниже:

$ openssl dgst -sha1 my_cert.der

Чтобы получить SHA1 отпечаток пальца CSR с использованием OpenSSL, используйте команду, приведенную ниже:

$ openssl dgst -sha1 the_csr.der

Получить MD5 отпечаток сертификата или CSR

Чтобы получить отпечаток MD5 сертификата с использованием OpenSSL, используйте команду, приведенную ниже:

$ openssl dgst -md5 cert.der

Чтобы получить MD5 отпечаток пальца CSR с использованием OpenSSL, используйте команду, приведенную ниже:

$ openssl dgst -md5 my_csr.der

Тестирование SSL сертификата по URL.

# openssl s_client -connect linux-notes.org:443 -showcerts

Я использую это довольно часто для проверки SSL-сертификатов по URL с сервера. Это очень удобно для проверки некоторых деталей протокола, шифров и CERT.

Узнать версию OpenSSL

 # openssl version

Поверка PEM сертификата на завершение (Expiration Date).

# openssl x509 -noout -in cert.pem -dates

Пример:

# openssl x509 -noout -in bestflare.pem -dates
notBefore=Jul 4 14:02:45 2015 GMT
notAfter=Aug 4 09:46:42 2015 GMT

Проверить поддержку SSL версии V2/V3  по URL.

Проверка SSL версии V2:

# openssl s_client -connect linux-notes.org:443 -ssl2

Проверка SSL версии V3:

# openssl s_client -connect linux-notes.org:443 -ssl3

Проверка TLS 1.0:

# openssl s_client -connect linux-notes.org:443 -tls1

Проверка TLS 1.1:

# openssl s_client -connect linux-notes.org:443 -tls1_1

Проверка TLS 1.2:

# openssl s_client -connect linux-notes.org:443 -tls1_2

Какой алгоритм используется в сертификате (проверка).

$ openssl req -noout -text -in mycert.csr | grep 'Signature Algorithm'

Или, используя URL:

openssl s_client -connect linux-notes.org:443 /dev/null | openssl x509 -text -in /dev/stdin | grep "Signature Algorithm"

Получить сертификат по URL

Команда что ниже, сохранит сертификат в файл прямо по URL сайта:

$ echo -n | openssl s_client -connect linux-notes.org:443 | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > pem.cert

Если веб-сервер имеет несколько сертификатов на один IP-адрес, то вам нужно будет сообщить OpenSSL, какой сертификат будет использоваться, пример ниже:

$ echo -n | openssl s_client -connect linux-notes.org:443 -servername linux-notes.org | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > pem.cert

Вот и все, много полезностей и все в одной статье «Примеры использования OpenSSL в Unix/Linux».

Autoconf[edit]

OpenSSL uses its own configuration system, and does not use Autoconf. However, a number of popular projects use both OpenSSL and Autoconf, and it would be useful to detect either OPENSSL_init_ssl or SSL_library_init from libssl. To craft a feature test for OpenSSL that recognizes both OPENSSL_init_ssl and SSL_library_init, you can use the following.

if test "$with_openssl" = yes ; then
  dnl Order matters!
  if test "$PORTNAME" != "win32"; then
     AC_CHECK_LIB(crypto, CRYPTO_new_ex_data, [], )])
     FOUND_SSL_LIB="no"
     AC_CHECK_LIB(ssl, OPENSSL_init_ssl, )
     AC_CHECK_LIB(ssl, SSL_library_init, )
     AS_IF(, )])
  else
     AC_SEARCH_LIBS(CRYPTO_new_ex_data, eay32 crypto, [], )])
     FOUND_SSL_LIB="no"
     AC_SEARCH_LIBS(OPENSSL_init_ssl, ssleay32 ssl, )
     AC_SEARCH_LIBS(SSL_library_init, ssleay32 ssl, )
     AS_IF(, )])
  fi
fi

Завершение настройки

После настройки контекста (см. выше) и загрузки ключей, пришло время завершить настройку созданием BIO объекта. ИзЧасти 1 вы можете вспомнить, как мы устанавливали SSL и non-SSL соединения, используя библиотеку OpenSSL. Чтобы не противоречить указанной статье, то же самое будет проделано здесь.

Листинг 7. BIO указатели
BIO *bio, *abio, *out;

Три BIO объекта? Почему нам нужны именно три? Поверьте, все три имеют свое назначение. (Память, доверие и безопасность – звенья одной цепи.)

Первый, , это основной BIO объект, который будет создан из SSL контекста. Второй объект,,это акцепт BIO, тот, который будет принимать входящие соединения. Третий, , сервер будет передавать клиенту.

Листинг 8. Настройка основного BIO объекта
bio = BIO_new_ssl(ctx, 0);
if(bio == NULL)
{
    /* Управление сбоем*/
}

/* Здесь, ssl  - это SSL* (см. Часть 1) */

BIO_get_ssl(bio, &ssl);
SSL_set_mode(ssl, SSL_MODE_AUTO_RETRY);

Здесь настройка BIO объекта немного отличается от аналогичной для клиентского соединения. Вы можете вспомнить из Части 1, что клиентское соединение настраивается при использовании .

Здесь же настройка происходит при использовании с двумя параметрами: указателем на SSL_CTX объект и флажком. Флажок указывает OpenSSL на то, какой BIO объект создать: 0 для сервера, 1 для клиента. Как только данный код пытается настроить клиентское соединение, флажок устанавливается на 0.

Листинг 9. Настройка акцепта BIO
abio = BIO_new_accept("4422");
BIO_set_accept_bios(abio, bio);

Там же, где создает BIO для клиентских соединений, создает BIO для серверных соединений. Просто необходим один параметр, порт для передачи закодированный в строке.

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

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

Установка OpenSSL для Windows

Теперь нам необходимо наш файл pfx переделать в pem, Pem преобразовать в key:

  • с расширением .ca-bundle
  • с расширением .crt
  • key

Вы получите из этих трех файлов, нужный для импорта pfx архив. Во всем этом нам поможет утилита OpenSSL для Windows.

Скачать OpenSSL для Windows x64 — https://cloud.mail.ru/public/MZmy/yKvJkc7Ad

В итоге у вас будет архив, распакуйте его куда вам будет угодно. Далее выберите вашу папку, зажмите SHIFT и щелкните по ней правым кликом, в открывшемся контекстном меню, выберите пункт «Открыть окно команд».

В результате чего у вас откроется командная строка Windows, но уже в нужной папке содержащей утилиту openssl.exe, она нам и поможет все сделать красиво.

Преобразование PFX в PEM

Теперь приступаем к получению фала в формате Pem. Положите в папку с дистрибутивом файл в формате pfx.

openssl.exe pkcs12 -in «имя вашего pfx файла» -nocerts -out key.pem

Мой пример:

openssl.exe pkcs12 -in api.pyatilistnik.ru.pfx» -nocerts -out key.pem

Вас попросят указать пароль от Pfx архива, вы его задавали при экспорте, после чего нужно придумать пароль на pem файл.

В папке с дистрибутивом OpenSSL вы обнаружите файл key.pem, он нам нужен будет для следующего этапа.

Преобразование PEM в KEY

Теперь получим файл с расширением key, для этого есть вот такая команда:

openssl rsa -in key.pem -out

Мой пример:

openssl rsa -in key.pem -out api.pyatilistnik.ru.key

Вас попросят указать пароль от pem ключа.

В итоге я получил закрытый ключ в формате key.

Осталась финишная прямая.

Получаем PFX ключ для импорта в IIS

Теперь когда у вас есть все составляющие, вы можете выполнить последнюю команду для создания PFX файла для IIS сервера.

Задаем пароль для pfx файла, потребуется при импортировании.

В итоге вы получаете нужный вам файл, который можно загружать на ваш почтовый сервер.

Ссылка на основную публикацию