用 let's Encrypt 實現 HTTPS 示例( fasthttp 與net/http)
[摘要] let's Encrypt 是一個免費提供 HTTPS 的簽名服務, 這裡提供一個示例,用 certmagic 實現 fasthttp 與 net/http 上支援 HTTPS
0. 基本配置
我的域名, 包括 tsingson.io 與 www.tsingson.io , 在 DNS 上加上 A 記錄, 指向我的伺服器 IP
為了在 let's Encrypt 獲取 HTTPS 簽名證書, 使用 tsingson_at_me_com 這個郵箱進行管理
伺服器上, 把 HTTPS 簽名證書檔案存在 /home/go/bin/ 路徑下
1. 使用 certmagic 庫獲取 HTTPS證書, 生產模式( 另有測試模式)
package autotls
import (
"github.com/mholt/certmagic"
"golang.org/x/xerrors"
)
// LetsEncryptTLS the management of let's Encrypt to get domain's key and cert file
// path to save the cache of key/cert file
// email is your email , to manage domain in let's Encrypt
// domainName , like tsingson.io / www.tsingson.io ... the domain name list
func LetsEncryptTLS(path string, email string, domainName ...string) (err error) {
config := certmagic.Config{
Agreed: true,
Storage: &certmagic.FileStorage{Path: path},
CA: certmagic.LetsEncryptProductionCA, // use certmagic.LetsEncryptStagingCA for testing
Email: email, // your email to management let's Encrypt
}
cache := certmagic.NewCache(certmagic.CacheOptions{
GetConfigForCert: func(cert certmagic.Certificate) (certmagic.Config, error) {
return config, nil
},
})
magic := certmagic.New(cache, config)
if len(domainName) == 0 {
return xerrors.New("Need one DomainName at least")
}
err = magic.Manage(domainName)
if err != nil {
return
}
return
}
呼叫方式, 見程式碼
go autotls.LetsEncryptTLS("/home/go/bin/", "tsingson@me.com", "www.tsingson.io", "tsingson.io")
time.Sleep(1 * time.Minute) // 等待一下, 讓 HTTPS 證書快取成功........
首次執行前, 請建立 /home/go/bin 路徑
執行時會列印日誌, 約有 3秒左右, 會成功獲取 HTTPS 簽名證書, 存在以下路徑( 注: 生產模式 )
/home/go/bin/acme # tree .
.
└── acme-v02.api.letsencrypt.org
├── challenge_tokens
├── sites
│ ├── tsingson.io
│ │ ├── tsingson.io.crt
│ │ ├── tsingson.io.json
│ │ └── tsingson.io.key
│ └── www.tsingson.io
│ ├── www.tsingson.io.crt
│ ├── www.tsingson.io.json
│ └── www.tsingson.io.key
└── users
└── tsingson@me.com
├── tsingson.json
└── tsingson.key
7 directories, 8 files
certmagic 的 Manage 將來會自動更新 HTTPS 證書
注: 測試模式, 快取的 HTTPS 證書儲存路徑不太一樣, 請自行檢查路徑
2. 在 net/http 上使用
package main
import (
// "fmt"
// "io"
"net/http"
"log"
"github.com/tsingson/vk/fast/autotls"
)
func HelloServer(w http.ResponseWriter, req *http.Request) {
w.Header().Set("Content-Type", "text/plain")
w.Write([]byte("This is an example server.\n"))
// fmt.Fprintf(w, "This is an example server.\n")
// io.WriteString(w, "This is an example server.\n")
}
func main() {
go autotls.LetsEncryptTLS("/home/go/bin/", "tsingson@me.com", "www.tsingson.io", "tsingson.io")
time.Sleep(1 * time.Minute)
http.HandleFunc("/hello", HelloServer)
err := http.ListenAndServeTLS(":443", "/home/go/bin/acme-v02.api.letsencrypt.org/site/tsingson.io/tsingson.io.crt", "/home/go/bin/acme-v02.api.letsencrypt.org/site/tsingson.io/tsingson.io.key", nil)
if err != nil {
log.Fatal("ListenAndServe: ", err)
}
}
3. 在 fasthttp 上使用
package main
import (
"log"
"github.com/valyala/fasthttp"
"github.com/tsingson/vk/fast/autotls"
)
func main() {
go autotls.LetsEncryptTLS("/home/go/bin/", "tsingson@me.com", "www.tsingson.io", "tsingson.io")
time.Sleep(1 * time.Minute)
fs := &fasthttp.FS{
// Path to directory to serve.
Root: "/home/www/static-site",
// Generate index pages if client requests directory contents.
GenerateIndexPages: true,
// Enable transparent compression to save network traffic.
Compress: true,
}
// Create request handler for serving static files.
h := fs.NewRequestHandler()
s := &fasthttp.Server{
Handler: h,
}
// Start the server.
if err := fasthttp.ListenAndServeTLS(":443", "/home/go/bin/acme-v02.api.letsencrypt.org/site/tsingson.io/tsingson.io.crt", "/home/go/bin/acme-v02.api.letsencrypt.org/site/tsingson.io/tsingson.io.key", h); err != nil {
log.Fatalf("error in ListenAndServe: %s", err)
}
}
4. 小結
瀏覽器上驗證, 步驟省略.........
Done. 完美.......
let's Encrypt 的測試模式, 在瀏覽器上驗證, 會提示, 不是安全的 HTTPS 簽名證書.
換成生產模式就好了...........
_
_
_
關於我
網名 tsingson (三明智, 江湖人稱3爺)
原 ustarcom IPTV/OTT 事業部播控產品線技術架構溼/解決方案工程溼角色(8年), 自由職業者,
喜歡音樂(口琴,是第三/四/五屆廣東國際口琴嘉年華的主策劃人之一), 攝影與越野,
喜歡 golang 語言 (商用專案中主要用 postgres + golang )
_
相關文章
- 使用Let’s Encrypt實現網站https化網站HTTP
- Let's Encrypt 泛域名httpsHTTP
- let's encrypt 申請 https 證書HTTP
- Windows Server 下 IIS 申請部署 Let’s Encrypt 證書實現 免費 HTTPSWindowsServerHTTP
- 免費 HTTPS 證書 Let's Encrypt 安裝教程HTTP
- Let's Encrypt 申請免費的 Https 證書HTTP
- 通過 Certbot 安裝 Let's Encrypt 證書,來實現全站的 HTTPS 訪問HTTP
- 透過 Certbot 安裝 Let's Encrypt 證書,來實現全站的 HTTPS 訪問HTTP
- 通過 Certbot 安裝 Let's Encrypt 證書,實現免費的全站 HTTPS 訪問HTTP
- 申請Let’s Encrypt萬用字元HTTPS證書(certbot版)字元HTTP
- cert-manager + Let‘s Encrypt + DNS 實現基於K8S的https證書自動簽發DNSK8SHTTP
- Let's Encrypt - 免費SSL/TLS證書用起來TLS
- CentOS 下 Nginx 配置 Let’ s Encrypt 證書CentOSNginx
- bench fasthttp 和 庫自帶的net.http效能,fasthttp完敗?ASTHTTP
- 使用 Let's Encrypt 保護你的網站網站
- 申請Let's Encrypt永久免費SSL證書
- 申請Let's Encrypt萬用字元SSL證書字元
- Let's Encrypt 泛域名證書申請及配置
- 用 Python 寫了一個 Let's Encrypt 的 wildcard 證照小工具Python
- docker獲取Let's Encrypt永久免費SSL證書Docker
- 免費SSL證書Let's Encrypt的替代:SSL.com
- 申請Let’s encrypt免費證書,並自動續訂.
- Let's Encrypt 免費萬用字元 SSL 證書申請教程字元
- 更新:為 NGINX 配置免費的 Let's Encrypt SSL/TLS 證書NginxTLS
- SSL:http與httpsHTTP
- Let's Encrypt 釋出ACME v2 正式支援萬用字元證書ACM字元
- 由於Bug,Let's Encrypt決定吊銷300多萬張證書!
- 解決Let’s Encrypt SSL證書”DNS problem: NXDOMAIN looking up A for xxx.com”DNSAI
- Let's Encrypt 倡議新證書策略 提高抗網路攻擊能力
- HTTP與HTTPS:為什麼HTTPS比HTTP更安全?HTTP
- NGINX使用rewrite實現http 跳轉 httpsNginxHTTP
- 基於Let's Encrypt生成免費證書-支援多域名泛域名證書
- Http與Https協議HTTP協議
- HTTP 與 HTTPS 簡介HTTP
- golang使用fasthttp 發起http請求GolangASTHTTP
- 使用 acme.sh 從 Let’ s Encrypt 生成免費的萬用字元 SSL 證書ACM字元
- Let's Encrypt 2019:保持強勁增長 並帶來振奮人心的新功能
- HTTP 與 HTTPS 的區別HTTP