Большинство сетевых протоколов, например, IMAP, POP, SMTP, HTTP, FTP и LDAP, обеспечивают поддержку шифрования информации по протоколу SSL. Обычно шифрование используется для скрытия передаваемых по сетям общего пользования логинов и паролей доступа к различным ресурсам, например, средствам администрирования через Web-интерфейс, акаунтов для предоставления различных услуг (хостинг, электронная почта, управление мобильным телефоном и т. п.), почтовым ящикам, закрытым каталогам на FTP и Web-серверах для передачи различных конфиденциальных сообщений. При передаче аутентификационной информации в виде обычного текста она может быть перехвачена третьими лицами с использованием программ-сниферов и использована для получения несанкционированного доступа к вашим ресурсам.
В настоящее время протокол SSL практически незаметно для пользователя взаимодействует с остальными протоколами Интернет и обеспечивает передачу конфиденциальной информации по сетям общего пользования в зашифрованном виде. Программное обеспечение OpenSSL поддерживает протоколы SSL (Secure Sockets Layer) v2/v3 и TLS v1 (Transport Layer Security). Утилита командной строки openssl может использоваться для выполнения следующих задач:
SSL использует асимметричные алгоритмы шифрования, т.н. шифрование с открытым ключом. В таком алгоритме один ключ используется для расшифровки данных, зашифрованных другим ключом. Эти два ключа (private/public) - пара ключей - создаются одновременно, с помощью математической формулы. Это единственный простой способ найти два ключа, обладающих специальной ассиметрией (при которой один из ключей может расшифровать зашифрованное вторым): вычисление одного из ключей по второму - задача невероятно сложная. При применении шифрования с открытым ключом один ключ из пары делается свободно доступным, т.н. public key, а второй сохраняется в секрете, т.н. private key. Тот, кто хочет установить с создателем ключей безопасный контакт, может перед отправкой зашифровать свое сообщение, пользуясь открытым ключом (public key). Если адресат хранит закрытый ключ (private key) в секрете, то только он сможет расшифровать сообщение.
И наоборот, автор пары ключей может зашифровать свое сообщение закрытым ключом. Получатель может удостовериться, что сообщение действительно принадлежит автору ключей, попробовав расшифровать его с помощью открытого ключа. Если сообщение после расшифровки имеет какой то смысл, а отправитель действительно сохранил зарытый ключ в секрете, то сообщение действительно написано им. Успешная расшифровка также подтверждает, что сообщение не было изменено в процессе доставки (например, при прохождении через почтовый сервер), поскольку в противном случае не была бы получена правильная расшифровка. Так сообщение проверяется получателем.
К сожалению, шифрование больших объемов данных с помощью ассиметричных алгоритмов происходит медленно - гораздо медленнее, чем при использовании симметричных алгоритмов. Но при использовании шифрования с открытым ключом, в целях проверки подлинности (а не для сохранения конфиденциальности), совершенно не обязательно шифровать сообщение целиком. Вместо этого сообщение сначала обрабатывается вычислительно необратимой хеш-функцией, например с использованием алгоритма md5. Затем достаточно зашифровать только хеш-значение, которое является представлением данных. Зашифрованное хеш-значение, называемое теперь цифровой подписью, добавляется к сообщению, для которого будет производиться проверка подлинности. Получатель может проверить подлинность сообщения, расшифровав подпись и обработав сообщение копией вычислительно необратимой хеш-функции. Если полученные хеш-значения совпадают - сообщение подлинное.
Суть вычислительно необратимой хеш-функции заключается в том, что каждый бит хеш-значения зависит от каждого из битов исходных данных. Если изменить единственный бит исходных данных, хеш-значение тоже изменится - очень сильно и непредсказуемо - настолько непредсказуемо, что задача обращения функции и нахождения ввода, приведшего к получению конкретного хеш-значения, является «вычислительно неосуществимой».
Сертификат содержит публичный ключ, подписанный одним из корневых доверенных центров сертификации, данные об организации, выдавшей сертификат и в некоторых случаях зашифрованный закрытый ключ, а также отпечаток (хеш) публичного ключа.
Сертификаты имеют время действия, по окончанию которого они автоматически считаются недействительными, иерархия сертификатов обычно строится на основании сети доверия (бывают довольно длинные цепочки сертификатов, ведущие к доверенному ключу из root CA).
Таким образом, сертификат - это полный комплекс системы асимметрического шифрования, предоставляющий гораздо больше возможностей, чем сами по себе ключи (а также являющийся более защищенной системой). Одним из основных достоинств сертификата является возможность записи в него информации об организации, этот ключ выдавшей.
Сертификаты играют важную роль в коммуникационном процессе. Сертификат, подписанный доверенным СА, дает гарантию, что владелец сертификата, тот за кого он себя выдает. Без подписанного сертификата ваши данные будут зашифрованы, однако, сервер, с которым вы контактируете, может быть не тем, за кого себя выдает.
Итак, для начала создаем директорию, где мы будем работать. Например, можно создать ее в своей домашней папке.
# cd ~ # mkdir CA # cd CA # mkdir newcerts private
Папка CA будет содержать сертификат нашего CA, базу данных сертификатов, которые мы подписали, а также ключи, запросы и сертификаты, которые мы сгенерируем. Она также будет нашей рабочей директорией, когда мы будем создавать или подписывать сертификаты.
Наш следующий шаг заключается в создании БД для сертификатов, которые мы будем подписывать.
# echo '01' > serial # touch index.txt
Вместо того, чтобы использовать конфигурационный файл, поставляемый вместе с openssl (/etc/ssl/openssl.cnf), мы создадим свой, с минимально необходимой конфигурацией. Этот файл очень удобен, т.к. при создании или подписи сертификатов или запросов нам придется каждый раз вводить много одной и той же информации. Вместо этого мы можем указать openssl брать информацию из конфигурационного файла.
# # /root/CA/openssl.cnf # # Задаем рабочую директорию dir = .
При использовании OpenSSL большая часть того, что будет включаться в сертификат, зависит от настроек конфигурационного файла (openssl.cnf), а не от параметров командной строки.
Конфигурационный файл разделен на секции, которые выборочно читаются и обрабатываются согласно аргументам командной строки openssl. Каждая секция может включать одну или несколько других секций, ссылаясь на них, что позволяет сделать конфигурационный файл модульным. Имя в квадратных скобках ([название]) означает начало каждой секции.
Создаем корневой сертификат, с помощью которого будем подписывать все наши сертификаты. Сейчас нам необходимо добавить секцию, которая управляет процессом создания сертификатов, а также секцию, которая определяет тип создаваемых сертификатов. Первое, что нам нужно это указать Distinguished Name. Это текст, определяющий владельца сертификата, при его просмотре.
Добавьте следующие строки в ваш openssl.cnf
# В данной секции описываются основные опции [ req ] # Длина ключа в битах default_bits = 4096 # Алгоритм шифрования default_md = md5 # Разрешенные символы string_mask = nombstr # Указываем, что DN (Distinguished Name) будет описана в секции req_distinguished_name distinguished_name = req_distinguished_name # В данной секции указываются данные, которые будут использоваться # по умолчанию при генерации запроса на подписание сертификата [ req_distinguished_name ] 0.organizationName = Organization Name (company) organizationalUnitName = Organizational Unit Name (department, division) emailAddress = Email Address emailAddress_max = 40 localityName = Locality Name (city, district) stateOrProvinceName = State or Province Name (full name) countryName = Country Name (2 letter code) countryName_min = 2 countryName_max = 2 commonName = Common Name (hostname, IP, or your name) commonName_max = 64 # Значения по умолчанию 0.organizationName_default = Turbogaz localityName_default = Kharkov stateOrProvinceName_default = Ukraine countryName_default = UA [ v3_ca ] basicConstraints = CA:TRUE subjectKeyIdentifier = hash authorityKeyIdentifier = keyid:always,issuer:always
Чтобы защитить себя, от попытки несанкционированного использования нашего CA сертификата мы защитим его паролем. Каждый раз, когда вы будете использовать CA сертификат для подписи запроса, у вас будут спрашивать этот пароль.
Итак, у нас все готово для создания нашего самоподписанного корневого сертификата.
# openssl req -new -x509 -extensions v3_ca -keyout private/rootCA.key -out rootCA.crt -days 1825 -config ./openssl.cnf Generating a 4096 bit RSA private key ... ... ... writing new private key to 'private/rootCA.key' Enter PEM pass phrase:******* Verifying - Enter PEM pass phrase:******* ----- You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----- Organization Name (company) [Turbogaz]: Organizational Unit Name (department, division) []:Turbogaz Security Division Email Address []:[email protected] Locality Name (city, district) [Kharkov]: State or Province Name (full name) [Ukraine]: Country Name (2 letter code) [UA]: Common Name (hostname, IP, or your name) []:Turbogaz Root CA
Также необходимо отозвать и заново подписать все сертификаты, подписанные просроченным корневым сертификатом. Это может занять очень много времени, поэтому вы, возможно, захотите указать большой период действия корневого сертификата (в нашем случае 1825 дней ~ 5 лет)
Поэтому у доверенных корневых центров сертификации период действия корневого сертификата, как правило, не менее 10 лет.
Просмотреть информацию о назначении сертификата можно с помощью следующей команды
# openssl x509 -in rootCA.crt -noout -purpose Certificate purposes: SSL client : Yes SSL client CA : Yes SSL server : Yes SSL server CA : Yes Netscape SSL server : Yes Netscape SSL server CA : Yes S/MIME signing : Yes S/MIME signing CA : Yes S/MIME encryption : Yes S/MIME encryption CA : Yes CRL signing : Yes CRL signing CA : Yes Any Purpose : Yes Any Purpose CA : Yes OCSP helper : Yes OCSP helper CA : Yes
Просмотреть информацию о периоде действия сертификата можно с помощью следующей команды
# openssl x509 -in rootCA.crt -noout -dates notBefore=May 8 15:44:20 2006 GMT notAfter=May 7 15:44:20 2011 GMT
Просмотреть информацию о сертификате можно с помощью следующей команды
# openssl x509 -in rootCA.crt -noout -text Certificate: Data: Version: 3 (0x2) Serial Number: f9:3c:b0:9d:41:6a:37:61 Signature Algorithm: md5WithRSAEncryption Issuer: O=Turbogaz, OU=Turbogaz Security Division/ [email protected], L=Kharkov, ST=Ukraine, C=UA, CN=Turbogaz Root CA Validity Not Before: May 8 15:44:20 2006 GMT Not After : May 7 15:44:20 2011 GMT Subject: O=Turbogaz, OU=Turbogaz Security Division/ [email protected], L=Kharkov, ST=Ukraine, C=UA, CN=Turbogaz Root CA Subject Public Key Info: Public Key Algorithm: rsaEncryption RSA Public Key: (4096 bit) Modulus (4096 bit): 00:ed:34:f1:54:ea:f4:0f:44:c8:58:22:78:6e:10: 70:d5:c0:bd:2f:ce:bb:ab:ac:85:21:a3:3f:e3:c4: 9c:ae:c6:09:82:92:82:9e:6e:50:08:d0:56:aa:ba: 79:5a:76:eb:db:f1:e8:d1:3c:0b:c9:ab:4d:c0:cc: d0:c1:ab:73:d5:25:86:98:99:03:e5:9b:0d:26:7b: b2:91:95:f3:da:84:1a:f9:d9:65:a9:f3:2f:0e:76: dd:af:f7:cc:c9:3c:f3:3a:26:5e:64:66:97:75:be: 9d:8b:a8:6a:9c:ea:53:43:c8:97:52:d8:82:73:0c: c2:98:9d:1a:6b:c5:6b:4e:73:07:29:0e:b4:cf:ef: af:38:de:f8:31:ac:2f:d1:a4:aa:36:ae:13:8b:5c: 1f:e5:0f:83:c8:46:8c:d8:f9:be:3f:88:0a:5d:72: 20:0a:33:da:78:f8:a6:f4:40:30:7c:c1:8b:c6:00: 25:b8:ba:7c:fe:16:f0:36:c9:f2:e3:cb:19:26:b7: db:cf:6e:dd:f9:2b:f5:11:82:e4:fc:6b:9d:2f:57: e6:ce:42:d9:bb:4d:bb:1b:38:97:4b:67:c7:a9:12: e0:6d:e0:5d:e7:36:62:fc:9a:b5:99:75:7e:d9:68: 41:23:44:f9:46:cf:c5:b5:3d:3b:5f:d7:cc:85:6a: 39:68:26:c4:95:e9:31:68:fd:5d:f9:c6:b3:a7:bd: 13:a8:17:db:f8:e5:42:99:52:57:dc:de:1d:9a:88: 7f:af:99:99:bb:e6:9b:5f:fc:e0:5c:4e:71:9b:2f: 50:7e:d9:80:9e:5d:d3:a2:85:4f:2f:b0:5f:a1:ae: 60:2b:4b:42:ae:cb:af:ef:6e:2e:2c:b5:70:69:a2: 88:d5:a1:3e:ff:de:3a:8a:38:16:6c:57:6a:a5:b7: de:1b:f3:8a:7f:45:2a:8d:9e:c8:c3:0c:b2:8c:bd: 76:01:ba:82:99:52:ad:82:b5:34:25:52:07:74:5c: 69:a5:2a:ff:ed:b8:28:96:4e:4e:58:24:26:0f:15: 6f:d3:97:de:87:84:b8:12:84:35:eb:ee:94:80:1d: 00:6a:3e:6b:8b:9e:66:e6:d5:ee:3d:98:69:40:6c: f4:97:6b:46:ae:3b:b3:36:8c:e3:45:b5:8f:9f:58: 93:ff:48:eb:27:5a:63:f4:9a:f3:72:f9:c3:26:92: 01:b2:bb:5d:ea:a9:d0:31:31:7b:6a:d4:2e:d5:e9: 7f:02:4c:03:f6:6c:8c:0b:57:90:b6:cc:f0:e4:ca: 29:85:8a:99:33:fd:a4:90:4a:58:2d:91:49:d1:26: 8c:ea:e6:d0:bc:5c:a6:03:5d:84:bb:37:56:f3:6b: 9f:df:57 Exponent: 65537 (0x10001) X509v3 extensions: X509v3 Basic Constraints: CA:TRUE X509v3 Subject Key Identifier: 5F:70:27:E5:B0:80:59:C9:1E:CC:94:5F:62:BD:54:03:29:B9:08:BF X509v3 Authority Key Identifier: keyid:5F:70:27:E5:B0:80:59:C9:1E:CC:94:5F:62:BD:54:03:29:B9:08:BF DirName:/O=Turbogaz/OU=Turbogaz Security Division/ [email protected]/L=Kharkov/ST=Ukraine/C=UA/ CN=Turbogaz Root CA serial:F9:3C:B0:9D:41:6A:37:61 Signature Algorithm: md5WithRSAEncryption 5c:ea:dd:f4:1b:fc:26:45:97:e9:5d:fc:5e:4d:8c:45:aa:6d: 4d:6f:43:60:af:e3:db:e7:eb:57:68:85:b9:0d:b4:8d:46:32: 63:0f:bd:88:11:44:d2:9b:36:c4:13:cc:53:6d:1c:cb:b9:72: fc:da:8a:f2:b0:92:d5:61:3f:1d:8f:59:14:aa:3b:8a:e2:b3: 84:24:42:ef:c1:fb:70:b3:77:88:6d:c3:b8:23:76:dd:98:0a: 98:97:33:44:51:7a:b6:66:05:ad:c9:64:8a:c2:43:3c:21:15: 43:69:21:02:2d:0a:d5:86:d9:bf:29:43:ea:ae:d7:bd:5c:d1: 36:e4:7e:22:ba:a6:f6:d0:5e:f8:73:a4:45:96:83:5f:a5:e3: 91:76:e7:33:a6:c1:34:c5:67:e6:95:81:45:ac:85:dd:82:9d: a2:a8:62:ef:c0:c4:80:df:f7:49:5a:6b:68:dd:f8:00:47:31: d8:67:60:2a:65:41:b2:e3:3b:53:07:27:88:88:ed:89:20:5e: eb:f3:f5:0a:d2:02:cc:12:9c:5d:c6:37:37:4f:f8:7a:2c:52: 3c:c1:68:cb:54:9b:de:51:27:08:95:67:c7:b0:6a:c8:a7:0a: 3c:d4:3a:07:4a:8b:6a:a9:d1:a0:76:8f:63:09:04:91:dd:bb: 7b:22:42:de:c8:07:ef:4a:05:8f:44:3d:4c:24:b4:e2:86:59: b1:f6:14:6a:7f:b2:e0:02:34:ce:d0:2b:cf:ee:4a:3f:23:4a: ae:2c:3d:7c:72:6f:c1:d0:a8:56:3a:83:f4:1a:08:c4:5a:21: 58:2e:23:f0:ff:bb:61:15:23:c8:71:40:33:25:5f:66:80:ba: a4:64:b9:aa:4a:ae:ce:e6:7f:21:64:38:16:81:27:f1:0c:95: 26:d7:8a:d1:9c:e0:da:70:6b:bb:9f:bc:0a:7e:2f:eb:23:b5: 95:ec:04:0a:47:ae:fc:04:7d:2f:12:c6:a6:94:24:88:cc:09: bd:c4:10:8d:48:16:ec:9e:57:07:12:97:77:b8:65:d2:e9:95: 8b:aa:d8:94:45:24:f5:4f:ec:a8:4a:03:7d:82:35:2b:36:80: 90:2a:26:31:35:40:b6:ea:8e:72:e6:7c:06:91:c2:4a:77:a3: fc:91:bc:ad:9d:d3:ff:59:8f:35:65:e3:d4:20:f1:c4:b4:db: a4:3d:f2:1e:ee:d2:80:92:e8:f4:f3:35:10:0e:dd:39:51:cf: 04:be:ba:14:6f:c3:f4:bd:e6:79:51:d5:d2:b6:c1:74:bb:7e: 1e:27:8c:ee:8a:51:a3:a8:5e:8b:fc:c3:e7:78:65:b3:83:31: fd:85:42:3a:df:b0:5d:73
В результате выполнения этой команды мы получили два файла:
rootCA.crt - это файл, который вы должны разослать вашим клиентам. Чтобы они добавили его в список доверенных корневых сертификатов. rootCA.key - этот файл вы не должны никому показывать.
Теперь, когда мы создали корневой сертификат, мы можем создать любое количество сертификатов для установки в ssl приложения, такие как http, ftp, pop, imap, stunnel и т.д.
Эта процедура состоит из создания закрытого ключа и запроса на подпись сертификата, а далее в подписи его нашим корневым сертификатом.
Для создания не корневых сертификатов нам необходимо внести изменения в наш конфигурационный файл. Добавьте следующие строчки в конец файла.
[ v3_req ] basicConstraints = CA:FALSE subjectKeyIdentifier = hash Чтобы часто не вводить данные в командную строку, добавьте следующую строку в секцию [ req ] после параметра distinguished_name. req_extensions = v3_req
Теперь мы готовы создать наш первый запрос на сертификат. В этом примере мы создадим сертификат для почтового сервера. Все шаги практически такие же, как и при создании CA сертификата. Но три поля имеют другое назначение, а именно:
# openssl req -new -nodes -out smtp.turbogaz.net.csr -keyout smtp.turbogaz.net.key -config ./openssl.cnf Generating a 4096 bit RSA private key ... ... ... writing new private key to 'smtp.turbogaz.net.key' ----- You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----- Organization Name (company) [Turbogaz]: Organizational Unit Name (department, division) []:Turbogaz SMTP Server Email Address []:[email protected] Locality Name (city, district) [Kharkov]: State or Province Name (full name) [Ukraine]: Country Name (2 letter code) [UA]: Common Name (hostname, IP, or your name) []:smtp.turbogaz.net
В результате выполнения этой команды мы получили два файла:
Эти файлы необходимо сохранить. Когда срок действия сертификата истечет, то запрос может быть использован снова для создания нового сертификата с новым сроком действия. Закрытый ключ конечно необходим для SSL кодирования.
Теперь нам необходимо добавить в наш конфигурационный файл секцию, которая отвечает за СА. Эта секция определяет пути к различным частям, таким как база данных, CA сертификат и закрытый ключ. Она также содержит некоторые базовые настройки. Добавьте следующие строчки в файл openssl.cnf перед секцией [ req ].
[ ca ] default_ca = CA_default [ CA_default ] serial = $dir/serial database = $dir/index.txt new_certs_dir = $dir/newcerts certificate = $dir/rootCA.crt private_key = $dir/private/rootCA.key default_days = 365 default_md = md5 preserve = no email_in_dn = no nameopt = default_ca certopt = default_ca policy = policy_match [ policy_match ] countryName = match stateOrProvinceName = match organizationName = match organizationalUnitName = optional commonName = supplied emailAddress = optional
Чтобы подписать запрос, созданный на предыдущем шаге, выполните следующую команду:
# openssl ca -out smtp.turbogaz.net.crt -config ./openssl.cnf -infiles smtp.turbogaz.net.csr Using configuration from ./openssl.cnf Enter pass phrase for ./private/rootCA.key:******* Check that the request matches the signature Signature ok The Subject's Distinguished Name is as follows organizationName :PRINTABLE:'Turbogaz' organizationalUnitName:PRINTABLE:'Turbogaz SMTP Server' localityName :PRINTABLE:'Kharkov' stateOrProvinceName :PRINTABLE:'Ukraine' countryName :PRINTABLE:'UA' commonName :PRINTABLE:'smtp.turbogaz.net' Certificate is to be certified until May 8 16:20:42 2007 GMT (365 days) Sign the certificate? [y/n]:y 1 out of 1 certificate requests certified, commit? [y/n]y Write out database with 1 new entries Data Base Updated
В результате выполнения этой команды мы получили два файла и обновили нашу БД:
Теперь вы можете проверить сертификат с помощью следующей команды
# openssl x509 -in smtp.turbogaz.net.crt -noout -text -purpose Certificate: Data: Version: 1 (0x0) Serial Number: 1 (0x1) Signature Algorithm: md5WithRSAEncryption Issuer: O=Turbogaz, OU=Turbogaz Security Division/ [email protected], L=Kharkov, ST=Ukraine, C=UA, CN=Turbogaz Root CA Validity Not Before: May 8 16:20:42 2006 GMT Not After : May 8 16:20:42 2007 GMT Subject: C=UA, ST=Ukraine, O=Turbogaz, OU=Turbogaz SMTP Server, CN=smtp.turbogaz.net Subject Public Key Info: Public Key Algorithm: rsaEncryption RSA Public Key: (4096 bit) Modulus (4096 bit): 00:e5:18:e3:71:c4:04:d0:95:55:dc:0b:f6:b9:dd: 13:fb:1b:84:93:c1:98:a9:cc:02:ed:6f:dc:b2:94: 98:e0:f0:8d:42:80:71:df:d7:47:d6:ad:6b:34:e1: e9:37:3d:75:a0:f2:a1:4f:92:15:9b:04:a8:5e:58: 3b:5d:72:e7:36:b0:07:e6:67:6e:57:6f:c6:39:82: 91:b9:dc:ec:62:49:d3:90:a5:2f:e5:00:58:5e:49: 7d:7f:5d:35:02:5c:15:be:1e:ec:d8:d8:02:ef:ac: 8c:7d:c0:a0:47:08:4a:c2:69:31:b9:6f:91:a4:9a: 3c:79:7b:da:fc:ea:19:61:bc:bf:ed:52:c8:10:69: 60:aa:4a:33:38:31:69:0c:8e:95:f6:c5:3b:cd:58: 4e:ba:e5:7a:1a:e4:2e:fd:bd:9f:73:fe:24:6d:1c: 88:1a:02:d3:d8:81:1b:00:9a:da:02:2f:4f:38:2d: 76:10:d8:36:05:f0:20:13:3c:41:d0:4b:e9:a2:b6: 5d:5d:f2:b2:fb:16:bd:41:44:c3:67:54:1f:f3:5c: 0b:56:51:45:5e:f9:39:86:50:5c:6c:25:89:e2:cc: e1:0c:42:a8:79:1e:b8:50:f3:99:a1:8b:46:e7:40: c2:4e:e5:ed:11:4e:61:ff:55:ef:47:f5:b7:82:f4: 3e:ab:bb:55:35:1e:11:f5:91:6e:e5:26:54:d7:36: a6:00:26:31:56:04:0f:f0:bc:32:ae:02:ea:63:1d: 9a:a5:fe:55:9d:32:f1:2e:e9:85:a4:72:75:ec:b5: 6c:9c:21:74:33:a9:74:cf:bc:9f:50:dc:d6:5d:bf: 5e:79:c6:f1:db:29:7b:ed:13:a2:e0:90:a2:51:79: bd:af:94:b1:73:38:11:98:ab:3c:b8:2d:5e:1e:84: 38:f7:e0:45:67:e8:09:c9:1f:83:35:7f:45:e3:26: ea:53:bb:43:63:07:d8:89:4e:b3:36:7a:b5:4e:93: d9:26:3f:4f:fc:b1:93:ac:32:5b:0e:41:9d:6c:18: 4c:7e:59:3e:87:7a:5d:c9:e0:39:30:42:e2:0b:b9: 10:db:31:95:3b:56:87:f3:8f:8e:0f:6a:71:00:f2: 66:b3:03:ad:ae:a3:a4:61:6d:e6:50:19:6b:9d:e9: 30:92:d3:6b:f6:53:9d:4f:7c:12:cb:f9:19:bf:b1: 14:42:d5:15:f8:01:34:40:4e:3c:b1:5e:c4:13:ce: 60:91:dc:91:b3:37:c0:83:3d:07:97:86:25:5f:14: 71:d9:29:f8:f0:71:bf:5a:cc:12:48:2a:08:d5:a8: 2c:d0:b9:07:c2:a4:b7:c8:88:34:61:0d:90:fe:5a: ce:1f:07 Exponent: 65537 (0x10001) Signature Algorithm: md5WithRSAEncryption 5e:53:3d:bd:f9:a2:3c:8b:2c:fa:52:c1:02:63:81:cf:72:71: 85:21:52:89:07:f1:d3:b0:9f:91:8e:f7:49:2c:5c:c9:cf:c2: ea:df:45:6f:ab:32:29:4a:1a:70:88:6f:99:14:bb:54:dd:b5: 50:38:3f:9e:28:e5:cc:65:da:33:89:73:48:9f:19:d8:b8:63: 93:00:97:4e:74:07:df:f8:7a:31:cd:24:ef:63:c6:08:f5:99: a4:c0:7c:9b:bf:b3:35:ae:ce:14:bd:92:86:d7:4d:09:58:91: b9:72:dd:96:60:e4:b8:60:bf:97:11:3a:04:33:87:d9:bd:1c: 33:ea:ea:72:8b:e0:72:c5:7b:6b:26:db:d4:28:ec:5b:e0:d7: b1:c7:e1:9a:e6:42:1c:51:2d:4d:10:0c:43:09:3d:8e:4b:72: e5:c5:59:03:7a:9b:16:cf:51:d4:26:25:9b:75:ca:85:81:c5: b1:41:87:b3:53:dd:49:4b:c1:94:b3:4f:88:19:e6:b7:c9:b1: 1d:09:ac:f3:ea:f3:eb:96:ba:31:f9:54:a8:e6:b9:ac:99:74: 79:3b:03:2b:b8:ca:3e:0b:60:69:b8:af:72:94:8e:14:29:bb: a5:b4:a6:ec:14:c1:92:a6:82:6e:d7:84:76:87:ab:f9:fd:ca: 8b:23:a1:1c:92:1a:c2:12:41:e3:1a:8b:61:0a:28:33:4d:51: b9:a1:41:cf:16:e7:02:d5:98:de:07:75:d9:cf:53:4f:0e:4e: 79:f6:6f:8d:f6:a9:21:71:8b:ae:b9:02:06:f1:d5:4c:ea:78: 04:4a:25:10:27:e7:1e:67:7b:53:70:f8:f0:7f:5d:2c:55:ee: 3b:a6:d1:20:96:28:1b:6a:39:61:be:cb:b4:b2:0f:1d:a2:0d: 1d:df:7b:b6:9b:f8:36:0c:8a:1e:3c:95:41:24:9e:7b:03:a0: 55:38:26:1e:0a:6e:77:56:f4:17:c1:be:26:cd:1c:9d:b5:de: 4e:76:1f:59:d4:13:34:71:b2:ec:ea:e3:e3:8c:86:75:82:18: de:f7:72:89:07:c6:7a:04:d4:4b:7a:7a:dc:f8:0c:77:1c:35: 0b:75:e7:e3:39:fe:68:54:da:04:2a:10:5b:13:44:e7:18:91: cd:22:98:52:21:28:ef:f9:44:64:f3:9c:0e:b6:bf:2a:62:2b: cc:62:03:f9:8d:52:13:74:0b:e5:cd:89:6b:29:1e:d0:1e:1f: d8:2c:6b:86:d0:7b:fd:34:09:96:b5:cf:4c:67:87:30:54:b1: b7:c1:15:15:bf:f8:8d:ca:df:b3:5c:6e:2f:d4:5c:24:b7:cd: 09:8a:29:4b:ab:cb:79:f4 Certificate purposes: SSL client : Yes SSL client CA : No SSL server : Yes SSL server CA : No Netscape SSL server : Yes Netscape SSL server CA : No S/MIME signing : Yes S/MIME signing CA : No S/MIME encryption : Yes S/MIME encryption CA : No CRL signing : Yes CRL signing CA : No Any Purpose : Yes Any Purpose CA : Yes OCSP helper : Yes OCSP helper CA : No
На данный момент сертификат содержит в себе две версии - закодированную и «удобную для восприятия».
Проверка корректности закрытого ключа
# openssl rsa -check -in test.key RSA key ok writing RSA key -----BEGIN RSA PRIVATE KEY----- MIIEpAIBAAKCAQEAswGJA98yFbc4rQ6maWiaC8aJHHgKe4F+uhTADXOahtRdXjCC ... mGAvUMZI1GDrmRnI4UVQ+z+sRFY5mNLogH4j2OU5W+VjzXMg10HDMQ== -----END RSA PRIVATE KEY-----
В случае проблем с ключом - вы получите сообщение вида
# openssl rsa -check -in test.key unable to load Private Key 139729410180760:error:0906D066:PEM routines:PEM_read_bio:bad end line:pem_lib.c:809: # openssl rsa -check -in test.key unable to load Private Key 140489218545304:error:0906D064:PEM routines:PEM_read_bio:bad base64 decode:pem_lib.c:823: # openssl rsa -check -in test.key unable to load Private Key 139895743596184:error:0D07209B:asn1 encoding routines:ASN1_get_object:too long:asn1_lib.c:147: 139895743596184:error:0D068066:asn1 encoding routines:ASN1_CHECK_TLEN:bad object header:tasn_dec.c:1185: 139895743596184:error:0D07803A:asn1 encoding routines:ASN1_ITEM_EX_D2I:nested asn1 error:tasn_dec.c:374:Type=PKCS8_PRIV_KEY_INFO 139895743596184:error:0907B00D:PEM routines:PEM_READ_BIO_PRIVATEKEY:ASN1 lib:pem_pkey.c:141:
Проверка того, что ssh private и public ключи принадлежат одной паре. Закрытый ключ
# openssl rsa -modulus -noout -in id_rsa Modulus=DD98184A25461E5B9E35A4DD3761F07C296414847B804D5795DEC890E3C20AAA5CED1D9E10A4BF73018882A4D88CEE479A013303DB542A3770D36345CAF2E10C4F30A6C841A1662DA286C5FA8373AB866A5286E9F6941925C3BFEE3E6F805162FD1BB25B20382480A3830420223BAE7E4AD0BBCD2079C0C961C129084F1DEC9E3D8DF108090A2FE3BE240D763AF16AA8C287E55E48EC454F88350770BB0157E440ABFC86FDC334A74DBA1742F6A751F7FD173251F1458324A48DD2197D9CA186147F902775A9E85BBE9761F2688AD14B79FC6876F93A604591CF6C45FE85AEBC3EF675F412E6466D223C1B9DA2C7EB0960B98D0FAF09C2F49CD9C02B78D909E67E475A3279A905D7A55F09AC8CE7725DA1D2E45690C50AEFD9E8297A3B6DDEA3C319CB7EB26AFE3902823F6885A1139CE9C0504B5B015D52DDDCC427B308792ADF8D00C22BFCF7FF5BF476B1BEAFE41B8D01767EE906E6314DD83DA8F8BCF43D5CCDFF774F9E42B8CB06A6C746703764944380DDBE66D434DA3BD408009BEB836475D2D39AE98485533CAA79FF3A4ECD03AAE7543527BD4241201EDDF9BF5CA66647F148429D8B5F3A64DD6110F6A28071E0BE8E74CC43CB3023C819B06A0D65F2752CA73C454DE0C7C7ED1812FDBEBA0E96234CA581323087B2C3107B899D4E2CCC7759001DE6A19BADA4C735EBA5595B4321EA3CFF7A70FE1F94C9A22863C7
Открытый ключ
# ssh-keygen -e -m PKCS8 -f id_rsa.pub | openssl rsa -pubin -modulus -noout Modulus=DD98184A25461E5B9E35A4DD3761F07C296414847B804D5795DEC890E3C20AAA5CED1D9E10A4BF73018882A4D88CEE479A013303DB542A3770D36345CAF2E10C4F30A6C841A1662DA286C5FA8373AB866A5286E9F6941925C3BFEE3E6F805162FD1BB25B20382480A3830420223BAE7E4AD0BBCD2079C0C961C129084F1DEC9E3D8DF108090A2FE3BE240D763AF16AA8C287E55E48EC454F88350770BB0157E440ABFC86FDC334A74DBA1742F6A751F7FD173251F1458324A48DD2197D9CA186147F902775A9E85BBE9761F2688AD14B79FC6876F93A604591CF6C45FE85AEBC3EF675F412E6466D223C1B9DA2C7EB0960B98D0FAF09C2F49CD9C02B78D909E67E475A3279A905D7A55F09AC8CE7725DA1D2E45690C50AEFD9E8297A3B6DDEA3C319CB7EB26AFE3902823F6885A1139CE9C0504B5B015D52DDDCC427B308792ADF8D00C22BFCF7FF5BF476B1BEAFE41B8D01767EE906E6314DD83DA8F8BCF43D5CCDFF774F9E42B8CB06A6C746703764944380DDBE66D434DA3BD408009BEB836475D2D39AE98485533CAA79FF3A4ECD03AAE7543527BD4241201EDDF9BF5CA66647F148429D8B5F3A64DD6110F6A28071E0BE8E74CC43CB3023C819B06A0D65F2752CA73C454DE0C7C7ED1812FDBEBA0E96234CA581323087B2C3107B899D4E2CCC7759001DE6A19BADA4C735EBA5595B4321EA3CFF7A70FE1F94C9A22863C7
Конвертация в формат pfx, который используется на IIS
# openssl pkcs12 -export -out domain.name.pfx -inkey domain.name.key -in domain.name.crt
Проверка SNI
# openssl s_client -connect site1.example.net:443 -servername site1.example.net
Проверка того, что CSR и сертификат подписаные одним и тем же приватным ключем
# openssl req -noout -modulus -in example.net.csr | openssl md5 (stdin)= 496d0967f7fab3d64e3ef9307f27046f # openssl rsa -noout -modulus -in example.net.key | openssl md5 (stdin)= 496d0967f7fab3d64e3ef9307f27046f # openssl x509 -noout -modulus -in example.net.crt | openssl md5 (stdin)= 496d0967f7fab3d64e3ef9307f27046f
Все md5 должны совпадать.
Для того, чтобы получить rootca с определенного сайта, необходимо выполнить
# openssl s_client -connect www.domain.com:443 | tee www.domain.com-rootca.txt # openssl x509 -inform PEM -in www.domain.com-rootca.txt -text -out www.domain.com-rootca.crt
Вы можете вырезать «удобную для восприятия» часть из сертификата, полученного на предыдущем шаге с помощью следующей команды:
# openssl x509 -in smtp.example.net.crt -out smtp.example.net.crt
Для того, чтобы убрать пароль с закрытого ключа (private key) выполните следующую команду. Например, это может понадобится при создании сертификата для postfix, т.к. в документации написано - «The private key must not be encrypted, meaning: the key must be accessible without password».
# openssl rsa -in server.key -out nopass.key writing RSA key
Для того, чтобы защитить секретный ключ паролем выполните следующую команду
# openssl rsa -des3 -in nopass.key -out pass.key
Если вы после этого посмотрите сам ключ в любом текстовом редакторе, то в самом начале ключа должны будут быть подобные строки:
# head -3 pass.key -----BEGIN RSA PRIVATE KEY----- Proc-Type: 4,ENCRYPTED DEK-Info: DES-EDE3-CBC,E4786E5109C67B86
Данные строки свидетельствуют о том, что данный ключ действительно зашифрован с помощью алгоритма DES3 (TripleDES).
Преобразование сертификата из DER формата в PEM
# openssl x509 -inform DER -in smtp.example.net.crt -outform PEM -out smtp.example.net.pem
Преобразование сертификата из PEM формата в DER
# openssl x509 -inform PEM -in smtp.example.net.pem -outform DER -out smtp.example.net.crt
Преобразование сертификата из формата PKS#10 (формат, используемый по умолчанию в openssl) в PKCS#12 (формат, используемый по умолчанию Microsoft).
# openssl pkcs12 -export -inkey smtp.example.net.key -in smtp.example.net.crt -out smtp.example.net.p12 -name "Petrov Ivan. Client certificate." Enter Export Password: ******* Verifying - Enter Export Password: *******
Преобразование сертификата из формата PKS#12 в PEM.
# openssl pkcs12 -in smtp.example.net.p12 -out smtp.example.net.pem Enter Import Password: ******* MAC verified OK Enter PEM pass phrase: ******* Verifying - Enter PEM pass phrase: *******
Генерация CSR с SAN (Subject Alternative Names)
В файле openssl.cnf в секцию v3_req добавляем следующую строку
subjectAltName = @alt_names
И описываем сами SAN в конце файла
[alt_names] DNS.1 = site-alt-name1.example.net DNS.2 = site-alt-name2.example.net DNS.3 = site-alt-name3.example.net
Генерируем CSR и приватный ключ
# openssl req -nodes -sha256 -newkey rsa:4096 -keyout example.net.key -out example.net.csr -config ./openssl-san.cnf
Проверка SSL сессии с удаленным SMTP сервером с использованием STARTTLS
# openssl s_client -starttls smtp -crlf -connect smtp.domain.com:25
Проверка SSL сессии с удаленным SMTP сервером
# openssl s_client -connect smtp.domain.com:465
При использовании команд openssl s_client избегайте использования символа R вначале строки, иначе будете получать сообщение об RENEGOTIATING
250 DSN helo www.example.net 250 mail.example.net mail from:<[email protected]> 250 2.1.0 Ok RCPT TO:<[email protected]> RENEGOTIATING depth=2 C = IL, O = StartCom Ltd., OU = Secure Digital Certificate Signing, CN = StartCom Certification Authority verify return:1 depth=1 C = IL, O = StartCom Ltd., OU = Secure Digital Certificate Signing, CN = StartCom Class 1 Primary Intermediate Server CA verify return:1 depth=0 description = G4V86y34KxXe0qbQ, C = US, CN = mail.example.net, emailAddress = [email protected] verify return:1 rcpt to:<[email protected]> 250 2.1.5 Ok data 354 End data with <CR><LF>.<CR><LF> Hello world . 250 2.0.0 Ok: queued as 4A52616021F quit 221 2.0.0 Bye closed
Либо используйте опцию -quiet для избежания подобного поведения
# openssl s_client -starttls smtp -crlf -quiet -connect mail.example.net:25 depth=2 C = IL, O = StartCom Ltd., OU = Secure Digital Certificate Signing, CN = StartCom Certification Authority verify return:1 depth=1 C = IL, O = StartCom Ltd., OU = Secure Digital Certificate Signing, CN = StartCom Class 1 Primary Intermediate Server CA verify return:1 depth=0 description = G4V86y34KxXe0qbQ, C = US, CN = mail.example.net, emailAddress = [email protected] verify return:1 250 DSN helo www.example.net 250 mail.example.net mail from:<> 250 2.1.0 Ok RCPT TO:<[email protected]> 250 2.1.5 Ok data 354 End data with <CR><LF>.<CR><LF> Hellow world 2 . 250 2.0.0 Ok: queued as 65B4616021F quit 221 2.0.0 Bye
[1] openssl
[2] ssl-cert-howto
[3] Vsevolod A. Stakhov/CEBKA. "Основы работы с OpenSSL".
[4] Paul Albitz and Cricket Liu. DNS and BIND. O'Reilly. Fourth edition.
# Задаем рабочую директорию dir = . [ ca ] default_ca = CA_default [ CA_default ] serial = $dir/serial database = $dir/index.txt new_certs_dir = $dir/newcerts certificate = $dir/rootCA.crt private_key = $dir/private/rootCA.key default_days = 365 default_md = md5 preserve = no email_in_dn = no nameopt = default_ca certopt = default_ca policy = policy_match [ policy_match ] countryName = match stateOrProvinceName = match organizationName = match organizationalUnitName = optional commonName = supplied emailAddress = optional # В данной секции описываются основные опции [ req ] # Длина ключа в битах default_bits = 4096 # Алгоритм шифрования default_md = md5 # Разрешенные символы string_mask = nombstr # Указываем, что DN (Distinguished Name) будет описана в секции req_distinguished_name distinguished_name = req_distinguished_name req_extensions = v3_req # В данной секции указываются данные, которые будут использоваться # по умолчанию при генерации запроса на подписание сертификата [ req_distinguished_name ] 0.organizationName = Organization Name (company) organizationalUnitName = Organizational Unit Name (department, division) emailAddress = Email Address emailAddress_max = 40 localityName = Locality Name (city, district) stateOrProvinceName = State or Province Name (full name) countryName = Country Name (2 letter code) countryName_min = 2 countryName_max = 2 commonName = Common Name (hostname, IP, or your name) commonName_max = 64 # Значения по умолчанию 0.organizationName_default = Turbogaz localityName_default = Kharkov stateOrProvinceName_default = Ukraine countryName_default = UA [ v3_ca ] basicConstraints = CA:TRUE subjectKeyIdentifier = hash authorityKeyIdentifier = keyid:always,issuer:always [ v3_req ] basicConstraints = CA:FALSE subjectKeyIdentifier = hash