git地址:
https://github.com/go-acme/legohttps://github.com/go-acme/lego
说明:
获取 Let's Encrypt 证书 有3种方式:
- 通过80端口方式获取。
- 通过https的443端口方式获取。
- 通过 云服务商增加dns解析获取,支持泛域名。
通过80端口方式获取
// You'll need a user or account type that implements acme.User
type MyUser struct {
Email string
Registration *registration.Resource
key crypto.PrivateKey
}
func (u *MyUser) GetEmail() string {
return u.Email
}
func (u MyUser) GetRegistration() *registration.Resource {
return u.Registration
}
func (u *MyUser) GetPrivateKey() crypto.PrivateKey {
return u.key
}
func main() {
// 创建key 并指定邮箱
privateKey, err := ecdsa.GenerateKey(elliptic.P256(), rand.Reader)
if err != nil {
log.Fatal(err)
}
myUser := MyUser{
Email: "you@yours.com",
key: privateKey,
}
config := lego.NewConfig(&myUser)
// 设置 ca服务器地址
config.CADirURL = lego.LEDirectoryProduction
config.Certificate.KeyType = certcrypto.RSA2048
// 初始化
client, err := lego.NewClient(config)
if err != nil {
log.Fatal(err)
}
//不同处==========================================================
//http的方式
err = client.Challenge.SetHTTP01Provider(http01.NewProviderServer("", "80"))
if err != nil {
log.Fatal(err)
}
//不同处==========================================================
// 新用户注册
reg, err := client.Registration.Register(registration.RegisterOptions{TermsOfServiceAgreed: true})
if err != nil {
log.Fatal(err)
}
myUser.Registration = reg
//设置域名
request := certificate.ObtainRequest{
Domains: []string{"mydomain.com"},
Bundle: true,
}
//获取证书
certificates, err := client.Certificate.Obtain(request)
if err != nil {
log.Fatal(err)
}
fmt.Printf("%#v\n", certificates)
}
通过https的443端口方式获取。
//不同处==========================================================
//https的方式
err = client.Challenge.SetTLSALPN01Provider(tlsalpn01.NewProviderServer("", "443"))
if err != nil {
log.Fatal(err)
}
//==========================================================
通过 云服务商增加dns解析获取(阿里云),支持泛域名。
//不同处==========================================================
//dns的方式(阿里云)
dnsConfig.APIKey = 阿里云的appKey
dnsConfig.SecretKey = 阿里云的SecretKey
dnsProviderCfg, err := alidns.NewDNSProviderConfig(dnsConfig)
err = client.Challenge.SetDNS01Provider(dnsProviderCfg)
if err != nil {
log.Fatal(err)
}
//==========================================================