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

Материал из ISPWiki

Перейти к: навигация, поиск

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

Модуль состоит из двух частей:

  • XML файл, описывающий необходимые сообщения и поведение интерфейса формы добавления центра выдачи сертификатов в BILLmanager
  • Исполняемый файл модуля, отвечающий за выполнение всех операций по обработке заказов сертификатов

Содержание

XML файл модуля

XML файл модуля должен располагаться в каталоге /usr/local/ispmgr/etc/ и иметь имя вида billmgr_mod_xxx.xml. После создания файла и любых его правок необходим перезапуск BILLmanager. Если изменения в XML файле не отражаются в интерфейсе, скорее всего, в файле допущена какая-либо ошибка. Проверить наличие ошибок можно выполнив команду:

/usr/local/ispmgr/sbin/xmlcache billmgr

XML документ должен содержать следующие части:

  • Описание поведения полей на форме добавления центра выдачи сертификатов
  • Текст, заменяющий наименование модуля в интерфейсе редактирования центра выдачи сертификатов
  • Текст, заменяющий наименование модуля в интерфейсе списка центров выдачи сертификатов
  • Текст, заменяющий наименование шаблонов в интерфейсе редактирования шаблона сертификата центра выдачи сертификатов
  • Текст, заменяющий наименование шаблонов в интерфейсе списка шаблонов сертификатов центра выдачи сертификатов
  • Текст, заменяющий наименование шаблонов в списке сертификатов

Примерная структура XML файла

<?xml version="1.0" encoding="UTF-8"?>
<mgrdata>
        <metadata name="certauth.edit" type="form">
                <form>
                        <field name="name">
                                <select name="name" sorted="yes">
                                        <if value="template" show="'admingroup','usr','pwd','apiurl'" hide="'partnercode','resellerid','ipaddr','usedemo','handle','server'"/>
                                </select>
                        </field>
                </form>
        </metadata>
        <lang name="ru">
                <messages name="certauth.edit">
                        <msg name="template.php">Template</msg>
                </messages>

                <messages name="certauth">
                        <msg name="name_template.php">Template</msg>
                </messages>
 
                <messages name="certauth.templates">
                        <msg name="certtype_type_1">Type 1</msg>
                        <msg name="certtype_type_2">Type 2</msg>
                        <msg name="certtype_type_3">Type 3</msg>
                </messages>

                <messages name="certauth.templates.edit">
                        <msg name="type_1">Type 1</msg>
                        <msg name="type_2">Type 2</msg>
                        <msg name="type_3">Type 3</msg>
                </messages>

                <messages name="certificate">
                       <msg name="certauth_template.php">Template</msg>
                       <msg name="certtype_type_1">Type 1</msg>
                       <msg name="certtype_type_2">Type 2</msg>
                       <msg name="certtype_type_3">Type 3</msg>
               </messages>
</mgrdata>

Исполняемый файл модуля

Исполняемый файл модуля должен располагаться в каталоге /usr/local/ispmgr/sbin/ и иметь наименование вида caxxx, где xxx - произвольное наименование. Если вы планируете использовать один из скриптовых языков программирования (php, perl и т.д.), то желательно добавить расширение к имени файла. В этом случае переменная окружения LD_LIBRARY_PATH будет сброшена перед запуском модуля. Пример наименования файла (используемый в данной статье) /usr/local/ispmgr/sbin/catemplate.php

Для возможности использования модуля в BILLmanager он должен поддерживать обработку следующих команд:

  • checkaccess - проверка доступа к API с указанными параметрами. Параметры: имя_пользователя - имя пользователя или другой идентификатор, для которого проверяется доступность API, url - URL доступа к API. Пароль передается модулю на стандартный ввод. В случае успешного выполнения проверки доступности API с указанными параметрами нужно передать строку "OK" (без кавычек) на стандартный поток вывода.
  • buildtemplate - построение списка доступных типов сертификатов. Принимает в качестве параметра код центра выдачи сертификатов. Для выполнения функции необходимо считать из стандартного ввода XML, добавить в него имеющиеся типы сертификатов и вернуть в стандартный вывод. Добавление списка типов производится путем построения списка и заполнения его элементами. Такой список выглядит следующим образом:
<slist name='certtype'>
        <msg>type_1</msg>
        <msg>type_2</msg>
        <msg>type_3</msg>
        ...
        <msg>type_n</msg>
</slist>

и добавляется к корневому элементу XML документа.

  • gettemplprops - получения параметров по умолчанию для типа сертификата. Параметры: наименование_типа_сертификата, код_центра выдачи сертификатов. На основе полученных параметров модуль должен сформировать XML документ, содержащий список поддерживаемых данным типом параметров по умолчанию. XML документ имеет следующий вид:
<?xml version="1.0" encoding="UTF-8"?>
<doc>
        <prop>wildcard</prop>
        <prop>extvalid</prop>
        <prop>orginfo</prop>
        <prop>idn</prop>
        <prop>www</prop>
        <prop>multidomain</prop>
</doc>

Если будет производиться ручная настройка параметров шаблона, можно вернуть пустой XML документ: "<?xml version="1.0" encoding="UTF-8"?><doc/>".

<prop>wildcard</prop> - добавляется к XML документу, если данный тип поддерживает заказ Wildcard сертификатов.

<prop>extvalid</prop> - добавляется к XML документу, если данный тип использует расширенную проверку.

<prop>orginfo</prop> - добавляется к XML документу, если данный тип требует указание данных организации.

<prop>idn</prop> - добавляется к XML документу, если данный тип поддерживает выпуск сертификатов на IDN домены.

<prop>multidomain</prop> - добавляется к XML документу, если данный тип поддерживает заказ сертификатов с указание альтернативных имен.

<prop>www</prop> - добавляется к XML документу, если данный тип поддерживает заказ сертификатов на домен, начинающийся с "www.", и при этом будет действовать для домена без "www."

  • approverlist - получение списка доступных Email адресов для подтверждения сертификата. Параметры: доменное_имя, код_шаблона_сертификата. Данную команду можно не обрабатывать. В этом случае будет использован стандартный список Email адресов. После выполнения команды необходимо вернуть в стандартный поток вывода список разрешенных Email адресов, разделенных знаком переноса строки.
  • new - отправка заказа на сертификат. Параметры: код_услуги.
  • check - проверка статуса заказа на сертификат. Параметры: код_услуги.
  • renew - отправка заказа на продление сертификата. Параметры: код_услуги.
  • reissue - отправка заказа на перевыпуск сертификата. Параметры: код_услуги.

После завершения одной из трех вышеописанных команд модуль должен передать BILLmanager результат выполнения операции. Делается это вызовом функции certificate.process BILLmanager. Функция принимает следующие параметры:

  • itemid - обязательный параметр, содержащий код услуги.
  • result - обязательный параметр, содержащий результат выполнения операции. Может принимать одно из следующий значений:
    • created - означает, что заказ на сертификат создан в центре сертификации. Соответствует статусу "Заказан в CA" в интерфейсе BILLmanager.
    • enrolled - означает, что заказ на сертификат принят на обработку в центре сертификации. Соответствует статусу "Ожидает выпуска" в интерфейсе BILLmanager.
    • renewed - означает, что заказ на продление сертификата принят в центре сертификации. Соответствует статусу "Ожидает выпуска" в интерфейсе BILLmanager.
    • issued - означает, что сертификат выпущен в центре сертификации. Соответствует статусу "Выпущен" в интерфейсе BILLmanager.
    • reissued - означает, что сертификат перевыпущен в центре сертификации. Соответствует статусу "Выпущен" в интерфейсе BILLmanager.
    • error - означает, что заказ на сертификат завершился ошибкой. Соответствует статусу "Ошибка заказа" в интерфейсе BILLmanager. В случае передачи в result данного параметра заказ на сертификат будет отменен в BILLmanager, и средства будут возвращены на счет клиента.
  • message - смысл передаваемого в параметре значения зависит от параметра result:
    • result = created - параметр содержит код сертификата в центре выдачи сертификатов. Может потребоваться при проверке статуса заказа на сертификат.
    • result = enrolled - не обрабатывается.
    • result = renewed - не обрабатывается.
    • result = reissued - не обрабатывается.
    • result = issued - содержит текстовое представление выпущенного сертификата.
    • result = error - содержит наименование операции, которая выполнялась при возникновении ошибки. Если операция была new или renew или передан параметр forcerallback со значением yes (с версии 4.0.74) заказ на сертификат отменяется в BILLmanager, средства списанные со счета клиента возвращаются, а клиенту отправляется уведомление об ошибке.
  • errormsg - содержит информацию о возникшей в процессе заказа ошибке.
  • validto - содержит срок действия сертификата. Обрабатывается при передаче issued в качестве result.

Структура данных связанных с обработкой заказов на сертификаты

Услуга связана с шаблоном сертификата через таблицу pricelist, поле certtmpl.

Данные сертификата хранятся в таблице certificate

  • pid - ссылка на item
  • csr - текстовое предствалене запроса на сертификат
  • crt - текстовое представление сертификата
  • pkey - тестовое представление закрытого ключа
  • adm_fname - имя административного контакта
  • adm_lname - фамилия административного контакта
  • adm_jtitle - должность административного контакта
  • adm_phone - телефон административного контакта
  • adm_email - email административного контакта
  • tech_fname - имя технического контакта
  • tech_lname - фамилия технического контакта
  • tech_jtitle - должность технического контакта
  • tech_phone - телефон технического контакта
  • tech_email - email технического контакта
  • org_name - наименование организации
  • org_country - код страны организации (ссылка на справочник)
  • org_state - регион/штат размещения организации
  • org_city - город размещения организации
  • org_postcode - индекс организации
  • org_address - адрес организации
  • org_phone - телефон организации
  • vemail - email адрес подтверждения
  • status - статус сертификата:

0-не известно, 1-заказан, 2-оплачен, 3-заказан в CA, 4-ожидает выпуска, 5-выпущен, 6-ошибка

  • caorderid - код заказа в центре выдачи сертификатов
  • fqdn - доменное имя (в данный используется только для заказа GlobalSign Onclick сертификатов, в других случаях доменное имя необходимо получать из поля CN запроса на сертификат)

Данные шаблона сертификата хранятся в таблице certtmpl

  • id - код
  • name - наименование
  • certauth - ссылка на центр выдачи сертификатов
  • wildcard - признак поддержки wildcard
  • orginfo - признак необходимости информации об организации
  • extvalid - признак наличия расширенной проверки
  • longkey - признак требования по длине ключа в 2048 байт
  • idn - признак поддержки IDN доменов
  • multidomain - признак поддержки альтернативных имен
  • www - признак поддержки заказе сертификата на домен с www
  • certtype - наименование типа сертификата

Данные центра выдачи сертификатов хранятся в таблице certauth

  • id - код
  • name - модуль обработки
  • account - ссылка на провайдерский или партнерский аккаунт
  • username - имя пользователя
  • password - пароль
  • admingroup - ссылка на ответственный отдел
  • apiurl - URL доступа
  • partnercode - код партнера (используется в некоторых модулях)
  • ipaddr - IP адрес (используется в некоторых модулях)
  • usedemo - признак тестового доступа

Пример скрипта на php

#!/usr/bin/php
<?php
       $LOG_FILE = fopen("/usr/local/ispmgr/var/catemplate.php.log", "a");

       function Debug($log_str) {
          fwrite($GLOBALS["LOG_FILE"], date("M d H:i:s")." [".posix_getpid()."] ".$log_str."\n");
       }

       function defErrorHandler($errno, $errstr, $errfile, $errline) {
               if (!(error_reporting() & $errno)) {
                       return;
               }
               Debug($errfile.":".$errline." Error: ".$errno.", error message: ".$errstr);
               return true;
       }

       function userga() {
               echo "Template CA File.";
       }

       if ($argc<2) {
               usage();
       } else {
               switch($argv[1]) {
                       case "checkaccess":
                               $user = $argv[2];
                               $pass = file_get_contents("php://stdin");
                               if ($user == "test" && $pass == "test")
                                       echo "OK";
                               else 
                                       echo "Not test";
                               break;
                       case "buildtemplate":
                               $xml_doc = file_get_contents("php://stdin");
                               $xmldata = new SimpleXMLElement($xml_doc);
                               $slist = $xmldata->addChild("slist");
                               $slist->addAttribute("name", "certtype");
                               $slist->addChild("msg", "type_1");
                               $slist->addChild("msg", "type_2");
                               $slist->addChild("msg", "type_3");
                               echo $xmldata->asXML();
                               break;
                       case "gettemplprops":
                               $xmldata = simplexml_load_string("<?xml version='1.0'?><doc/>");
                               $type = $argv[2];
                               switch ($type) {
                                       case "type_1":
                                               $xmldata->addChild("prop", "wildcard");
                                               $xmldata->addChild("prop", "idn");
                                               $xmldata->addChild("prop", "www");
                                               break;
                                       case "type_2":
                                               $xmldata->addChild("prop", "idn");
                                               $xmldata->addChild("prop", "orginfo");
                                               $xmldata->addChild("prop", "extvalid");
                                               break;
                                       case "type_3":
                                               break;
                               }
                               echo $xmldata->asXML();
                               break;
                       case "approverlist":
                               $domain = $argv[2];
                               $type = $argv[3];
                               echo "root@".$domain;
                               break;
                       case "new":
                               $iid = $argv[2];
                               //Process order
                               break;
                       case "check":
                               $iid = $argv[2];
                               //process check
                               break;
                       case "renew":
                               $iid = $argv[2];
                               //process renew
                               break;
                       case "reissue":
                               $iid = $argv[2];
                               //process reissue
                               break;
               }
        }
?>
Была ли эта информация полезной? Да | Нет
Личные инструменты