より正確に今
// 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つのサーバーに結合するか、共通のプロキシの背後に配置できます。