Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Реализация REST-сервера для обработки кредитных карт в Delphi: решение проблем с TLS 1.2 и интеграцией USAePay

Delphi , Синтаксис , API реализация

 

Введение

В современном мире электронных платежей безопасная обработка кредитных карт является критически важной задачей для многих приложений. В этой статье мы рассмотрим реализацию REST-сервера на Delphi для работы с платежными системами, в частности с USAePay и Merchantware, а также разберем распространенные проблемы, связанные с протоколами безопасности TLS 1.2.

Проблема с TLS 1.2 в Windows Server 2016 R2

Как описывает пользователь KimHJ, после февраля 2025 года один из обработчиков платежей перестал работать на Windows Server 2016 R2, в то время как на локальной машине с Windows 10 все продолжает функционировать нормально. Оба обработчика используют TLS 1.2, и проверка с помощью Nartac ISS Crypto 3.3 подтверждает, что этот протокол является единственным доступным.

Анализ ошибки

При попытке доступа к WSDL-описанию сервиса Merchantware через IE на сервере появляется сообщение:

This page can’t be displayed
Turn on TLS 1.0, TLS 1.1, and TLS 1.2 in Advanced settings...

Хотя инструмент Nartac ISS Crypto 3.3 успешно сканирует сайт, в реальности соединение не устанавливается.

Решение проблемы

1. Проверка настроек TLS в реестре

Первое, что необходимо сделать — проверить настройки TLS в реестре Windows. Вот пример кода на Delphi для проверки и изменения этих параметров:

uses
  Registry;

procedure CheckAndFixTLSettings;
var
  Reg: TRegistry;
begin
  Reg := TRegistry.Create;
  try
    Reg.RootKey := HKEY_LOCAL_MACHINE;

    // Проверка и включение TLS 1.2
    if Reg.OpenKey('SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2\Client', True) then
    begin
      if not Reg.ValueExists('DisabledByDefault') or (Reg.ReadInteger('DisabledByDefault') <> 0) then
        Reg.WriteInteger('DisabledByDefault', 0);
      if not Reg.ValueExists('Enabled') or (Reg.ReadInteger('Enabled') <> 1) then
        Reg.WriteInteger('Enabled', 1);
      Reg.CloseKey;
    end;

    // Отключение старых протоколов
    if Reg.OpenKey('SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.0\Client', True) then
    begin
      Reg.WriteInteger('DisabledByDefault', 1);
      Reg.WriteInteger('Enabled', 0);
      Reg.CloseKey;
    end;

    if Reg.OpenKey('SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.1\Client', True) then
    begin
      Reg.WriteInteger('DisabledByDefault', 1);
      Reg.WriteInteger('Enabled', 0);
      Reg.CloseKey;
    end;
  finally
    Reg.Free;
  end;
end;

После изменения параметров реестра необходимо перезагрузить сервер.

2. Настройка THTTPRIO для принудительного использования TLS 1.2

В коде обработчика платежей можно явно указать используемый протокол:

function TEWBModule1.CayanProcessing(MCCNumber, MExpDate, Mcvv, MWAmount, MCusNum, MName, MTransNum, MWType: string; SaveIt: Boolean): Boolean;
var
  // ... существующие объявления переменных
begin
  // Принудительно устанавливаем TLS 1.2 перед вызовом сервиса
  SetEnvironmentVariable('SSL_CERT_FILE', '');
  SetEnvironmentVariable('SSL_CERT_DIR', '');
  IdSSLOpenSSLHeaders.Load;
  IdSSLOpenSSL.SetOpenSSLLibraryPath(ExtractFilePath(ParamStr(0)));

  // ... остальной код функции
end;

3. Альтернативное решение: использование Indy для HTTPS-запросов

Если проблемы с SOAP-клиентом продолжаются, можно реализовать запросы напрямую с использованием компонентов Indy:

uses
  IdHTTP, IdSSLOpenSSL;

function ProcessWithIndy(const AURL, ARequest: string): string;
var
  IdHTTP: TIdHTTP;
  IdSSLIOHandler: TIdSSLIOHandlerSocketOpenSSL;
begin
  IdHTTP := TIdHTTP.Create(nil);
  IdSSLIOHandler := TIdSSLIOHandlerSocketOpenSSL.Create(IdHTTP);
  try
    IdSSLIOHandler.SSLOptions.Method := sslvTLSv1_2;
    IdSSLIOHandler.SSLOptions.SSLVersions := [sslvTLSv1_2];
    IdHTTP.IOHandler := IdSSLIOHandler;
    IdHTTP.Request.ContentType := 'application/xml';
    Result := IdHTTP.Post(AURL, ARequest);
  finally
    IdSSLIOHandler.Free;
    IdHTTP.Free;
  end;
end;

Интеграция с USAePay

Рассмотрим рабочую реализацию интеграции с USAePay, которая продолжает функционировать на сервере:

function TEWBModule1.CreateToken(const AMerchantKey, AMerchantLogin: string): usaepay.ueSecurityToken;
var
  SeedValue: string;
  HashValue: string;
  HashDigest: TIdHashSHA1;
begin
  // Генерация seed как текущее время в формате yyyyMMddHHmmss
  SeedValue := FormatDateTime('yyyyMMddHHmmss', Now);

  // Вычисление хеша SHA1 от merchantKey + seed + merchantLogin
  HashDigest := TIdHashSHA1.Create;
  try
    HashValue := LowerCase(HashDigest.HashStringAsHex(AMerchantKey + SeedValue + AMerchantLogin));
  finally
    HashDigest.Free;
  end;

  // Создание токена
  Result := usaepay.ueSecurityToken.Create;
  Result.ClientIP := '127.0.0.1'; // или реальный IP клиента
  Result.PinHash.Type_ := 'sha1';
  Result.PinHash.Seed := SeedValue;
  Result.PinHash.HashValue := HashValue;
end;

Рекомендации по безопасности

При работе с обработкой кредитных карт соблюдайте следующие меры предосторожности:

  1. PCI DSS Compliance: Убедитесь, что ваше приложение соответствует стандартам PCI DSS.
  2. Шифрование данных: Все передаваемые данные должны быть зашифрованы.
  3. Минимальные привилегии: Сервис должен работать под учетной записью с минимально необходимыми привилегиями.
  4. Логирование: Ведите журнал всех операций, но не храните чувствительные данные (CVV, полные номера карт).

Решение проблем с хостинг-провайдером

Как отметил пользователь Kas Ob, проблема может быть связана не с IIS или Windows, а с настройками безопасности хостинг-провайдера:

  1. Проверьте настройки сетевого экрана (firewall) на уровне хостинга.
  2. Убедитесь, что исходящие соединения на порт 443 разрешены.
  3. Проверьте, не блокируются ли IP-адреса платежных систем.
  4. Рассмотрите возможность использования выделенного IP-адреса для сервера.

Заключение

Проблемы с TLS 1.2 при интеграции платежных систем в Delphi-приложениях могут быть вызваны различными факторами: от настроек операционной системы до ограничений хостинг-провайдера. В статье представлены несколько подходов к решению этих проблем, включая настройку реестра, модификацию кода SOAP-клиента и альтернативные реализации с использованием Indy.

Если проблема сохраняется после выполнения всех рекомендаций, как и поступил KimHJ, стоит рассмотреть возможность миграции на более новую версию Windows Server (в данном случае переход на Windows Server 2025 решил проблему), либо продолжить диалог с хостинг-провайдером для выявления скрытых ограничений на уровне сети.

Помните, что работа с платежными системами требует особого внимания к безопасности и надежности реализации. Все изменения следует тестировать в staging-среде перед развертыванием в production.

Создано по материалам из источника по ссылке.

Реализация REST-сервера на Delphi для обработки кредитных карт с решением проблем TLS 1.2 и интеграцией USAePay.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: API реализация ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-08-02 09:06:52/0.0065619945526123/0