通过网络对 LXD rest API 进行身份验证,证书身份验证一直失败

通过网络对 LXD rest API 进行身份验证,证书身份验证一直失败

我正在尝试通过网络访问 LXD REST API。

关注:文档链接

  1. lxc config set core.https_address "[::]:8443"
  2. lxc config set core.trust_password <some random password>
  3. curl -s -k --cert ~/.config/lxc/client.crt --key ~/.config/lxc/client.key https://127.0.0.1:8443/1.0/certificates -X POST -d '{"type": "client", "password": "some-password"}' | jq

就像声明的那样这里官方 REST API 文档。

GET to / is allowed for everyone (lists the API endpoints)

但在将浏览器(Chrome)指向

  • http://<server-ip>:8443
  • https://<server-ip>:8443

二者的结果都是ERR_INVALID_HTTP_RESPONSE

client.crt通过 Chrome > 设置 > 管理证书和导入,添加了Windows 10 证书。

用 POSTMAN 试过

还是同样的问题。

从服务器内部访问时,一切正常。

curl -s -k --cert ~/.config/lxc/client.crt --key ~/.config/lxc/client.key https://127.0.0.1:8443/1.0 | jq .metadata.auth

上述命令运行正常。

我对基于证书的身份验证的理解非常有限。任何指点都将不胜感激。

答案1

经过多次尝试和错误,我终于偶然发现了这一点关联。LXD 配置的一部分工作得很好。下面是我遵循的步骤。

安装ZFSLXD然后执行sudo LXD init以完成正常配置。

在那之后,

LXD 的配置

  1. sudo lxc config set core.https_address [::]:8443,它可以成为您的首选端口。
  2. sudo lxc config set core.https_allowed_origin "*"理想情况下,用可以访问 API 的域名替换开头。*这样就可以从任何地方访问它。
  3. sudo lxc config set core.https_allowed_methods "GET, POST, PUT, DELETE, OPTIONS"
  4. sudo lxc config set core.https_allowed_headers "Content-Type"
  5. sudo service lxd restart # sometimes is required

设置身份验证证书(自签名)

  1. mkdir lxd-api-access-cert-key-files
  2. cd lxd-api-access-cert-key-files

这只是为了将与身份验证相关的文件保存在单独的目录中。


  1. openssl genrsa -out lxd-webui.key 4096,这将为您生成一个私钥。
  2. openssl req -new -key lxd-webui.key -out lxd-webui.csr,这将创建一个证书请求。
  3. openssl x509 -req -days 3650 -in lxd-webui.csr -signkey lxd-webui.key -out lxd-webui.crt. 生成自动签名的证书。
  4. openssl pkcs12 -keypbe PBE-SHA1-3DES -certpbe PBE-SHA1-3DES -export -in lxd-webui.crt -inkey lxd-webui.key -out lxd-webui.pfx -name "LXD WebUI".pfx, 这将以可在浏览器内部用于身份验证的格式导出密钥。
  5. 现在下载该lxd-webui.pfx文件。本地。
  6. 将文件导入到浏览器。
    1. Chrome Linux
    2. Chrome 窗口
    3. 火狐浏览器
  7. lxc config trust add lxd-webui.crt告诉 LXC 使用此证书进行身份验证。

测试

  • 现在关闭并重新启动浏览器。
  • 将浏览器指向https://[serveri-ip]:[port-defined-earlier]/1.0/networks

这应该会给出类似下面的响应, {"type":"sync","status":"Success","status_code":200,"operation":"","error_code":0,"error":"","metadata":["/1.0/networks/lo","/1.0/networks/ens33","/1.0/networks/lxdbr0"]}

相关内容