Как добавить расширенную строку использования ключа при создании самозаверяющего сертификата с использованием openssl

10

Я использую openssl в Mac OS X 10.9 для создания самозаверяющего сертификата для служб удаленных рабочих столов Windows Server.

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

   openssl req -x509 -nodes -days 365 -newkey rsa:4096 -keyout myserver.key -out myserver.crt

Однако мне нужно добавить строку использования расширенного ключа Server Authentication (1.3.6.1.5.5.7.3.1), и я не могу понять, как это сделать в приведенной выше команде.

Я попытался использовать опцию openssl -extfile с файлом, содержащим это,

[= default ]
extendedKeyUsage = 1.3.6.1.5.5.7.3.1

Тем не менее, я получаю сообщение об ошибке «опция -extfile не найдена»

Джошу
источник
1
(CLI) файлы конфигурации openssl убедили меня, что было проще написать код для генерации сертификатов, которые я хотел. Я использовал golang, но думаю, вы могли бы использовать openssl clib.
Ритмичный Фистман

Ответы:

9

При openssl x509использовании -extfileкоманды, которую вы используете openssl req, необходимо -configуказать файл конфигурации.

Итак, вы можете использовать команду, подобную этой:

openssl req -x509 -config cert_config -extensions 'my server exts' -nodes \
            -days 365 -newkey rsa:4096 -keyout myserver.key -out myserver.crt

Обычные подсказки для битов отличительного имени определены в файле конфигурации по умолчанию (который, вероятно, /System/Library/OpenSSL/openssl.cnfв OS X), но этот файл не обрабатывается при использовании -config, поэтому ваш файл конфигурации должен также включать некоторые биты DN. Таким образом, вышеприведенная ссылка cert_configможет выглядеть примерно так:

[ req ]
prompt             = no
distinguished_name = my dn

[ my dn ]
# The bare minimum is probably a commonName
            commonName = secure.example.com
           countryName = XX
          localityName = Fun Land
      organizationName = MyCo LLC LTD INC (d.b.a. OurCo)
organizationalUnitName = SSL Dept.
   stateOrProvinceName = YY
          emailAddress = ssl-admin@example.com
                  name = John Doe
               surname = Doe
             givenName = John
              initials = JXD
           dnQualifier = some

[ my server exts ]
extendedKeyUsage = 1.3.6.1.5.5.7.3.1
# 1.3.6.1.5.5.7.3.1 can also be spelled serverAuth:
# extendedKeyUsage = serverAuth

# see x509v3_config for other extensions

Как указано в комментарии, вы, вероятно, можете пропустить большинство полей DN. Для использования HTTPS, я думаю, все, что вам нужно, это CN, который соответствует вашему имени хоста.


В разделе «Формат выделенного имени и атрибута» в req (1) показано, как можно изменить вышеуказанную конфигурацию, чтобы запрашивать значения (и предоставлять значения по умолчанию), если вы хотите создать несколько похожих сертификатов / запросов.

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

Крис Джонсен
источник
1
Если вы просто генерируете CSR с помощью этой командной строки, то используйте -reqexts 'my server exts', чтобы запросить, чтобы CA позже генерировал сертификат с использованием расширенного ключа аутентификации сервера.
memetech