Создание сертификата TLS для сервера
====================================

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

Начнем с создания запроса на подпись сертификата X.509. Файл настроек не нужен, можно просто ввести:

       $ gpgsm --generate-key >example.com.cert-req.pem
       Выберите тип ключа:
          (1) RSA
          (2) Имеющийся ключ
          (3) Имеющийся на карте ключ
       Ваш выбор? 1

Я выбрал создание ключа RSA. Другой вариант — воспользоваться уже существующим ключом, выбрав 2 и введя так называемый код ключа. Этот код вам покажет команда gpgsm --dump-secret-key идентификатор пользователя. Если выбрать 3, программа выведет другое меню для создания сертификата непосредственно из ключа, хранящегося на электронной карте.

Продолжим:

       Какой размер ключа Вам необходим? (2048)
       Запрошенный размер ключа - 2048 бит

Нажав «Enter», вы создадите обычный ключ RSA размером 2048 бит. Ключи меньшей длины для нынешнего Интернета слишком слабы. Если выбрать более длинный (более сильный) ключ, у сервера будет больше работы.

       Возможные действия для ключа RSA:
          (1) подпись, шифрование
          (2) подпись
          (3) шифрование
       Ваш выбор? 1

Если выбрать «подпись», ключ можно будет применять в механизмах обмена ключами Диффи-Хеллмана (DHE и ECDHE) в TLS, что предпочтительно, поскольку предлагает секретность в прямом направлении. Если выбрать «шифрование», ключ можно будет применять для механизмов обмена ключами RSA, которые до сих пор кое-где обычны. Если выбрать и то, и другое, можно будет пользоваться всеми механизмами обмена.

Теперь введем данные:

       Введите имя субъекта X.509: CN=example.com

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

       Введите адреса электронной почты
       (завершите пустой строкой):
       >

В сертификате TLS эти адреса не нужны, и удостоверяющий центр все равно проигнорировал бы их. Просто нажмите «Enter».

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

       Введите имена DNS
       (необязательно; завершите пустой строкой):
       > example.com
       > www.example.com
       >

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

       Введите URI:
       (необязательно; завершите пустой строкой):
       >

Можно вводить произвольные URI; для сертификата сервера они не имеют смысла.

       Создать самозаверенный сертификат? (y/N)

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

Итак, мы ввели все нужные данные, и программа gpgsm покажет, что она собрала, и спросит, нужно ли создавать запрос на подпись сертификата:

       Используются параметры:
           Key-Type: RSA
           Key-Length: 2048
           Key-Usage: sign, encrypt
           Name-DN: CN=example.com
           Name-DNS: example.com
           Name-DNS: www.example.com
       Продолжить создание? (y/N) y

Теперь gpgsm приступит к созданию запроса. Поскольку это сопряжено с созданием ключа RSA, это может занять некоторое время. За это время вас трижды попросят ввести фразу-пароль для защиты создаваемого секретного ключа в вашей системе. Будет появляться окно, в котором вас будут просить ввести его. Первые два запроса — для новой фразы-пароля и повторения его; третий нужен, чтобы создать запрос подписи сертификата.

По завершении вы должны увидеть сообщение:

       Готово. Данный запрос теперь следует передать в удостоверяющий центр.

Теперь заглянем в созданный запрос на подпись сертификата:

       $ cat example.com.cert-req.pem
       -----BEGIN CERTIFICATE REQUEST-----
       MIIClTCCAX0CAQAwFjEUMBIGA1UEAxMLZXhhbXBsZS5jb20wggEiMA0GCSqGSIb3
       DQEBAQUAA4IBDwAwggEKAoIBAQDP1QEcbTvOLLCX4gAoOzH9AW7jNOMj7OSOL0uW
       h2bCdkK5YVpnX212Z6COTC3ZG0pJiCeGt1TbbDJUlTa4syQ6JXavjK66N8ASZsyC
       Rwcl0m6hbXp541t1dbgt2VgeGk25okWw3j+brw6zxLD2TnthJxOatID0lDIG47HW
       GqzZmA6WHbIBIONmGnReIHTpPAPCDm92vUkpKG1xLPszuRmsQbwEl870W/FHrsvm
       DPvVUUSdIvTV9NuRt7/WY6G4nPp9QlIuTf1ESPzIuIE91gKPdrRCAx0yuT708S1n
       xCv3ETQ/bKPoAQ67eE3mPBqkcVwv9SE/2/36Lz06kAizRgs5AgMBAAGgOjA4Bgkq
       hkiG9w0BCQ4xKzApMCcGA1UdEQQgMB6CC2V4YW1wbGUuY29tgg93d3cuZXhhbXBs
       ZS5jb20wDQYJKoZIhvcNAQELBQADggEBAEWD0Qqz4OENLYp6yyO/KqF0ig9FDsLN
       b5/R+qhms5qlhdB5+Dh+j693Sj0UgbcNKc6JT86IuBqEBZmRCJuXRoKoo5aMS1cJ
       hXga7N9IA3qb4VBUzBWvlL92U2Iptr/cEbikFlYZF2Zv3PBv8RfopVlI3OLbKV9D
       bJJTt/6kuoydXKo/Vx4G0DFzIKNdFdJk86o/Ziz8NOs9JjZxw9H9VY5sHKFM5LKk
       VcLwnnLRlNjBGB+9VK/Tze575eG0cJomTp7UGIB+1xzIQVAhUZOizRDv9tHDeaK3
       k+tUhV0kuJcYHucpJycDSrP/uAY5zuVJ0rs2QSjdnav62YrRgEsxJrU=
       -----END CERTIFICATE REQUEST-----
       $

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

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

     $ gpgsm --import

и вставьте в терминале сертификат со страницы удостоверяющего центра, а затем нажмите Ctrl-D.

       -----BEGIN CERTIFICATE-----
       MIIEIjCCAgqgAwIBAgIBTDANBgkqhkiG9w0BAQQFADBUMRQwEgYDVQQKEwtDQWNl
        [...]
       rUTFlNElRXCwIl0YcJkIaYYqWf7+A/aqYJCi8+51usZwMy3Jsq3hJ6MA3h1BgwZs
       Rtct3tIX
       -----END CERTIFICATE-----
       gpgsm: не найден сертификат издателя: #/CN=CAcert Class 3 Ro[...]
       gpgsm: сертификат импортирован

       gpgsm: всего обработано: 1
       gpgsm:    импортировано: 1

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

Чтобы просмотреть содержимое своего сертификата, можно ввести:

       $ gpgsm -K example.com
       /home/foo/.gnupg/pubring.kbx
       ---------------------------
                 S/N: 4C
              Issuer: /CN=CAcert Class 3 Root/OU=http:\x2f\x2fwww.[...]
             Subject: /CN=example.com
                 aka: (dns-name example.com)
                 aka: (dns-name www.example.com)
            validity: 2015-07-01 16:20:51 through 2016-07-01 16:20:51
            key type: 2048 bit RSA
           key usage: digitalSignature keyEncipherment
       ext key usage: clientAuth (suggested), serverAuth (suggested), [...]
         fingerprint: 0F:9C:27:B2:DA:05:5F:CB:33:D8:19:E9:65:B9:4F:BD:B1:98:CC:57

Я ввел параметр -K, чтобы перечислить только сертификаты, для которых есть секретный ключ. Если вместо -K ввести --dump-secret-keys, будет выведено больше подробностей.

Чтобы пользоваться сертификатом, надо его установить на своем сервере. Серверные программы обычно работают с файлом PKCS\#12, в котором записан ключ и сертификат. Такой файл создается командой:

       $ gpgsm --export-secret-key-p12 -a >example.com-cert.pem

Будет запрошена фраза-пароль, а также новая фраза-пароль для защиты файла PKCS\#12. Теперь в файле записан сертификат и секретный ключ:

       $ cat example-cert.pem
       Issuer ...: /CN=CAcert Class 3 Root/OU=http:\x2f\x2fwww.CA[...]
       Serial ...: 4C
       Subject ..: /CN=example.com
           aka ..: (dns-name example.com)
           aka ..: (dns-name www.example.com)

       -----BEGIN PKCS12-----
       MIIHlwIBAzCCB5AGCSqGSIb37QdHAaCCB4EEggd9MIIHeTk1BJ8GCSqGSIb3DQEu
       [...много других строк...]
       -----END PKCS12-----
       $

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