Cloud Foxy 的 TCP/RESTful 代理 - 智能卡的云平台
项目描述
CloudFoxy - FoxyProxy
此代理使用 CloudFoxy RESTful API 连接实现简单 TCP 请求的客户端。您可以通过 GitLab 问题发送任何支持请求或在https://keychest.freshdesk.com打开支持票证
外部依赖
sudo yum install gcc libffi-devel python-devel openssl-devel
安装
安装应用程序
pip install foxyproxy
或者
pip install --upgrade --no-cache-dir foxyproxy
并创建文件夹/opt/cloudfoxy,我们可以在其中存储或相关的文件和数据
安装主管以自动重启
pip install supervisor
mkdir -p /etc/supervisord/conf.d
echo_supervisord_conf > /etc/supervisord/supervisord.conf
echo [include] >> /etc/supervisord/supervisord.conf
echo "files = conf.d/*.conf" >> /etc/supervisord/supervisord.conf
nano /etc/supervisord/supervisord.conf
找到带有inet_http_server的一行并取消注释它(部分名称),第一行类似于“port=127.0.0.1:9001”
systemctl start supervisord
systemctl enable supervisord #重启后自动重启
nano /etc/supervisord/conf.d/foryproxy.conf
并填写以下内容
[program:foxyproxy]
directory=/opt/cloudfoxy
command=foxyproxy -s http://127.0.0.1:8081 -c ica
user=root
autostart=true
autorestart=true
stderr_logfile=/var/log/foxyproxy.log
stdout_logfile=/var/log/foxyproxy.log
您可以根据需要调整参数。
重启主管:
systemctl restart supervisord
supervisorctl- 是一个客户端,显示进程的状态 - 它有如下命令:
- 开始<名称>
- 停止<名称>
- 重新启动 <名称>
- reread # 读取配置文件并显示更改
- reload # 加载新配置以用于将来的命令
TCP接口
代理的 TCP 接口开始监听 4001 端口。可以使用命令行参数调整端口-p<port>。同样,RESTful 服务器的地址可以用-s<url:port>.
TCP 客户端可以在一段时间内发送多个命令,因为服务器保持连接打开,直到其客户端关闭它们。
每个请求至少包含 2 行:
- 读卡器识别
- 一个或多个命令 - 每个都在单独的行中
示例 1 - 摘要
><card reader name>"|"
><cmd ID1>:<command1>:<data>:<object>"|"
><cmd ID2>:<command2>:<data>:object"|"
<empty line>
随后对此请求作出回应:
<cmd ID1>:<response 1>
<cmd ID2>:<response 2>
@@
示例 2
>OMNIKEY AG 3121 USB|
>1:RESET|
>2:APDU|00 A4 00 0C 02 3F 00|
<empty line>
随后的回应
1:6F048400A5009000
2:9000
@@
示例 3
>*|
>1:ENUM|12
<empty line>
第一行创建用于选择一组读卡器的正则表达式,ENUM 命令的可选数字参数限制返回给客户端的终端数量。
随后的回应
1:<base64 string of terminal names separated with "|">
TCP 命令
目前为 TCP 接口实现了四个命令:
- RESET - 重置特定的智能卡
- EMPTYLINE - 一个帮助命令,它将使代理等待一个空的新行来完成对客户端的侦听
- APDU - 根据 ISO7816 规范发送命令
- ENUM - 返回具有有效签名证书的智能卡读卡器列表 - 读卡器名称采用 base64 编码,用“|”分隔
- LIST - 返回所有智能卡读卡器的列表 - 读卡器名称采用 base64 编码,用“|”分隔
- ALIASES - 从连接的智能卡中的证书返回名称列表,名称采用 base64 编码,因为它们可能包含 utf-8 字符;名称用“|”分隔
- CHAIN - 返回特定别名的证书链
- SIGN - 请求特定智能卡的签名
前三个是低级命令,要么直接发送到智能卡,要么只返回智能卡名称列表。ALIASES、CHAIN 和 SIGN 是针对特定智能卡(由 [http://ica.cz](I.CA - 一家捷克公司)出售的 eIDAS 智能卡)量身定制的抽象命令。它们展示了如何扩展 API,尽管 CloudFoxy RESTful API 还允许通过使用简单 JSON 表示法定义的协议定义抽象命令。
CloudFoxy 智能卡
CloudFoxy 可以连接通过 USB 端口连接的智能卡 - 如上面的示例所示,但我们构建它的主要原因是为 CloudFoxy 硬件平台提供一个方便的接口,该平台最多可以托管 120 个智能卡。
CloudFoxy RESTful 服务器可以连接到其中的多个,并提供对数千张智能卡的访问。
CloudFoxy 智能卡具有以下名称格式:
"CloudFoxy " | <IP address> | "@" | <id> - example "CloudFoxy 192.168.42.10@120"
这是 geeky 的丰富格式/<IP address> |"@"|<id>,例如,/192.168.42.10@120
端到端数据流示例
虽然可以在 此处找到 CloudFoxy RESTful API 的详细描述,但演示整个数据流是有意义的,它会妥协:
- 您的应用程序/telnet/脚本/APDUPlay(Windows PC/SC 库)
- 代理服务器
- CloudFoxy 服务器
要求
客户端-> foxyproxy
>CloudFoxy 192.168.42.10@12|
>2342:RESET|
>2343:APDU:00A4040008A00000000300000000|
<empty line>
foxyproxy -> CloudFoxy RESTful
假设 RESTful API 在http://restful.cloudfoxy.com:8081 地址运行。
http://restful.cloudfoxy.com:8081/api/v1/basic?reset=1&terminal=%2F192.168.42.10%4012
http://restful.cloudfoxy.com:8081/api/v1/basic?apdu=00A4040008A00000000300000000&terminal=%2F192.168.42.10%4012
*注意:对 RESTful API 的每个请求都必须有一个 X-Auth-Token 标头。机密在每个 CloudFoxy RESTful 服务器的配置中定义。
回复
/api/v1/basicCloudFoxy RESTful 返回对每个 GET 请求的响应,如果使用端点,这将是一个简单的文本响应。
CloudFoxy RESTful -> foxyproxy
上面有两个请求,它们可能会提供单独的响应,如下所示:
- 回应1:
6F048400A5009000 - 回应2:
9000
foxyproxy -> 客户端
TCP 代理将合并响应并将所有消息发送回客户端:
2342:6F048400A5009000
2343:9000
CloudFoxy RESTful - 其他端点
这是关于使用 CloudFoxy RESTful 的其他选项的附注。如果你使用