将客户端TLS证书+密钥+CA证书(通过环境变量或其他方式)传递给go
工具是非常有用的,尤其是在那些认真对待零信任网络(ZTN)的环境,以及go
工具需要与生活在公共云中使用相互TLS进行认证和授权的其他端点(replace
目标)进行通信的情况下。"其他端点"可以是GOPROXY服务器或重定向器(如golang.org
),用于提供元标签。由于ZTN原则之一是“每个网络连接都必须经过身份验证和授权”,问题是如何使用go工具及其发起的请求来实现这一点。
从技术上讲,这可能涉及到如何将期望的TLS选项(密钥/证书/cacert文件名等)传递给tls.Config
,以便go
在发起连接时使用。
7条答案
按热度按时间dgenwo3n1#
CC @bradfitz@FiloSottile@jayconrod
20jt8wwn2#
我认为可能的身份验证方案范围太广,因此这些应该由一个本地的GOPROXY来处理,它将未经身份验证的协议暴露给客户端,并对上游执行任何您想要的身份验证。
我开始认为让GOPROXY成为一个二进制文件,让go工具自己运行会更好,这样即使是小任务也可以设置GOPROXY,而不必在本地机器上运行网络服务,这会产生很多摩擦。
lndjwyie3#
我认为本地 GOPROXY 解决方案的一个缺点是,每个运行 go 的人都需要玩认证游戏,不仅需要设置一些环境变量,还需要获取/安装/保持更新,并确保
go
能够找到并执行那个单独的程序 - 除了为 GOPROXY 设置一个环境变量。它似乎还打开了一个额外的安全攻击向量 - 至少,你必须担心通过本地 GOPROXY 二进制文件可能会出现什么样的“有趣”的妥协。就我个人而言,对于 mTLS,我更希望能够告诉go
从哪里获取 cert/key/cacert,然后处理创建(?)/设置额外的二进制文件。oyt4ldly4#
让我们先让基本的HTTP认证工作起来( #26232 ),然后再回到考虑更奇特的认证方式,如TLS客户端证书。
vlju58qv5#
我们能够将客户端证书传递给
go
工具将会非常有用。我想这个问题与#26232不同,因为在没有进行tls握手的情况下,不会传输text/html。所以它不能通过扩展到访问被拒绝的页面来解决。我同意@dmitris保持本地工具数量较小的观点,并会提出如果存在
-insecure
标志,那么-client-cert
(或与之匹配的环境变量)将是有效的。我期待着看到这个的更新,并让我知道是否可以在某种程度上提供帮助。
lymgl2op6#
有一个临时解决方案。我使用一个 MITM 工具来提供客户端证书。
例如:
并设置
hzbexzde7#
我真的很想能够使用客户端证书。我们有机会实现这个功能吗?如果有兴趣,我会尝试提供一个pull请求。