我是否需要使用nginx或Apache来使用Lets Encrypt?

时间:2016-04-26 18:46:04

标签: apache encryption nginx go lets-encrypt

我有一个基于golang的真正的简单API,它只是在路径上侦听并相应地响应数据库插入。

我想使用Lets Encrypt通过TLS / https提供服务,但所有教程似乎都表明需要使用Apache或nginx。

我喜欢保持我的服务器非常轻松,并且没有看到任何需要引入这些Web服务器的开销(它绝对不是一个完整的网站),而且我的go实现效果很好。

是否可以在没有Apache或nginx的情况下安装它?

1 个答案:

答案 0 :(得分:4)

不,你不需要使用Apache / Nginx,Go处理TLS就好了。

检查http.ListenAndServeTLS

示例:

➜ sudo letsencrypt certonly --standalone --agree-tos --email you@email.com -d domain1.com [-d domain2.com, etc..]
➜ sudo cat /etc/letsencrypt/archive/domain1.com/fullchain1.pem > cert.pem
➜ sudo cat /etc/letsencrypt/archive/domain1.com/privkey1.pem > key.pem 

➜ cat main.go
import (
    "log"
    "net/http"
)

func handler(w http.ResponseWriter, req *http.Request) {
    w.Header().Set("Content-Type", "text/plain")
    w.Write([]byte("This is an example server.\n"))
}

func main() {
    http.HandleFunc("/", handler)
    log.Printf("About to listen on 10443. Go to https://domain1.com:10443/")
    log.Fatal(http.ListenAndServeTLS(":10443", "cert.pem", "key.pem", nil))
}

请注意,如果您希望go服务器侦听端口443(默认https端口),则必须以root身份运行它或使用systemd将端口传递给它。

在端口443上运行的示例:

  1. 将代码更改为log.Fatal(http.ListenAndServeTLS(":443", "cert.pem", "key.pem", nil))

  2. go build

  3. sudo ./your-package-name
  4. 或者如果您不想以root用户身份运行,那么您必须输入cert.pem / key.pem作为您的用户然后运行setcap cap_net_bind_service=+ep your-package-name然后您将能够侦听端口443 / 80作为用户。
  5. 有关使用setcap的更多详细信息:https://wiki.apache.org/httpd/NonRootPortBinding