Nextcloud 实时文档编辑 w/Collabora Online (CODE) cURL 错误 60:对等方的证书颁发者已被用户标记为不信任

Nextcloud 实时文档编辑 w/Collabora Online (CODE) cURL 错误 60:对等方的证书颁发者已被用户标记为不信任

你好!我正忙得不可开交。我想把它写完,这样我就可以在有空的时候开始为人们和其他脑损伤幸存者写一本励志书。我在 2007 年的一场几乎致命的车祸中脑损伤,并伴有短期记忆丧失(就像海底总动员中的多莉一样),但恢复得非常好。我不想使用 Google Drive 或其他公司拥有的其他云解决方案,因为任何上传到 Google Drive 之类的东西的信息都属于 Google,他们可以随意重新分配。无论如何,我离题了。

我在 Apache 上安装了 Nextcloud 12,效果很好!出于上述原因,我想进行实时文档编辑。按照以下说明操作Collabora CODE 文档。我正在使用 Docker CODE 映像(collabora/code)。我按照文档中的说明使用下面的代码启动映像。我的 apache 运行没有错误,至少我没有看到明显的错误。我没有梳理日志,只是在 nextcloud 中执行操作时寻找新的日志。我安装了 Collabore Online 应用程序,并将 Admin 下的 Collabora 在线服务器设置为 https://127.0.0.1:9980。当我转到文件并尝试打开一个昨天创建的新空白 .odt 文档时,它给了我一个错误,如下面的块所示。

9980 端口已打开。Selinux 也已打开,但我希望将其保持打开状态。过去一两周,当我有时间时,我尝试了很多方法。我不记得我做过的所有事情,但我知道我曾尝试制作一个自定义 Docker 文件来复制我网站的“Let's Encrypt”证书使用的旧证书。我不记得我是否传入了正确的环境变量以防止创建自签名证书并使用文件系统上的证书,有人知道执行此操作的步骤吗?我将其恢复为使用自签名证书,因为许多可用的教程都使用自签名证书而没有问题。所以也许是我的特殊设置?对于我尝试过的证书操作,我已经使用 curl 针对 https://127.0.0.1:8890 进行了测试。我遇到了 cURL 错误 35 遇到文件结尾,以及 cURL 错误 60 Peer 的证书已被标记为不受信任。

有人知道我如何在容器中成功使用我自己的网站中的 let's encrypt 证书来为容器内运行的 loolwsl 服务服务吗?如果我忘记提到任何内容,请告诉我!非常感谢您的阅读和帮助!

卡米尔8686

在网页上

内部服务器错误

服务器遇到内部错误,无法完成您的请求。

如果此错误多次出现,请联系服务器管理员,并在报告中包含以下技术详细信息。

更多详细信息请参阅服务器日志。

技术细节

    远程地址:167.142.215.1
    请求 ID:WVOhwIY0d9yPqqbVbYLBaQAAAAI

Apache 日志消息(同一件事重复多次)
[2017 年 6 月 29 日星期四 07:09:25.542925] [authz_core:error] [pid 23408] [客户端 167.142.215.1:14850] AH01630:服务器配置拒绝客户端:/var/www/nextcloud/data/.ocdata

在 nextcloud 日志中
{“reqId”:“WVOhwIY0d9yPqqbVbYLBaQAAAAI”,“level”:“3”,“time”:“2017-06-28T12:32:00 + 00:00”,“remoteAddr”:“167.142.215.1”,“user”:“khamil8686”,“app”:“richdocuments”,“method”:“GET”,“url”:“\ /nextcloud\ /index.php \ /apps\ /richdocuments\ /index?fileId = 641&requesttoken = xRmG6LQ%2BYOl01txmrtMSQ1OlqGsDB81OeVyWM5JAFTg%3D%3Asl3MrI1OI7w6mY1X5IpnJgLs4C9FX4YFEBXeQ6UvInk%3D”,“message”:“异常: {\“Exception\”:\“GuzzleHttp\\\\Exception\\\\RequestException\”,\“Message\”:\“cURL 错误 60:Peer 的证书颁发者已被用户标记为不信任。\”,\“Code\”:0,\“Trace\”:\“#0 \\\/var\\\/www\\\/nextcloud\\\/3rdparty\\\/guzzlehttp\\\/guzzle\\\/src\\\/RequestFsm.php(103): GuzzleHttp\\\\Exception\\\\RequestException::wrapException(Object(GuzzleHttp\\\\Message\\\\Request), Object(GuzzleHttp\\\\Ring\\\\Exception\\\\RingException))\\n#1 \\\/var\\\/www\\\/nextcloud\\\/3rdparty\\\/guzzlehttp\\\/guzzle\\\/src\\\/RequestFsm.php(132): GuzzleHttp\\\\RequestFsm->__invoke(Object(GuzzleHttp\\\\Transaction))\\n#2 \\\/var\\\/www\\\/nextcloud\\\/3rdparty\\\/react\\\/promise\\\/src\\\/FulfilledPromise.php(25): GuzzleHttp\\\\RequestFsm->GuzzleHttp\\\\{closure}(Array)\\n#3 \\\/var\\\/www\\\/nextcloud\\\/3rdparty\\\/guzzlehttp\\\/ringphp\\\/src\\\/Future\\\/CompletedFutureValue.php(55): React\\\\Promise\\\\FulfilledPromise->then(Object(Closure), NULL, NULL)\\n#4 \\\/var\\\/www\\\/nextcloud\\\/3rdparty\\\/guzzlehttp\\\/guzzle\\\/src\\\/Message\\\/FutureResponse.php(43): GuzzleHttp\\\\Ring\\\\Future\\\\CompletedFutureValue->then(Object(Closure), NULL, NULL)\\n#5 \\\/var\\\/www\\\/nextcloud\\\/3rdparty\\\/guzzlehttp\\\/guzzle\\\/src\\\/RequestFsm.php(134): GuzzleHttp\\\\Message\\\\FutureResponse::proxy(Object(GuzzleHttp\\\\Ring\\\\Future\\\\CompletedFutureArray), Object(Closure))\\n#6 \\\/var\\\/www\\\/nextcloud\\\/3rdparty\\\/guzzlehttp\\\/guzzle\\\/src\\\/Client.php(165): GuzzleHttp\\\\RequestFsm->__invoke(Object(GuzzleHttp\\\\Transaction))\\n#7 \\\/var\\\/www\\\/nextcloud\\\/3rdparty\\\/guzzlehttp\\\/guzzle\\\/src\\\/Client.php(125): GuzzleHttp\\\\Client->send(Object(GuzzleHttp\\\\Message\\\\Request))\\n#8 \\\/var\\\/www\\\/nextcloud\\\/lib\\\/private\\\/Http\\\/Client\\\/Client.php(138): GuzzleHttp\\\\Client->get('https:\\\/\\\/127.0.0...', Array)\\n#9 \\\/var\\\/www\\\/nextcloud\\\/apps\\\/richdocuments\\\/lib\\\/WOPI\\\/DiscoveryManager.php(84): OC \\\\Http\\\\Client\\\\Client->get('https:\\\/\\\/127.0.0...')\\n#10 \\\/var\\\/www\\\/nextcloud\\\/apps\\\/richdocuments\\\/lib\\\/WOPI\\\/Parser.php(41): OCA\\\\Richdocuments\\\\WOPI\\\\DiscoveryManager->get()\\n#11 \\\/var\\\/www\\\/nextcloud\\\/apps\\\/richdocuments\\\/lib\\\/TokenManager.php(117):OCA\\\\Richdocuments\\\\WOPI\\\\Parser->getUrlSrc('application\\\/vnd...')\\n#12 \\\/var\\\/www\\\/nextcloud\\\/apps\\\/richdocuments\\\/lib\\\/Controller\\\/DocumentController.php(108): OCA\\\\Richdocuments\\\\TokenManager->getToken(*** 敏感参数替换 ***)\\n#13 [内部函数]: OCA\\\\Richdocuments\\\\Controller\\\\DocumentController->index('641')\\n#14 \\\/var\\\/www\\\/nextcloud\\\/lib\\\/private\\\/AppFramework\\\/Http\\\/Dispatcher.php(160): call_user_func_array(Array,数组)\\n#15 \\\/var\\\/www\\\/nextcloud\\\/lib\\\/private\\\/AppFramework\\\/Http\\\/Dispatcher.php(90): OC\\\\AppFramework\\\\Http\\\\Dispatcher->executeController(Object(OCA\\\\Richdocuments\\\\Controller\\\\DocumentController), 'index')\\n#16 \\\/var\\\/www\\\/nextcloud\\\/lib\\\/private\\\/AppFramework\\\/App.php(114): OC\\\\AppFramework\\\\Http\\\\Dispatcher->dispatch(Object(OCA\\\\Richdocuments\\\\Controller\\\\DocumentController), 'index')\\n#17 \\\/var\\\/www\\\/nextcloud\\\/lib\\\/private\\\/AppFramework\\\/Routing\\\/RouteActionHandler.php(47): OC\\\\AppFramework\\\\App::main('OCA\\\\\\\\Richdocumen...', 'index', Object(OC\\\\AppFramework\\\\DependencyInjection\\\\DIContainer), Array)\\n#18 [内部函数]: OC\\\\AppFramework\\\\Routing\\\\RouteActionHandler->__invoke(Array)\\n#19 \\\/var\\\/www\\\/nextcloud\\\/lib\\\/private\\\/Route\\\/Router.php(299): call_user_func(Object(OC\\\\AppFramework\\\\Routing\\\\RouteActionHandler), Array)\\n#20 \\\/var\\\/www\\\/nextcloud\\\/lib\\\/base.php(1000): OC\\\\Route\\\\Router->match('\\\/apps\\\/richdocum...')\\n#21 \\\/var\\\/www\\\/nextcloud\\\/index.php(40): OC::handleRequest()\\n#22 {main}\",\"文件\":\"\\/var\\/www\\/nextcloud\\/3rdparty\\/guzzlehttp\\/guzzle\\/src\\/Exception\\/RequestException.php\",\"行\":51}","userAgent":"Mozilla\/5.0 (Windows NT 10.0; Win64; x64; rv:54.0) Gecko\/20100101 Firefox\/54.0","version":"12.0.0.29"}'index')\\n#17 \\\/var\\\/www\\\/nextcloud\\\/lib\\\/private\\\/AppFramework\\\/Routing\\\/RouteActionHandler.php(47): OC\\\\AppFramework\\\\App::main('OCA\\\\\\\\Richdocumen...', 'index', Object(OC\\\\AppFramework\\\\DependencyInjection\\\\DIContainer), Array)\\n#18 [内部函数]: OC\\\\AppFramework\\\\Routing\\\\RouteActionHandler->__invoke(Array)\\n#19 \\\/var\\\/www\\\/nextcloud\\\/lib\\\/private\\\/Route\\\/Router.php(299): call_user_func(Object(OC\\\\AppFramework\\\\Routing\\\\RouteActionHandler), Array)\\n#20 \\\/var\\\/www\\\/nextcloud\\\/lib\\\/base.php(1000): OC\\\\Route\\\\Router->match('\\\/apps\\\/richdocum...')\\n#21 \\\/var\\\/www\\\/nextcloud\\\/index.php(40): OC::handleRequest()\\n#22 {main}\",\"文件\":\"\\/var\\/www\\/nextcloud\\/3rdparty\\/guzzlehttp\\/guzzle\\/src\\/Exception\\/RequestException.php\",\"行\":51}","userAgent":"Mozilla\/5.0 (Windows NT 10.0; Win64; x64; rv:54.0) Gecko\/20100101 Firefox\/54.0","version":"12.0.0.29"}'index')\\n#17 \\\/var\\\/www\\\/nextcloud\\\/lib\\\/private\\\/AppFramework\\\/Routing\\\/RouteActionHandler.php(47): OC\\\\AppFramework\\\\App::main('OCA\\\\\\\\Richdocumen...', 'index', Object(OC\\\\AppFramework\\\\DependencyInjection\\\\DIContainer), Array)\\n#18 [内部函数]: OC\\\\AppFramework\\\\Routing\\\\RouteActionHandler->__invoke(Array)\\n#19 \\\/var\\\/www\\\/nextcloud\\\/lib\\\/private\\\/Route\\\/Router.php(299): call_user_func(Object(OC\\\\AppFramework\\\\Routing\\\\RouteActionHandler), Array)\\n#20 \\\/var\\\/www\\\/nextcloud\\\/lib\\\/base.php(1000): OC\\\\Route\\\\Router->match('\\\/apps\\\/richdocum...')\\n#21 \\\/var\\\/www\\\/nextcloud\\\/index.php(40): OC::handleRequest()\\n#22 {main}\",\"文件\":\"\\/var\\/www\\/nextcloud\\/3rdparty\\/guzzlehttp\\/guzzle\\/src\\/Exception\\/RequestException.php\",\"行\":51}","userAgent":"Mozilla\/5.0 (Windows NT 10.0; Win64; x64; rv:54.0) Gecko\/20100101 Firefox\/54.0","version":"12.0.0.29"}

UI 中更易读的 nextcloud 日志
    /var/www/nextcloud/3rdparty/guzzlehttp/guzzle/src/RequestFsm.php - 第 103 行:GuzzleHttp\Exception\RequestException wrapException(Object(GuzzleHttp\Message\Request),Object(GuzzleHttp\Ring\Exception\RingException))
    /var/www/nextcloud/3rdparty/guzzlehttp/guzzle/src/RequestFsm.php - 第 132 行:GuzzleHttp\RequestFsm->__invoke(Object(GuzzleHttp\Transaction))
    /var/www/nextcloud/3rdparty/react/promise/src/FulfilledPromise.php - 第 25 行:GuzzleHttp\RequestFsm->GuzzleHttp\{closure}(Array)
    /var/www/nextcloud/3rdparty/guzzlehttp/ringphp/src/Future/CompletedFutureValue.php - 第 55 行:React\Promise\FulfilledPromise->then(Object(Closure), NULL, NULL)
    /var/www/nextcloud/3rdparty/guzzlehttp/guzzle/src/Message/FutureResponse.php - 第 43 行:GuzzleHttp\Ring\Future\CompletedFutureValue->then(Object(Closure), NULL, NULL)
    /var/www/nextcloud/3rdparty/guzzlehttp/guzzle/src/RequestFsm.php - 第 134 行:GuzzleHttp\Message\FutureResponse 代理(Object(GuzzleHttp\Ring\Future\CompletedFutureArray)、Object(Closure))
    /var/www/nextcloud/3rdparty/guzzlehttp/guzzle/src/Client.php - 第 165 行:GuzzleHttp\RequestFsm->__invoke(Object(GuzzleHttp\Transaction))
    /var/www/nextcloud/3rdparty/guzzlehttp/guzzle/src/Client.php - 第 125 行:GuzzleHttp\Client->send(Object(GuzzleHttp\Message\Request))
    /var/www/nextcloud/lib/private/Http/Client/Client.php - 第 138 行:GuzzleHttp\Client->get('https //127.0.0...', Array)
    /var/www/nextcloud/apps/richdocuments/lib/WOPI/DiscoveryManager.php - 第 84 行:OC\Http\Client\Client->get('https //127.0.0...')
    /var/www/nextcloud/apps/richdocuments/lib/WOPI/Parser.php - 第 41 行:OCA\Richdocuments\WOPI\DiscoveryManager->get()
    /var/www/nextcloud/apps/richdocuments/lib/TokenManager.php - 第 117 行:OCA\Richdocuments\WOPI\Parser->getUrlSrc('application/vnd...')
    /var/www/nextcloud/apps/richdocuments/lib/Controller/DocumentController.php - 第 108 行:OCA\Richdocuments\TokenManager->getToken(*** 敏感参数已替换 ***)
    [内部函数] OCA\Richdocuments\Controller\DocumentController->index('641')
    /var/www/nextcloud/lib/private/AppFramework/Http/Dispatcher.php - 第 160 行:call_user_func_array(Array, Array)
    /var/www/nextcloud/lib/private/AppFramework/Http/Dispatcher.php - 第 90 行:OC\AppFramework\Http\Dispatcher->executeController(Object(OCA\Richdocuments\Controller\DocumentController), 'index')
    /var/www/nextcloud/lib/private/AppFramework/App.php - 第 114 行:OC\AppFramework\Http\Dispatcher->dispatch(Object(OCA\Richdocuments\Controller\DocumentController), 'index')
    /var/www/nextcloud/lib/private/AppFramework/Routing/RouteActionHandler.php - 第 47 行:OC\AppFramework\App main('OCA\\Richdocumen...', 'index', Object(OC\AppFramework\DependencyInjection\DIContainer), Array)
    [内部函数] OC\AppFramework\Routing\RouteActionHandler->__invoke(Array)
    /var/www/nextcloud/lib/private/Route/Router.php - 第 299 行:call_user_func(Object(OC\AppFramework\Routing\RouteActionHandler), Array)
    /var/www/nextcloud/lib/base.php - 第 1000 行:OC\Route\Router->match('/apps/richdocum...')
    /var/www/nextcloud/index.php - 第 40 行:OC handleRequest()
    {主要的}

运行 Collabora Online CODE Docker 映像
docker 运行-t-d-p 127.0.0.1:9980:9980 \
       -e ‘cert_domain=X\.com’ \
       -e'用户名=admin' \
       -e'password=password'--始终重新启动--cap-add MKNOD collabora/code

Apache 配置 - conf.d 中的 nextcloud.conf 和 collaboraonlineCODE.conf

==> /etc/httpd/conf.d/nextcloud.conf
  选项 +关注符号链接
  允许覆盖全部

  
    大卫
  

  设置环境变量 HOME /var/www/nextcloud
  设置环境 HTTP_HOME /var/www/nextcloud



==> /etc/httpd/conf.d/collaboraonlineCODE.conf
  服务器名称 collabora.X:443

  # SSL 配置,您可能想采取简单的路线并使用 Lets Encrypt!
  SSLEngine 开启
  SSL证书文件 /etc/letsencrypt/live/X-0002/cert.pem
  SSLCertificateChainFile /etc/letsencrypt/live/X.com-0002/chain.pem
  SSLCertificateKeyFile /etc/letsencrypt/live/X.com-0002/privkey.pem
  SSL协议全部 -SSLv2 -SSLv3
  SSL密码套件ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-A ES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA:ECDHE-ECDSA-DES-CBC3-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:DES-CBC3-SHA:!DSS
  SSLHonorCipherOrder

  # 需要允许编码斜线
  AllowEncodedSlashes NoDecode

  # 容器使用唯一的非签名证书
  SSLProxyEngine 开启
  SSLProxyVerify 无
  SSLProxyCheckPeerCN 关闭
  SSLProxyCheckPeerName 关闭

  # 保留主机
  ProxyPreserveHost 开启

  # loolwsd 提供的静态 html、js、图像等
  # loleaflet 是 LibreOffice Online 的客户端部分
  ProxyPass /loleaflet https://127.0.0.1:9980/loleaflet 重试=0
  ProxyPassReverse /loleaflet https://127.0.0.1:9980/loleaflet

  # WOPI 发现 URL
  ProxyPass /hosting/discovery https://127.0.0.1:9980/hosting/discovery 重试=0
  ProxyPassReverse /托管/发现 https://127.0.0.1:9980/托管/发现

  # 主 websocket
  ProxyPassMatch "/lool/(.*)/ws$" wss://127.0.0.1:9980/lool/$1/ws nocanon

  # 管理控制台 websocket
  ProxyPass /lool/adminws wss://127.0.0.1:9980/lool/adminws

  # 下载为、全屏演示和图像上传操作
  ProxyPass /lool https://127.0.0.1:9980/lool
  ProxyPassReverse /lool https://127.0.0.1:9980/lool

答案1

提前警告:您绝对不应该使用管理工具的密码password。即使您确实打算以某种方式限制访问,也很容易犯错误并引来恶意人士。

显示为不受信任的 docker 容器证书是预期行为。但是,如果您也通过 apache 转发 CODE 安装,那么自动生成的证书就无关紧要了。

出于除了简单的“我不想关心证书”之外的原因,CODE 的推荐设置在设计上完全避免了证书麻烦,通过要求您在与 nextcloud 安装不同的域(可能具有单独的证书)上设置 CODE。

将您的 nextcloud 放在一个(子)域上,例如 www.example.com,并在您的 apache 配置中配置一个附加条目,例如 code.example.com,它将请求转发到 127.0.0.1:9980(忽略证书,相信没有恶意用户可以在该端口和设备组合上设置不同的服务)。

按照官方指南操作,然后将https://127.0.0.1:9980URL 放入 code.example.com 的 apache 配置中(类似于/etc/httpd/conf.d/collaboraonlineCODE.conf民众将 CODE 安装的域名https://code.example.com放入 nextcloud 配置中(类似于)https://example.com/settings/admin。这确保您可以在任何计算机上以与 nextcloud 相同的方式访问 CODE,而不仅仅是运行安装的计算机。

¹⁾ 这样,docker 容器就不包含证书,考虑到 CODE 的安全性没有任何合理的加强,这是一个相当明智的选择。

答案2

不要在 nextcloud 中使用您自己的证书。自签名的特殊证书就可以了。我还没有完全启动并运行它,但这个错误已经过去了。

相关内容