Google app engine 使用Google云端点的机器到机器身份验证

Google app engine 使用Google云端点的机器到机器身份验证,google-app-engine,authentication,ssl,google-cloud-endpoints,client-certificates,Google App Engine,Authentication,Ssl,Google Cloud Endpoints,Client Certificates,上下文 我们已经使用Google Cloud Endpoints(Python)创建了一个API,许多低功耗设备将使用该API获取/发布数据 与API的唯一通信将来自这些定制设备(我拥有通信的两端) 研究 关于身份验证,我们希望它能像使用SSL/TLS客户端证书一样简单: 每个远程设备都将有一个由单个项目CA签名的客户端证书 谷歌云端点强制使用SSL 然而,似乎只有oauth2得到支持;我正在寻找一种“干净”的方式来实现“免提”身份验证,最好是利用我已经在客户端设备上拥有的客户端SSL证书

上下文

我们已经使用Google Cloud Endpoints(Python)创建了一个API,许多低功耗设备将使用该API获取/发布数据

与API的唯一通信将来自这些定制设备(我拥有通信的两端)

研究

关于身份验证,我们希望它能像使用SSL/TLS客户端证书一样简单:

  • 每个远程设备都将有一个由单个项目CA签名的客户端证书
  • 谷歌云端点强制使用SSL
然而,似乎只有oauth2得到支持;我正在寻找一种“干净”的方式来实现“免提”身份验证,最好是利用我已经在客户端设备上拥有的客户端SSL证书

我已经研究过创建“服务”oauth2帐户,但是,由于我想防止设备欺骗另一个设备(不接受所有设备的一组凭据),我需要为每个客户端设备生成一个服务帐户,这将是一个庞大而可怕的API端维护

似乎我正迫在眉睫地需要在我的代码中为每个API方法添加一层身份验证,这在某种程度上违背了利用谷歌云端点服务的观点

问题。。。最后

  • 有没有人有过针对谷歌云端点大规模认证“不插手”机器对机器设备的经验

  • 有人知道在Oauth2身份验证过程中以GCE支持的方式使用客户端证书的方法吗

  • 我唯一的选择是基于POST/GET头中的一些加密数据在API方法中进行自定义身份验证。(或者只是转向使用Apache/NGINX和客户端证书身份验证托管API?)

  • 问候,, 马特

    我给你写了一篇文章:

    考虑云端点基本上存在于OSI模型的应用层中,因为它通过HTTPS请求进行通信(它在TLS会话中发送HTTP请求)。端点是否使用HTTP或HTTPS不是开发人员可配置的选项-它必须是HTTPS

    它使用HTTPS,因为API服务器具有用于对API服务器进行身份验证的TLS证书。在安全连接内部,RPC参数和响应也会受到保护,不会被窃听。这是端点与TLS“交互”的程度-它使用它建立会话并在此会话内发送HTTP请求

    因此,我已经可以告诉您,在连接设置阶段,您将无法使用TLS客户端证书(不是经常使用的功能)由端点自动对API客户端进行身份验证。端点API服务器不会查看或请求TLS客户端证书

    现在,虽然API服务器本身的身份验证通过API服务器的TLS证书得到保证,但API客户端的身份验证是通过或完成的,它位于您的代码中,并通过App Engine目前提供的不同身份验证选项进行抽象:

    • OAuth(2.0)
    • OpenID
    因此,为了以这两种方式之一对客户端设备进行身份验证,并且仍然利用云端点,您需要为每个设备找到一种方法来执行OAuth流或OpenID流,您的系统在该设备初始部署时为相应的身份验证方法提供了一个标识

    谷歌(应用程序)账户选项

    这将涉及为每个设备创建一个谷歌帐户(谷歌的统一SSO)或一个由自定义域管理的谷歌应用程序帐户,并为每个设备提供这些帐户的凭据。您可以阅读有关自定义域身份验证和应用程序引擎身份验证配置的更多信息

    OpenID选项()

    这将涉及在GCE实例上使用OpenID connect库(如)设置您自己的OpenID提供程序,以便您可以自己设置帐户,也可以涉及向每个设备的已知OpenID提供程序注册帐户。第一个解决方案更健壮,但更耗时(OpenID提供商可能会暂时关闭,或永远停用,然后你的物联网网络就不走运了)

    使用客户端ID的第三个选项

    当然,您可以生成一个“已安装的应用程序”客户端ID/secret,并将其分发到网络中的每个设备。他们可以使用此功能将自己作为网络设备进行身份验证(而不是攻击者的笔记本电脑),然后您可以信任设备在每次API调用中将自己的id作为参数准确报告。根据您的设备的可黑客性以及您打算将其分发的范围,此方案不一定能防止设备欺骗对方的id,尽管根据id生成方案,您可能会使其变得非常困难(每个id都是足够长的哈希)

    如果你走这条路,并且你真的很关心这个问题,你可以为每个设备提供一个客户端ID,但是谁知道你是否会在每个应用程序的客户端ID数量上达到某种未记录的限制,此外,这还需要您手工完成,或者编写一个脚本,在无头浏览器上登录到开发人员控制台并执行您需要的操作

    实际使用TLS客户端证书的第四个疯狂选项

    如果您真的打算为auth使用TLS客户端证书,为API使用云端点,那么您可以尝试在请求中发送客户端证书,因为TLS正在加密请求数据(除非你的攻击者找到了有效解决离散对数反问题的方法,在这种情况下,他们可能会忙于攻击更重要的目标(没有冒犯)和永远改变infosec游戏),然后以某种方式读取和验证端点方法中的证书(与您的应用程序一起上载的第三方LIB可能是t