GoでLetsEncrypt

問題の本質は、LetsEncrypt証明書が3か月間有効であり、毎月更新されることです。 cronを使用して証明書のみの証明書の更新を自動化するのは簡単ですが、Goが新しい更新された証明書を自動的に取得する簡単な方法はありません。



より正確に今



// log.Println(http.ListenAndServeTLS(":7544", // "/home/user/cert/game01.example.com/fullchain.pem", // "/home/user/cert/game01.example.com/privkey.pem", nil)) for { log.Println(pyrahttp.ListenAndServeLetsEncrypt(":7544", "/home/user/cert/game01.example.com/fullchain.pem", "/home/user/cert/game01.example.com/privkey.pem", nil)) time.Sleep(time.Second * 5) }
      
      





サイクルはオプションです。 新しい証明書にエラーがあるときにサーバーをクラッシュさせたくない場合に必要です。証明書が消えるとhttpsサービスが停止し、通常の証明書が表示されると有効になります。



仕組み



netまたはhttpパッケージには、httpまたはhttpsサーバーを停止する簡単な方法はありません。 したがって、私はこの投稿に触発されました。 コードListenAndServeTLSとその他のコードをnet / httpからコピーし、動作するpyrahttp.ListenAndServeLetsEncryptを取得しました。



http.Serverがnet.Listener実装を取得します。 Accept()で、1分以内にDeadlineでTCPListener.Accept()を呼び出します。 期限または新しい接続の場合、listnerは証明書ファイルをチェックし、更新された場合は、ReloadErrorを返し、ListenAndServeLetsEncryptでサーバーを再起動します



Goのより多くの幸せなサーバーが、再起動せずに2、3年生き残ることができることを願っています。



インストール/アップグレード



 go get -u github.com/CossackPyra/pyrahttp
      
      







PS



複数のドメイン、サブドメイン、サーバー(仮想)があり、LetsEncryptの使用を開始する方法を検討している場合、LetsEncryptコードを持つサーバーが1つあるときにソリューションを選択し、残りのすべてについては/.well-known/acme-challengeを使用しますLetsEncryptサーバーにプロキシされます。 これにより、複数のサーバーに対して1つの証明書を取得できます。これを後で1つのサーバーに結合するか、共通のプロキシの背後に配置できます。



All Articles