В современном мире электронных платежей безопасная обработка кредитных карт является критически важной задачей для многих приложений. В этой статье мы рассмотрим реализацию 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:
Рассмотрим рабочую реализацию интеграции с 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;
Рекомендации по безопасности
При работе с обработкой кредитных карт соблюдайте следующие меры предосторожности:
PCI DSS Compliance: Убедитесь, что ваше приложение соответствует стандартам PCI DSS.
Шифрование данных: Все передаваемые данные должны быть зашифрованы.
Минимальные привилегии: Сервис должен работать под учетной записью с минимально необходимыми привилегиями.
Логирование: Ведите журнал всех операций, но не храните чувствительные данные (CVV, полные номера карт).
Решение проблем с хостинг-провайдером
Как отметил пользователь Kas Ob, проблема может быть связана не с IIS или Windows, а с настройками безопасности хостинг-провайдера:
Проверьте настройки сетевого экрана (firewall) на уровне хостинга.
Убедитесь, что исходящие соединения на порт 443 разрешены.
Проверьте, не блокируются ли IP-адреса платежных систем.
Рассмотрите возможность использования выделенного 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