免费!让Https证书不再成为烦恼|世界播资讯
2022-11-22 09:29:35 来源:程序员客栈
前言戳这里 Go !
书承上回,上期写了《实战goproxy为中国steam登录加速》后,总是觉得服务端获取到的客户端信息太少了,为了获取更多的客户端信息,就需要解包设置一个中间代理人,我简简单单的用《Lego》申请了证书,两种申请方式:
一种直接就是cli,一种是代码内申请直接使用。
####献上letsencrypt的申请证书的工作原理,就知道为什么有申请和挑战的环节了:
【资料图】
#通过源码进行安装goinstallgithub.com/go-acme/lego/v4/cmd/lego@latest#-----------------申请证书-----------------lego--email="87066062@qq.com"--domains="www.laghaim.cn"--httprun#申请的证书有效期为90天#申请成功后就会获得一下文件了。#www.laghaim.cn.crt#www.laghaim.cn.issuer.crt#www.laghaim.cn.json#www.laghaim.cn.key#-----------------更新证书-----------------lego--email="87066062@qq.com"--domains="www.laghaim.cn"--httprenew#但是此时需要注意,这时续订必须要小于30天#如果想提前更新证书,指定剩余天数即可:lego--email="87066062@qq.com"--domains="www.laghaim.cn"--httprenew--days45
如果想自动续租,写个crontab就可以咯。
接下来就是利用Lego的库代码进行申请证书和续订证书关键地方我都进行了注释,我喜欢一次性把整段代码贴出来,大家也可以直接粘贴整段对部分常量参数进行修改后,直接调用GetCertificateFromLego()函数:
packageget_certificate_from_legoimport("crypto""crypto/ecdsa""crypto/elliptic""crypto/rand""github.com/go-acme/lego/v4/certcrypto""github.com/go-acme/lego/v4/certificate""github.com/go-acme/lego/v4/challenge/http01""github.com/go-acme/lego/v4/challenge/tlsalpn01""github.com/go-acme/lego/v4/lego""github.com/go-acme/lego/v4/registration")const(EmailStr="87066062@qq.com"//修改为自己的电子邮件OneDomain="www.laghaim.cn"//修改为自己的域名)typeMyUserstruct{EmailstringRegistration*registration.Resourcekeycrypto.PrivateKey}func(u*MyUser)GetEmail()string{returnu.Email}func(uMyUser)GetRegistration()*registration.Resource{returnu.Registration}func(u*MyUser)GetPrivateKey()crypto.PrivateKey{returnu.key}funcGetCertificateFromLego()(*certificate.Resource,error){//创建myUser用户对象。新对象需要email和私钥才能启动,私钥我们自己生成privateKey,err:=ecdsa.GenerateKey(elliptic.P256(),rand.Reader)iferr!=nil{returnnil,err}myUser:=MyUser{Email:EmailStr,key:privateKey,}config:=lego.NewConfig(&myUser)//这里配置密钥的类型和密钥申请的地址,记得上线后替换成lego.LEDirectoryProduction,测试环境下就用lego.LEDirectoryStagingconfig.CADirURL=lego.LEDirectoryStagingconfig.Certificate.KeyType=certcrypto.RSA2048//创建一个client与CA服务器通信client,err:=lego.NewClient(config)iferr!=nil{returnnil,err}//这里需要挑战我们申请的证书,必须监听80和443端口,这样才能让Let"sEncrypt访问到咱们的服务器err=client.Challenge.SetHTTP01Provider(http01.NewProviderServer("","80"))iferr!=nil{returnnil,err}err=client.Challenge.SetTLSALPN01Provider(tlsalpn01.NewProviderServer("","443"))iferr!=nil{returnnil,err}//把这个客户端注册,传递给myUser用户里reg,err:=client.Registration.Register(registration.RegisterOptions{TermsOfServiceAgreed:true})iferr!=nil{returnnil,err}myUser.Registration=regrequest:=certificate.ObtainRequest{Domains:[]string{OneDomain},//这里如果有多个,就写多个就好了,可以是多个域名Bundle:true,//这里如果是true,将把颁发者证书一起返回,也就是返回里面certificates.IssuerCertificate}//开始申请证书certificates,err:=client.Certificate.Obtain(request)iferr!=nil{returnnil,err}//申请完了后,里面会带有证书的PrivateKeyCertificate,都为[]byte格式,需要存储的自行转为string即可returncertificates,nil}//如果要进行续订,可将certificates,err:=client.Certificate.Obtain(request)替换为certificates,err:=client.Certificate.Renew(request)// renew里面的参数就很简单了,第一个参数就是第一次申请返回的指针的值certificates,第二个参数bundle上面已经讲过传true即可,后面两个参数一个传false,一个传空字符串""即可。开启PAC自动配置然后剩下的内容,就是使用和解析打印一下咯:
packagemainimport("crypto/tls""crypto/x509""fmt""log""server/get_certificate_from_lego")funcmain(){cs,err:=get_certificate_from_lego.GetCertificateFromLego()iferr!=nil{log.Fatalln("obtainscertificate:",err)}ca,err:=tls.X509KeyPair(cs.Certificate,cs.PrivateKey)iferr!=nil{log.Fatalln(err)}ifca.Leaf,err=x509.ParseCertificate(ca.Certificate[0]);err!=nil{log.Fatalln(err)}fmt.Println(ca.Leaf)}参考资料
lego:https://github.com/go-acme/lego
2022 GopherChina大会报名火热进行中!
扫描下方二维码即可报名参与
大会合作、现场招聘及企业购票等事宜请联系微信:18516100522
相关阅读
-
世界热推荐:今晚7:00直播丨下一个突破...
今晚19:00,Cocos视频号直播马上点击【预约】啦↓↓↓在运营了三年... -
NFT周刊|Magic Eden宣布支持Polygon网...
Block-986在NFT这样的市场,每周都会有相当多项目起起伏伏。在过去... -
环球今亮点!头条观察 | DeFi的兴衰与...
在比特币得到机构关注之后,许多财务专家预测世界将因为加密货币的... -
重新审视合作,体育Crypto的可靠关系才能双赢
Block-987即使在体育Crypto领域,人们的目光仍然集中在FTX上。随着... -
简讯:前端单元测试,更进一步
前端测试@2022如果从2014年Jest的第一个版本发布开始计算,前端开发... -
焦点热讯:刘强东这波操作秀
近日,刘强东发布京东全员信,信中提到:自2023年1月1日起,逐步为...