Я хочу загружать файлы в NextCloud через PHP в Windows 11. Я не очень хорошо знаю PHP, но мне удалось установить sabre/dav через композитор
Затем я нашел в Интернете простой пример кода для вывода списка файлов.
<?php
// installed via - composer require sabre/dav
include 'vendor/autoload.php';
use Sabre\DAV\Client;
$settings = array(
'baseUri' => 'https://cd.wedos.com/remote.php/dav/files/wedos-auth-xxxxxxxx',
'userName' => '[email protected]',
'password' => 'myPasssword'
);
$client = new Client($settings);
// Upload a file
//$upload_result = $client->request('PUT', 'test-upload.txt', 'This will be written to the txt file');
// List a folder's contents
$folder_content = $client->propFind('path/to/folder', array(
'{DAV:}getlastmodified',
'{DAV:}getcontenttype',
), 1);
Но я получаю эту ошибку
PHP Fatal error: Uncaught Sabre\HTTP\ClientException: SSL certificate problem: unable to get local issuer certificate in D:\data\projects\erp\php\vendor\sabre\http\lib\Client.php:327
Я искал решение и мне кажется, что у меня есть два варианта
Есть ли кто-нибудь, кто мог бы мне помочь?
ОБНОВЛЕНИЕ1
Я побежал curl -v cd.wedos.com
и получил вот такие результаты
* TLSv1.3 (IN), TLS handshake, Server hello (2):
* TLSv1.3 (IN), TLS handshake, Unknown (8):
* TLSv1.3 (IN), TLS handshake, Certificate (11):
* TLSv1.3 (IN), TLS handshake, CERT verify (15):
* TLSv1.3 (IN), TLS handshake, Finished (20):
* TLSv1.3 (OUT), TLS handshake, Finished (20):
* SSL connection using TLSv1.3 / TLS_AES_256_GCM_SHA384 / [blank] / UNDEF
* ALPN: server accepted h2
* Server certificate:
* subject: CN=cd.wedos.com
* start date: Jun 1 15:19:19 2024 GMT
* expire date: Aug 30 15:19:18 2024 GMT
* subjectAltName: host "cd.wedos.com" matched cert's "cd.wedos.com"
* issuer: C=US; O=Let's Encrypt; CN=R3
* SSL certificate verify ok.
* Certificate level 0: Public key type ? (2048/112 Bits/secBits), signed using sha256WithRSAEncryption
* Certificate level 1: Public key type ? (2048/112 Bits/secBits), signed using sha256WithRSAEncryption
* Certificate level 2: Public key type ? (4096/128 Bits/secBits), signed using sha256WithRSAEncryption
* old SSL session ID is stale, removing
Итак, я предполагаю, что проблема в том, что PHP не видит/не использует сертификаты.
Запустите установщик композитора, который также поставляется с сертификатами. Затем используйте команду composer diagnose
, чтобы убедиться, что они доступны.
Затем повторите попытку с помощью PHP-скрипта webdav. Тогда, возможно, это уже решено. Если нет, укажите ту же конфигурацию используемой библиотеки PHP Curl. У SabreWebdav также может быть возможность указать сертификаты, но лучше сделать это для расширения Curl.
В Debian вы, скорее всего, не увидите этой проблемы. Если это вариант для вас, я бы посоветовал вам запустить виртуальный сервер с Debian рядом с удаленной системой, чтобы вы могли лучше подготовить транзакцию FTP, не говоря уже о том, чтобы лучше развиваться. Однако небольшое примечание по этому поводу: вы упаковываете дистрибутив (артефакт) локально и никогда не запускаете композитор удаленно (и это хорошо, это распространенная ошибка, о которой вы можете найти множество вопросов в SO, и это просто неправильно/громоздко). /пустая трата времени/непонимание-что такое использование для удаленного выполнения композитора). Сейчас смотрю ваше обновление.
Я думаю, что ответ @olivers более точен, и ссылки, которые он дал, кажутся мне очень хорошими, так что вы, скорее всего, не получите что-то лучшее в разумные сроки. В случае последующей ошибки рассматривайте ее как одну и выполните отдельную диагностику/устранение неполадок. Не путайте это с предыдущей проблемой. Зачастую это два шага вперед, один назад. Мои 2 цента.
Как объясняется в этой PHP.Смотреть статье, проблема специфичен для Windows. В других ОС Curl использует системный список корневых сертификатов:
Эта ошибка встречается редко в системах Linux, BSD и macOS, но довольно часто встречается в Windows, поскольку здесь нет назначенный файл для получения корневых сертификатов, и PHP не отправляет список корневых сертификатов самостоятельно.
Чтобы он работал в Windows, вы можете следовать инструкциям, содержащимся в разделе «Загрузка и обслуживание файла cacert.pem»:
Загрузите файл cacert.pem.
Переместите файл в каталог, доступный PHP и веб-серверу. Например, в C:/php/cacert.pem.
Отредактируйте файл php.ini и измените запись curl.cainfo, указав абсолютный путь к файлу cacert.pem.
При необходимости перезапустите веб-сервер (например, Apache), чтобы перезагрузить файл INI.
Для вашей целевой системы (Debian) она должна работать «из коробки».
Это сработало. Спасибо .. теперь я получаю другую ошибку. ;-) так что первоначальные проблемы были решены. PHP Неустранимая ошибка: Uncaught Sabre\HTTP\ClientHttpException: метод не разрешен в D:\data\projects\erp\php\vendor\sabre\dav\lib\DAV\Client.php:303 Трассировка стека: #0 D:\ data\projects\erp\php\vendor\sabre\dav\lib\DAV\Client.php(198): Sabre\DAV\Client->doPropFind() #1 D:\data\projects\erp\php\webDAV -listFiles.php(20): Sabre\DAV\Client->propFind()
@Radek: Это подтверждает, что вы решили проблему с сертификатом и теперь можете подключиться к серверу. HTTP, который есть сейчас. Другое дело, метод HTTP не разрешен. К сожалению, диагностическое сообщение не содержит используемый метод, проверьте свое приложение на предмет этого и, если у вас есть возможность, проверьте журналы доступа/ошибок на удаленной стороне. Это обычно видно в журналах.
@hakre да, проблема с сертификатом решена, но я не знаю, как составить список файлов. Для этого я создал новый вопрос stackoverflow.com/questions/78781742/…
Я не знаю, как реализовать то, что вы предложили. Не могли бы вы мне помочь? Проверьте мое обновление1 в вопросе. Кроме того... я запускаю текущий PHP-код в Windows 11 в среде разработки, но позже он будет работать в Debian, где у меня есть только доступ по FTP. Есть ли шанс, что я смогу это исправить, запустив PHP-код?