如何使用SSH隧道与Restful API进行编程通信



我正在使用.NET核心框架构建一个Restful API客户端。API是OpenStack API,但由于网络配置,我无法从本地计算机(也是开发计算机(访问API,我必须在正常访问OpenStack时将其ssh到一台可以ssh到OpenStack基础设施的机器中。

考虑到这一点,是否可以为API端点使用SSH隧道,然后在实现的Web API客户端中调用它?我尝试过这样做,但对端点的调用返回错误401——内容长度是必需的。

基本上可以通过SSH隧道调用Openstack API端点,而无需任何公共可访问的API端点。由于我没有使用.NET核心框架的经验,这个答案在没有C#代码的情况下非常通用。我希望这对你有帮助。

重要提示:只有当您有管理员登录到openstack部署时,才可以使用以下步骤,并且您应该只使用!!!当openstack部署是测试部署时,使用这种方式,在测试部署中中断部署不会影响其他用户。

1.SSH隧道

您可以使用以下命令转发端口:

ssh -L 127.0.0.1:<PORT>:<IP_REMOTE>:<PORT> <USER_JUMPHOST>@<IP_JUMPHOST> -fN

  • <PORT>=要远程访问的Openstack组件的端口(例如,keystone为5000(
  • <IP_REMOTE>=运行openstack部署的主机的IP
  • <USER_JUMPHOST>@<IP_JUMPHOST>=通过ssh访问位于您和openstack部署之间的jumphost

这必须为每个openstack组件完成。如果不希望在后台组中使用此命令,请删除末尾的-fN

在这里,首先您必须转发带有端口5000的Keystone。

示例:ssh -L 127.0.0.1:5000:192.168.62.1:5000 deployer@192.168.67.1 -fN

您可以从本地电脑通过curl或网络浏览器测试访问:

curl http://127.0.0.1:5000
{"versions": {"values": [{"id": "v3.13", "status": "stable", "updated": "2019-07-19T00:00:00Z", "links": [{"rel": "self", "href": "http://127.0.0.1:5000/v3/"}], "media-types": [{"base": "application/json", "type": "application/vnd.openstack.identity-v3+json"}]}]}}

2.更改openstack端点

为了能够通过隧道登录openstack部署,您必须更改端点以监听远程系统上的localhost,您的openstack deposition是:

  1. 以管理员用户身份正常登录openstack部署。

  2. 列出所有端点:openstack endpoint list

  3. keystonepublicinternal-端点更改为localhost:

openstack endpoint set --url http://127.0.0.1:5000 <ID_OF_INTERNAL_KEYSTONE_ENDPOINT>

在更改内部端点后,它将暂时中断远程系统上的openstack登录,但不要担心。

  1. 现在您可以从本地pc通过openstack客户端登录到openstack。在这里,您必须针对本地主机进行授权。如果您使用rc文件登录,则必须将auth url更改为export OS_AUTH_URL=http://127.0.0.1:5000/v3

  2. 通过在本地pcopenstack endpoint set --url "http://127.0.0.1:8774/v2.1" <ID>上运行nova的internalpublic端点来更改nova端点,以便通过ssh隧道运行openstack server list等命令(当然,您还需要8774端口的ssh隧道(来执行此操作。

3.针对openstack部署进行授权

当您在没有openstack客户端的情况下发送HTTP请求时,您必须手动从部署中请求身份验证令牌:

  1. 在openstack部署上正常登录

  2. 提出令牌请求:

curl -v -s -X POST "$OS_AUTH_URL/auth/tokens?nocatalog" -H "Content-Type: application/json" -d '{ "auth": { "identity": { "methods": ["password"],"password": {"user": {"domain": {"name": "'"$OS_USER_DOMAIN_NAME"'"},"name": "'"$OS_USERNAME"'", "password": "'"$OS_PASSWORD"'"} } }, "scope": { "project": { "domain": { "name": "'"$OS_PROJECT_DOMAIN_NAME"'" }, "name": "'"$OS_PROJECT_NAME"'" } } }}' --stderr - | grep X-Subject-Token

此命令可以在不进行更改的情况下使用。密钥X-Subject-Token之后的值是来自Keystone的令牌。复制此值并将令牌导出为环境变量OS_TOKEN。例如下面的行

export OS_TOKEN=gAAAAABZuj0GZ6g05tKJ0hvihAKXNJgzfoT4TSCgR7cgWaKvIvbD66StJK6cS3FqzR2DosmqofnR_N-HztJXUcVhwF04HQsY9CBqQC7pblGnNIDWCXxnJiCH_jc4W-uMPNA6FBK9TT27vE5q5AIa487GcLLkeJxdchXiDJvw6wHty680eJx3kL4
  1. 使用令牌发出请求

例如,使用curl:的GET请求

curl -s -X GET -H "X-Auth-Token: $OS_TOKEN" http://127.0.0.1:5000/v3/users | python -m json.tool

最新更新