CFHTTP не может найти действительный путь сертификации к запрошенной цели - PullRequest
2 голосов
/ 27 мая 2020

Я хочу очистить данные с веб-сайта, другие https-сайты работают, и это работало на прошлой неделе, но теперь не работает

<cfhttp url="https://www.cliftoncameras.co.uk/all-brands-and-types-of-used-cameras/"></cfhttp>

Если я запустил дамп cfhttp

Исключение: сбой построения пути PKIX: sun.security.provider.certpath.SunCertPathBuilderException: не удалось найти действительный путь сертификации к запрошенной цели

Я пробовал работать с последней JRE версии 12 - без изменений

https://helpx.adobe.com/coldfusion/kb/import-certificates-certificate-stores-coldfusion.html

Вернулся к исходной JRE CF, загрузил целевой сертификат SSL и установил его с помощью keytool - без изменений

c: \ ColdFusion2018 \ jre \ bin \ keytool -import -keystore cacerts -alias cliftoncameras -file c: \ ColdFusion2018 \ jre \ lib \ security \ cliftoncameras.cer

Я изменил веб-сокет в CFAdmin на прокси - без изменений

Я перезагружал сервер приложений CF каждый раз.

Что еще я могу сделать?

Ответы [ 3 ]

2 голосов
/ 01 июня 2020

Я также видел эту java.security.cert.CertPathBuilderException ошибку раньше на Java и Coldfusion на сайтах, которые загружаются нормально в обычном браузере, но все еще остаются ошибкой из cfhttp даже после добавления сертификата в хранилище ключей CF и перезапуска.

Это происходит, когда конфигурация сертификата сервера целевого сайта имеет проблему с цепочкой доверия - когда один или несколько путей цепочки доверия требуют от браузера выполнения «дополнительной загрузки» сертификата. Это может происходить из-за отсутствия промежуточного сертификата в одном пути цепочки доверия или из-за того, что в цепочке доверия есть несколько ветвей с разными отпечатками пальцев, и один или несколько сертификатов из одной или нескольких из этих ветвей не обслуживаются.

Если вы запустите целевой сайт через анализатор SSL, такой как ssllabs.com - например, https://globalsign.ssllabs.com/analyze.html?d=www.cliftoncameras.co.uk&hideResults=on - вы увидите, что их промежуточный сертификат Starfield Secure Certificate Authority - G2 не обслуживается их сервером, что заставляет клиент, чтобы выполнить «дополнительную загрузку» - что не будет проблемой для большинства подходящих браузеров, но клиенту Java, используемому cfhttp, нужен сервер, чтобы предоставить почти все промежуточные и root сертификаты напрямую. Раньше он был одинаковым для большинства мобильных ОС вплоть до нескольких лет go.

Таким образом, идеальное решение - связаться с cliftoncameras и попросить администратора сервера установить правильный сертификат Starfield Intermediate, чтобы он обслуживался.

Возможный обходной путь с вашей стороны - установить промежуточный сертификат Starfield Secure Certificate Authority - G2 в хранилище ключей CF.

1 голос
/ 10 июня 2020

На моей платформе разработки я добавил

-Dcom.sun.security.enableAIAcaIssuers=true

в java .args в файле в ColdFusion2018 \ cfusion \ bin \ jvm.config

Затем перезапустил сервер приложений CF , и теперь мой вызов CFHTTP выполнен успешно.

Спасибо @agreax за это решение

Спасибо @sevroberts, ответ которого, вероятно, был правильным, хотя я не мог заставить его работать . Производственный хост установил сертификат SSL в хранилище ключей и успешно разрешил его таким образом. Они сказали:

Если вы используете браузер FireFox и нажимаете значок замка при просмотре URL-адреса, который вы хотите получить доступ к запросу cfhttp, вы можете получить дополнительную информацию и щелкнуть Просмотр сертификата вариант. Вам нужно будет загрузить PEM (сертификат), а не цепочку. После загрузки вам необходимо запустить keytool, чтобы импортировать его в хранилище ключей.

Если вы используете JRE по умолчанию в вашей JVM для ColdFusion, вам необходимо установить JDK на вашу машину разработки. Вы можете увидеть подробности и шаги, которые мы перечислили в нашей вики, относительно команд из командной строки для импорта SSL в магазин. https://wiki.hostek.com/ColdFusion_Tips_%26_Tricks#Fixing_cfhttp_Connection_Failures_with_Keytool

Благодаря @alexbaban его обходной путь, хотя он работал, это было решение, которое я не смог реализовать из-за необходимости использования тега cfexecute.

1 голос
/ 06 июня 2020

Если вы не можете заставить работать хранилище ключей, возможно, вы захотите попробовать это.

Создайте специальный исполняемый файл командной строки (.exe), который будет читать веб-страницу и сохранять исходный текст в виде текста. файл. Затем вы можете использовать ColdFusion для чтения файла и работы с данными.

Вот код ColdFusion:

<cfscript>

    _execPath = "c:/bin/clifton.exe";
    _filePath = "c:/bin/clifton.txt";

    // run your command-line app (clifton.exe)
    cfexecute(name="#_execPath#");  

    // wait for the file
    do {
        sleep(100);
    } while ( not fileExists(_filePath) ) 

    // wait for write to finish
    do {
        sleep(100);
        _fileInfo = getFileInfo(_filePath);
        writeOutput(" ## ");
        cfflush();
    } while ( _fileInfo.size eq 0 || dateDiff("s", _fileInfo.lastmodified, now()) lte 3 )

    writeOutput("<hr />")

    _result = fileRead(_filePath);
    writeDump(_result);

</cfscript>


Как видите, он зависит от clifton.exe и читает clifton.txt (clifton.txt - результат выполнения clifton.exe).

Как создать clifton.exe

Вы будете использовать Dart SDK и инструмент dart2native для создания исполняемого файла на вашем компьютере разработчика. Вы можете развернуть исполняемый файл на своем производственном сервере как автономный (вам не нужно устанавливать Dart SDK в производственной среде).

  • Создайте папку bin на вашем C диске.
  • Из https://ssl-ccp.secureserver.net/repository/?origin=CALLISTO скачать сертификат sfig2.crt.pem (PEM) и сохранить его внутри c:\bin.
  • Внутри c:\bin создать текстовый файл clifton.dart со следующим кодом:
// clifton.dart

import 'dart:convert';
import 'dart:io';

main() {
  //
  const String _certFilePath = 'c:/bin/sfig2.crt.pem';
  const String _responseFilePath = 'c:/bin/clifton.txt';
  const String _uri =
      'https://www.cliftoncameras.co.uk/all-brands-and-types-of-used-cameras/';

  final File _file = new File(_responseFilePath);
  final IOSink _sink = _file.openWrite();

  final SecurityContext _context = new SecurityContext();
  _context.setTrustedCertificates(_certFilePath);

  final HttpClient _client = new HttpClient(context: _context);
  saveSourceToFile(_client, _uri, _sink);
  _client.close();
  //
}

// get web page source then write it to file
void saveSourceToFile(HttpClient _client, String _uri, IOSink _sink) {
  //
  _client
      .getUrl(Uri.parse(_uri))
      .then((req) => req.close())
      .then((res) => res.transform(Utf8Decoder()).listen((data) {
            // as data is received write to file
            _sink.write(data);
          }, onDone: () {
            _sink.close();
          }));
  //
}
  • Загрузите и установите Dart SDK из https://dart.dev/
  • Откройте окно терминала и проверьте установку Dart с помощью dart --version (вы должны иметь возможность запускать дротик из любой папки, при необходимости добавьте дротик в ваш PATH)
  • В окне терминала измените каталог на c:\bin с помощью cd c:\bin
  • Далее, запустите dart2native clifton.dart -o clifton.exe
  • Если компиляция прошла успешно, у вас должны быть внутри c:\bin три файла: clifton.dart, clifton.exe и сертификат sfig2.crt.pem.
  • Если вы wi sh вы можете протестировать запуск clifton.exe в окне терминала, который должен создать файл clifton.txt.
  • Протестируйте страницу ColdFusion, h вызывает clifton.exe, ждет clifton.txt, затем выводит содержимое.

Если вы развертываете в производственной среде, вам понадобятся оба файла clifton.exe и sfig2.crt.pem (сертификат).

Удачи!

...