问题标签 [autocert]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
0 回答
435 浏览

go - 在 Go 中使用 Autocert 并附加自签名证书以在本地提供 https

我的目标是在本地和生产中提供一个简单的 https 端点。我找到了我相信我可以在生产中使用的autocert包,让我们加密。我发现gssc可以使用自签名证书在本地启动 https 服务器。最后,How to trust extra CA certs in your Go App看起来很有用。我从所有这些来源中汲取了想法并尝试将它们一起使用,尽管我不确定是否需要所有这些。

我的理解是,我可以使用AppendCertsFromPEM将自签名证书附加到另一个证书,这将使客户端在尝试本地加载时不再抱怨。同样显然使用 autocert 我什至不需要自己在本地机器上生成证书文件。

当我访问时,https://localhost:443我仍然收到以下错误:

2020/02/18 14:38:42 http:来自 [::1]:51832 的 TLS 握手错误:EOF

为了附加一个自签名证书,我从这里下载了一个公开可用的证书,然后将我的附加到这个证书上。这是正确的方法还是我需要其他地方的另一种方法(我在本地系统上找不到)。

这是我的代码:

我读到我不需要提供任何东西,server.ListenAndServeTLS因为我们正在使用自动证书,但后来我遇到了一个错误,因为它无法打开文件。

基本上,如果没有 DNS 更改等,我实际上是否能够使用附加证书从 localhost 提供某些内容,而不会在我的本地浏览器中出现“此连接不是私有”警告,如果是,我需要在代码中进行哪些更改才能实现这一点可能的?

0 投票
0 回答
400 浏览

go - 如果代理正在转发,Golang 中的 AutoCert 可以使用自定义端口吗?

在 Golang 中,使用 autocert,我不断看到这样的例子:

但是,我有一个包含许多站点(go 应用程序)的服务器,并且我使用 NGINX 来代理流量。我可以做这样的事情吗?

如果没有,还有其他解决方案吗?

如果是这样,我不确定我做错了什么。我确实看到 certManager.GetCertificate 方法的返回之一是错误。

所以这个问题的第二部分是,我怎样才能捕捉到 certManager.GetCertificate 的错误?我的应用程序可以正常加载和编译。没有错误被抛出。

0 投票
1 回答
2517 浏览

go - 如何解决x509:进行http请求时证书已过期或尚未生效

我有一个从中获取证书的网络服务器golang.org/x/crypto/acme/autocert

我在虚拟机上运行它。

相关代码:

这是我用于 HTTP 请求的内容:resp, err := http.DefaultClient.Get(url)

当我尝试从特定 API 获取时,我收到此错误:x509: certificate has expired or is not yet valid current time 2020-12-28T17:29:37Z is after 2020-12-26T08:22:28Z

但它只发生在那个特定的 API 上。我已经尝试了其他几个,它们都有效。

该代码一直有效,直到 12 月 26 日证书过期。

另一方面,我写了一个main.go测试,没有我必须在我的网络服务器上使用的所有证书来测试。当我在本地机器上运行代码时,我从 API 中得到响应,没有任何问题。

这是main.go文件: https: //play.golang.org/p/-EB9DIjJYQO

我该如何解决这个问题?

0 投票
1 回答
131 浏览

go - 我无法让 `golang.org/x/crypto/acme/autocert` 工作(对于 gRPC),我得到一个 `acme_account+key` 文件并且没有 X509 证书

更新经过多次调试,我发现Get "https://acme-v02.api.letsencrypt.org/directory": x509: certificate signed by unknown authority并怀疑(!?)这是由于 Let's Encrypt 的根证书最近到期造成的。

我接受“这个包是一个正在进行中的工作,并且没有 API 稳定性承诺。” 但是,如果它不再起作用(而且我的代码|部署很可能存在问题),那么也许可以标记 repo,例如Here be dragons

该代码产生一个acme_account+key( EC PRIVATE KEY) 但没有证书我被挑战去autocert披露(记录)它的魔力,以便了解我哪里出错了。

该代码本质上是 repo 的Manager示例,其中包含来自此answer的输入。我假设ACME 流程完成时会GetCertificate阻塞。

代码:

我正在部署到(Google Compute Engine)容器虚拟机,等效的 docker 命令是:

和容器日志:

主机的/tmp/certs目录接收acme_account+key(我一直在努力寻找由 Google 解释的)但怀疑(!?)是Domain Validation的初始阶段。它包含一个私钥 ( BEGIN EC PRIVATE KEY)。

即使在服务器运行一段时间后,也不会保留更多文件。

我在配置的电子邮件地址没有收到来自 Let's Encrypt 的电子邮件。

不幸的是,虽然易于使用,但autocert产生的日志记录很少,我无法确定是否可以记录(希望)正在发生的 ACME 流。

由于不再创建为GetCertificate,添加匿名函数(我删除了以前的文件以检查它是否已重新创建),因此我无法从中收集任何日志记录,从未调用该函数。这可能是因为我的匿名函数不正确,或者因为我已经超出了对 ACME 端点的请求。删除该功能并恢复为不会导致重新创建,所以我很茫然。acme_account+keym.GetCertificateacme_account+key

autocert Manager类型记录了一个*acme.Client我没有设置的字段。该评论描述了“如果 Client.Key 为零,则会生成一个新的 ECDSA P-256 密钥”,这可能是我正在经历的,但它并没有解释我应该怎么做。我应该将此值设置为的内容acme_account+key吗?:

更新我尝试解码私钥,创建crypto.Signer并传递它,&acme.Client{Key: key}但它没有明显的区别

显然,我使用不正确。我没有从 Let's Encrypt 收到证书,因此无法从端点获取证书,也无法调用 gRPC 端点:

指导将不胜感激。