我在linux-amd64上构建了我的程序的darwin-amd64版本,交叉编译命令是:
GOOS=darwin GOARCH=amd64 GOBIN=/tmp go install <myprogram>
在此之前,我使用以下方法准备了darwin-amd64工具链:
sudo GOOS=darwin GOARCH=amd64 ./make.bash
但是,在将此darwin-amd64版本二进制文件提供给我的同事后,他们无法使用它进行登录,因为login将发送一个HTTPS请求,该请求将使用CGO。 Errmsg返回的是:
x509: failed to load system roots and no roots provided
有关如何解决此问题的任何建议吗?
答案 0 :(得分:1)
这看起来像证书问题,正如#34; Building Docker Images for Static Go Binaries&#34;
中提到的那样原因是在Linux系统上,tls包从
/etc/ssl/certs/ca-certificates.crt
读取根CA证书,这些证书从暂存图像中丢失。
Contributors应用程序通过捆绑根CA证书的副本并配置出站调用来解决此问题。
因此,您可以检查同事的工作站上是否有/etc/ssl/certs/ca-certificates.crt
。
刚刚得到some clarifications from go-nuts。由于交叉编译而无法加载x509证书...
交叉编译器无法使用&#39; cgo&#39;在编译期间,但是&#39; cgo&#39;需要访问达尔文的根证书存储区。
我有类似的问题,在从这些Linux发行版中复制
crt
文件后解决了。要让Golang读取文件,您必须将文件放在完全相同的目录中crypto/x509
将循环遍历all the possible certificate files。
另一个解决方案涉及与&#34; export CGO_ENABLED=0
&#34;进行交叉编译。
bug 8349显示了最近Go的一些进展。