proposal: cmd/go: enable mutual TLS authentication with client certificates in the go tool

yduiuuwa  于 6个月前  发布在  Go
关注(0)|答案(7)|浏览(57)

将客户端TLS证书+密钥+CA证书(通过环境变量或其他方式)传递给go工具是非常有用的,尤其是在那些认真对待零信任网络(ZTN)的环境,以及go工具需要与生活在公共云中使用相互TLS进行认证和授权的其他端点(replace目标)进行通信的情况下。"其他端点"可以是GOPROXY服务器或重定向器(如golang.org),用于提供元标签。由于ZTN原则之一是“每个网络连接都必须经过身份验证和授权”,问题是如何使用go工具及其发起的请求来实现这一点。
从技术上讲,这可能涉及到如何将期望的TLS选项(密钥/证书/cacert文件名等)传递给tls.Config,以便go在发起连接时使用。

dgenwo3n

dgenwo3n1#

CC @bradfitz@FiloSottile@jayconrod

20jt8wwn

20jt8wwn2#

我认为可能的身份验证方案范围太广,因此这些应该由一个本地的GOPROXY来处理,它将未经身份验证的协议暴露给客户端,并对上游执行任何您想要的身份验证。
我开始认为让GOPROXY成为一个二进制文件,让go工具自己运行会更好,这样即使是小任务也可以设置GOPROXY,而不必在本地机器上运行网络服务,这会产生很多摩擦。

lndjwyie

lndjwyie3#

我认为本地 GOPROXY 解决方案的一个缺点是,每个运行 go 的人都需要玩认证游戏,不仅需要设置一些环境变量,还需要获取/安装/保持更新,并确保 go 能够找到并执行那个单独的程序 - 除了为 GOPROXY 设置一个环境变量。它似乎还打开了一个额外的安全攻击向量 - 至少,你必须担心通过本地 GOPROXY 二进制文件可能会出现什么样的“有趣”的妥协。就我个人而言,对于 mTLS,我更希望能够告诉 go 从哪里获取 cert/key/cacert,然后处理创建(?)/设置额外的二进制文件。

oyt4ldly

oyt4ldly4#

让我们先让基本的HTTP认证工作起来( #26232 ),然后再回到考虑更奇特的认证方式,如TLS客户端证书。

vlju58qv

vlju58qv5#

我们能够将客户端证书传递给go工具将会非常有用。我想这个问题与#26232不同,因为在没有进行tls握手的情况下,不会传输text/html。所以它不能通过扩展到访问被拒绝的页面来解决。
我同意@dmitris保持本地工具数量较小的观点,并会提出如果存在-insecure标志,那么-client-cert(或与之匹配的环境变量)将是有效的。
我期待着看到这个的更新,并让我知道是否可以在某种程度上提供帮助。

lymgl2op

lymgl2op6#

有一个临时解决方案。我使用一个 MITM 工具来提供客户端证书。
例如:

mitmdump --listen-host ${ip_address} --listen-port ${port} --ignore-hosts=${whitelist} --set client_certs=${cert}

并设置

go env -w GOPRIVATE="your company repo"
hzbexzde

hzbexzde7#

我真的很想能够使用客户端证书。我们有机会实现这个功能吗?如果有兴趣,我会尝试提供一个pull请求。

相关问题