上下文
已经使用(Python)创建了一个API,许多低功耗设备将使用该API获取/发布数据。
与API的唯一通信将来自这些自定义设备(我拥有通信的两端)。
研究
在身份验证方面,希望它能像使用SSL/TLS客户端证书一样简单:
但是,似乎只有oauth2是受支持的;我正在寻找一种“干净”的方法来实现“离手”身份验证,理想情况下使用我在客户端设备上已经拥有的客户端SSL证书。
我已经研究过创建‘服务’oauth2帐户,但是,由于我想防止设备欺骗另一个设备(所有设备的一组凭证都是不可接受的),我需要为每个客户端设备生成一个服务帐户,在API端维护它会很麻烦。
似乎我即将需要在我的代码中为每个API方法添加一层认证,这在某种程度上克服了使用Google云端点服务的问题。
问题..。最后
你好,马特
发布于 2015-01-03 22:30:03
我给你写了一篇文章:
考虑到云端点基本上存在于OSI模型的应用层,因为它通过HTTPS请求进行通信(它在TLS会话中发送HTTP请求)。无论端点是否使用HTTP或HTTPS,都不是开发人员可配置的选项,它必须是HTTPS。
它使用HTTPS,因为API服务器有一个TLS证书,用于验证API服务器。在安全连接中,RPC参数和响应也不受窃听的保护。这就是端点与TLS“交互”的程度--它使用它来建立会话并在会话中发送HTTP请求。
因此,我已经可以告诉您,在连接安装阶段,您将无法让您的TLS客户端证书(不是经常使用的特性)通过端点自动验证API客户端。TLS客户端证书根本不被端点API服务器查看或请求。
现在,虽然API服务器本身的身份验证是通过API服务器的TLS证书来保证的,但是API客户端的身份验证是通过客户ID或用户API完成的,它们位于您的代码中,并抽象了API目前提供的不同的auth:
因此,为了以这两种方式中的一种方式使用客户端设备,并且仍然利用云端点,您需要为每个设备找到一种方法来执行OAuth流或OpenID流,您的系统在设备初始部署时为相应的auth方法提供了标识。
Google (应用)帐户选项
这将涉及为每个设备创建一个Google帐户( Google的统一SSO)或一个由自定义域管理的Google应用程序帐户,并为每个设备提供这些帐户的凭据。您可以阅读更多关于自定义域身份验证和auth配置的一般这里。
OpenID option (基于GAE的OpenID通用文档)
这将涉及使用OpenID连接库(如吡咯 )在GCE实例上设置自己的吡咯提供程序,这样您就可以自己提供帐户,也可以使用已知的OpenID提供程序为每个设备注册帐户。第一种解决方案更健壮,但更耗时(OpenID提供商可以暂时关闭,或者永远停用,然后您的IOT网络就倒霉了)。
使用客户端ID的第三个选项
当然,您可以生成一个“已安装的应用程序”客户ID/机密,并将其分发到网络中的每个设备。他们可以使用它来验证自己是网络设备(相对于攻击者的膝上型计算机),然后您可以信任设备将自己的id准确地报告为每个API调用的param。取决于设备的可黑客性和打算分发它们的范围,此方案不一定防止设备欺骗对方的id,尽管取决于id生成方案,您可能会使其变得非常困难(每个id都是一个足够长的散列)。
如果你走了这条路,你真的很关心这一点,你可以为每个设备提供一个客户ID,但是谁知道你是否会对每个应用程序的客户ID数量达到某种无文档化的限制,这也要求你要么手工完成,要么编写一个脚本,在无头浏览器上登录到开发控制台,并做你需要的事情。
第四个疯狂选项,它实际使用TLS客户端证书
如果您真的打算为auth使用TLS客户端证书和为您的API使用云端点,您可以尝试在请求中发送客户端证书,因为TLS正在加密请求数据(除非攻击者找到了一种有效解决离散对数逆问题的方法,在这种情况下,他们可能会忙着攻击更重要的目标(无意冒犯),永远改变信息游戏),然后以某种方式读取和读取端点方法中的证书(与应用程序一起上传的第三方库可能是必要的)。
第四个现实选项,如果您的心集中在TLS客户端证书上
从App切换到计算引擎,在那里基本上可以在相同的数据中心管理和托管VM。在此框上,您可以在任何端口上实现任何类型的连接协议,这样您就可以拥有传入的API请求(而不是端点,注意)TLS--基于teh连接设备的客户端证书进行身份验证。
祝好运!
https://stackoverflow.com/questions/27111807
复制相似问题