Выполнение POST-запроса по протоколу HTTPS на платформе 8.2 на примере Yandex.API

Выполнение POST-запроса на примере Yandex.API
Выполнение GET-запроса на примере Яндекс.API

Теперь сервис Яндекс.Геокодер работает по протоколу HTTPS (расширенная версия протокола HTTP, который поддерживает шифрование). Вызов принят, 1С вызываю тебя!

Танцы с бубном вокруг файла cacert.pem


Что бы с помощью платформы 1С выполнить HTTPS-запрос методом POST, необходимо в файл cacert.pem добавить информацию о корневом сертификате сервиса, на который выполняется запрос, иначе запрос будет завершаться ошибкой:
Peer certificate cannot be authenticated with known CA certificates

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

Добавление информации о корневом сертификате


Важно! Все сертификаты из цепочки необходимо добавлять в файл cacert.pem

1. Скачать подходящий дистрибутив с сайта Win32OpenSSL, например, для 64 разрядной ОС Win64OpenSSL_light последней версии.

2. После установки дистрибутива, указываем переменную, для этого необходимо в командной строке от имени администратора ввести команду:
set OPENSSL_CONF=C:\OpenSSLWin64\bin\openssl.cfg

3. В адресной строке браузера вводим URL (например, https://geocode-maps.yandex.ru/) где можно просмотреть сертификат. Открываем просмотр цепочки сертификатов, нажав на замочек, отображаемый в адресной строке.
1. Просмотр сертификатов защищенного узла

4. Сохраняем каждый сертификат из цепочки. Для этого открываем сертификат и на закладке Состав жмем на кнопку Скопировать в файл.
2. Сохранение сертификата в файл
Сертификаты сохраняем в формате X.509 (.CER) в кодировке DER. Повторяем для всех сертификатов цепочки. Главное, что бы сертификат был сохранен в кодировке DER.

5. В командной строке вводим команду:
С:\OpenSSLWin64\bin>openssl x509 -inform der -in С:\pem\CertumCA.cer -out C:\pem\textCertumCA.pem -text -fingerprint -md5

После выполнения команды на экране отображается информация о сертификате и MD5 Fingerprint.
3. Информация о сертификате в формате ASN.1
Через пометить выбираем полученный результат, копируем и добавляем в конец файла
C:\Program Files (x86)\1cv82\8.2.18.109\bin\cacert.pem.

6. Добавленный результат форматируем следующим образом:
  • Заголовок - береv из информации о сертификате значение свойства CN, в нашем случает Certum CA;
  • Переносим MD5 Fingerprint под заголовок;
  • Информацию о сертификате оставляем без изменений;
  • Добавляем после инф. о сертификате содержимое файла textCertumCA.pem.
В итоге должно получиться следующее:

Certum CA
==============

MD5 Fingerprint=2C:8F:9F:66:1D:18:90:B1:47:26:9D:8E:86:82:8C:A9
Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number: 65568 (0x10020)
        Signature Algorithm: sha1WithRSAEncryption
        Issuer: C=PL, O=Unizeto Sp. z o.o., CN=Certum CA
        Validity
            Not Before: Jun 11 10:46:39 2002 GMT
            Not After : Jun 11 10:46:39 2027 GMT
        Subject: C=PL, O=Unizeto Sp. z o.o., CN=Certum CA
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
            RSA Public Key: (2048 bit)
                Modulus (2048 bit):
                    00:ce:b1:c1:2e:d3:4f:7c:cd:25:ce:18:3e:4f:c4:
                    8c:6f:80:6a:73:c8:5b:51:f8:9b:d2:dc:bb:00:5c:
                    b1:a0:fc:75:03:ee:81:f0:88:ee:23:52:e9:e6:15:
                    33:8d:ac:2d:09:c5:76:f9:2b:39:80:89:e4:97:4b:
                    90:a5:a8:78:f8:73:43:7b:a4:61:b0:d8:58:cc:e1:
                    6c:66:7e:9c:f3:09:5e:55:63:84:d5:a8:ef:f3:b1:
                    2e:30:68:b3:c4:3c:d8:ac:6e:8d:99:5a:90:4e:34:
                    dc:36:9a:8f:81:88:50:b7:6d:96:42:09:f3:d7:95:
                    83:0d:41:4b:b0:6a:6b:f8:fc:0f:7e:62:9f:67:c4:
                    ed:26:5f:10:26:0f:08:4f:f0:a4:57:28:ce:8f:b8:
                    ed:45:f6:6e:ee:25:5d:aa:6e:39:be:e4:93:2f:d9:
                    47:a0:72:eb:fa:a6:5b:af:ca:53:3f:e2:0e:c6:96:
                    56:11:6e:f7:e9:66:a9:26:d8:7f:95:53:ed:0a:85:
                    88:ba:4f:29:a5:42:8c:5e:b6:fc:85:20:00:aa:68:
                    0b:a1:1a:85:01:9c:c4:46:63:82:88:b6:22:b1:ee:
                    fe:aa:46:59:7e:cf:35:2c:d5:b6:da:5d:f7:48:33:
                    14:54:b6:eb:d9:6f:ce:cd:88:d6:ab:1b:da:96:3b:
                    1d:59
                Exponent: 65537 (0x10001)
        X509v3 extensions:
            X509v3 Basic Constraints: critical
                CA:TRUE
    Signature Algorithm: sha1WithRSAEncryption
        b8:8d:ce:ef:e7:14:ba:cf:ee:b0:44:92:6c:b4:39:3e:a2:84:
        6e:ad:b8:21:77:d2:d4:77:82:87:e6:20:41:81:ee:e2:f8:11:
        b7:63:d1:17:37:be:19:76:24:1c:04:1a:4c:eb:3d:aa:67:6f:
        2d:d4:cd:fe:65:31:70:c5:1b:a6:02:0a:ba:60:7b:6d:58:c2:
        9a:49:fe:63:32:0b:6b:e3:3a:c0:ac:ab:3b:b0:e8:d3:09:51:
        8c:10:83:c6:34:e0:c5:2b:e0:1a:b6:60:14:27:6c:32:77:8c:
        bc:b2:72:98:cf:cd:cc:3f:b9:c8:24:42:14:d6:57:fc:e6:26:
        43:a9:1d:e5:80:90:ce:03:54:28:3e:f7:3f:d3:f8:4d:ed:6a:
        0a:3a:93:13:9b:3b:14:23:13:63:9c:3f:d1:87:27:79:e5:4c:
        51:e3:01:ad:85:5d:1a:3b:b1:d5:73:10:a4:d3:f2:bc:6e:64:
        f5:5a:56:90:a8:c7:0e:4c:74:0f:2e:71:3b:f7:c8:47:f4:69:
        6f:15:f2:11:5e:83:1e:9c:7c:52:ae:fd:02:da:12:a8:59:67:
        18:db:bc:70:dd:9b:b1:69:ed:80:ce:89:40:48:6a:0e:35:ca:
        29:66:15:21:94:2c:e8:60:2a:9b:85:4a:40:f3:6b:8a:24:ec:
        06:16:2c:73
-----BEGIN CERTIFICATE-----
MIIDDDCCAfSgAwIBAgIDAQAgMA0GCSqGSIb3DQEBBQUAMD4xCzAJBgNVBAYTAlBM
MRswGQYDVQQKExJVbml6ZXRvIFNwLiB6IG8uby4xEjAQBgNVBAMTCUNlcnR1bSBD
QTAeFw0wMjA2MTExMDQ2MzlaFw0yNzA2MTExMDQ2MzlaMD4xCzAJBgNVBAYTAlBM
MRswGQYDVQQKExJVbml6ZXRvIFNwLiB6IG8uby4xEjAQBgNVBAMTCUNlcnR1bSBD
QTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAM6xwS7TT3zNJc4YPk/E
jG+AanPIW1H4m9LcuwBcsaD8dQPugfCI7iNS6eYVM42sLQnFdvkrOYCJ5JdLkKWo
ePhzQ3ukYbDYWMzhbGZ+nPMJXlVjhNWo7/OxLjBos8Q82KxujZlakE403Daaj4GI
ULdtlkIJ89eVgw1BS7Bqa/j8D35in2fE7SZfECYPCE/wpFcozo+47UX2bu4lXapu
Ob7kky/ZR6By6/qmW6/KUz/iDsaWVhFu9+lmqSbYf5VT7QqFiLpPKaVCjF62/IUg
AKpoC6EahQGcxEZjgoi2IrHu/qpGWX7PNSzVttpd90gzFFS269lvzs2I1qsb2pY7
HVkCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQUFAAOCAQEA
uI3O7+cUus/usESSbLQ5PqKEbq24IXfS1HeCh+YgQYHu4vgRt2PRFze+GXYkHAQa
TOs9qmdvLdTN/mUxcMUbpgIKumB7bVjCmkn+YzILa+M6wKyrO7Do0wlRjBCDxjTg
xSvgGrZgFCdsMneMvLJymM/NzD+5yCRCFNZX/OYmQ6kd5YCQzgNUKD73P9P4Te1q
CjqTE5s7FCMTY5w/0YcneeVMUeMBrYVdGjux1XMQpNPyvG5k9VpWkKjHDkx0Dy5x
O/fIR/RpbxXyEV6DHpx8Uq79AtoSqFlnGNu8cN2bsWntgM6JQEhqDjXKKWYVIZQs
6GAqm4VKQPNriiTsBhYscw==
-----END CERTIFICATE-----


7. Аналогичные действия повторяем для всех сертификатов цепочки.

Реализация обработки


У конструктора Новый HTTPСоединение имеется булевый параметр ЗащищенноеСоединение, который определяет используемый протокол - http или https. По умолчанию он принимает значение Ложь, поэтому в случае использования https протокола установим его в значение Истина. В остальном запрос по протоколу https от http ничем не отличается.

Код POST-запроса на Яндекс.Геокодер по протоколу HTTPS:

// Функция выполняет POST-запрос на сервис Яндекс.Геокодер.
//
// Параметры
//  ГеографическийОбъект  - строка - название географического объекта.
//
// Возвращаемое значение:
//   Строка   - ответ сервиса в формате xml.
//
Функция ВыполнитьPOSTЗапрос(Знач ГеографическийОбъект)

ГеографическийОбъект = СтрЗаменить(ГеографическийОбъект, " ", "+");

Заголовки = Новый Соответствие;
Заголовки.Вставить("Content-Type", "application/x-www-form-urlencoded");

HTTPЗапрос = Новый HTTPЗапрос("/1.x/", Заголовки);
// Всегда используется только UTF-8, независимо от языка страницы.
// Если сервер вдруг ожидает данные в windows-1251 (к примеру), то их нужно будет перекодировать.
HTTPЗапрос.УстановитьТелоИзСтроки("geocode=" + ГеографическийОбъект, "windows-1251");
HTTPСоединение = Новый HTTPСоединение("geocode-maps.yandex.ru", , , , , Истина);
HTTPОтвет = HTTPСоединение.ОтправитьДляОбработки(HTTPЗапрос);

Возврат HTTPОтвет.ПолучитьТелоКакСтроку();

КонецФункции // ВыполнитьPOSTЗапрос()


Самое главное при выполнение запросов по протоколу HTTPS - это что бы платформа 1С "знала" информацию о корневых сертификатах узла, на который будет производиться запрос!

Забегу вперед, на платформе 1С 8.3 параметр ЗащищенноеСоединение не только булевый, но и может иметь тип ЗащищенноеСоединениеOpenSSL. Теперь можно создавать защищенное соединение с проверкой сертификата сервера и/или устанавливать соединение с серверами, которые требуют предоставление клиентского сертификата.

Комментарии

  1. Так что там с 8.3? Использую сертификат но 1с все равно не может собрать всю цепочку сертификатов

    ОтветитьУдалить
  2. У меня получилось проще с сертификатом, просто его установил в личные сертификаты, предварительно сохранив сертификат в файл (сохранял в формат .p7b включая все сертификаты в путь сертификации)

    ОтветитьУдалить
  3. "7. Аналогичные действия повторяем для всех сертификатов цепочки." - как, просто в конец файла добавлять текст по шаблону?

    ОтветитьУдалить
  4. "Заголовок - береv из информации о сертификате значение свойства CN, в нашем случает Certum CA"

    CN БЕРЕМ из второй строки
    Subject: C=PL, O=Unizeto Sp. z o.o., CN=Certum CA
    первая это имя корневого узла

    спасибо помогло

    ОтветитьУдалить

Отправить комментарий