#5919: API XML-RPC поверх HTTPS

Отредактирована: 105 дней назад

Симптомы

  • API XML-RPC поверх HTTPS.
  • Как использовать HTTPS в API?
  • Возможно ли передавать API запросы, используя протокол HTTPS вместо HTTP?
  • API по HTTPS.
  • HTTPS для API.

Решение

Прежде всего в настройках зоны нужно разрешить сервис API XML-RPC поверх HTTPS.

При обращении к NGFW, он будет слать SSL-сертификат веб-консоли. По умолчанию это сертификат Web GUI (Default). Соответственно, XML-RPC клиент должен доверять этому сертификату. Поэтому предварительно его нужно экспортировать на свой ПК.

Из веб-консоли SSL сертификаты импортируются в формате DER. Python не может работать с SSL сертификатами в этом формате, поэтому SSL сертификат предварительно нужно конвертировать в PEM формат. С помощью openssl это можно сделать командой:

openssl x509 -inform DER -in certificate.der -out certificate.pem -outform PEM

Для подключения к API XML-RPC поверх HTTPS можно использовать следующий код:

context = ssl.SSLContext(ssl.PROTOCOL_TLS_CLIENT)
context.check_hostname = False  
context.load_verify_locations(cafile='certificate.pem')
context.verify_mode = ssl.CERT_OPTIONAL

server = rpc.ServerProxy(f'https://{SERVER}:{PORT}/rpc', verbose=False, context=context)

Шаблон кода

#!/usr/bin/env python3

import xmlrpc.client
import ssl

SERVER = "IP_адрес"
PORT = 4443
USER = "логин"
PASSWORD = "пароль"

context = ssl.SSLContext(ssl.PROTOCOL_TLS_CLIENT)
context.check_hostname = False  
context.load_verify_locations(cafile='certificate.pem')
context.verify_mode = ssl.CERT_OPTIONAL


server = xmlrpc.client.ServerProxy('https://' + SERVER + ':' + str(PORT) + '/rpc', verbose=False, context=context)
res = server.v2.core.login(USER, PASSWORD, {})
auth_token = res['auth_token']


# тут любой код на Python


server.v2.core.logout(auth_token)