-
-
Save samthor/5ff8cfac1f80b03dfe5a9be62b29d7f2 to your computer and use it in GitHub Desktop.
| package main | |
| import ( | |
| "crypto/tls" | |
| "flag" | |
| "fmt" | |
| "log" | |
| "net/http" | |
| "os" | |
| "os/user" | |
| "path/filepath" | |
| "golang.org/x/crypto/acme/autocert" | |
| ) | |
| func main() { | |
| // setup a simple handler which sends a HTHS header for six months (!) | |
| http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { | |
| w.Header().Set("Strict-Transport-Security", "max-age=15768000 ; includeSubDomains") | |
| fmt.Fprintf(w, "Hello, HTTPS world!") | |
| }) | |
| // look for the domains to be served from command line args | |
| flag.Parse() | |
| domains := flag.Args() | |
| if len(domains) == 0 { | |
| log.Fatalf("fatal; specify domains as arguments") | |
| } | |
| // create the autocert.Manager with domains and path to the cache | |
| certManager := autocert.Manager{ | |
| Prompt: autocert.AcceptTOS, | |
| HostPolicy: autocert.HostWhitelist(domains...), | |
| } | |
| // optionally use a cache dir | |
| dir := cacheDir() | |
| if dir != "" { | |
| certManager.Cache = autocert.DirCache(dir) | |
| } | |
| // create the server itself | |
| server := &http.Server{ | |
| Addr: ":https", | |
| TLSConfig: &tls.Config{ | |
| GetCertificate: certManager.GetCertificate, | |
| }, | |
| } | |
| log.Printf("Serving http/https for domains: %+v", domains) | |
| go func() { | |
| // serve HTTP, which will redirect automatically to HTTPS | |
| h := certManager.HTTPHandler(nil) | |
| log.Fatal(http.ListenAndServe(":http", h)) | |
| }() | |
| // serve HTTPS! | |
| log.Fatal(server.ListenAndServeTLS("", "")) | |
| } | |
| // cacheDir makes a consistent cache directory inside /tmp. Returns "" on error. | |
| func cacheDir() (dir string) { | |
| if u, _ := user.Current(); u != nil { | |
| dir = filepath.Join(os.TempDir(), "cache-golang-autocert-"+u.Username) | |
| if err := os.MkdirAll(dir, 0700); err == nil { | |
| return dir | |
| } | |
| } | |
| return "" | |
| } |
Hi, when I try it, I'm getting the following errors:
autocert-server.go:18:75: missing ',' before newline in argument list autocert-server.go:19:100: missing ',' before newline in argument list autocert-server.go:20:54: missing ',' before newline in argument list autocert-server.go:21:9: expected operand, found '}' autocert-server.go:26:9: missing ',' in argument list autocert-server.go:27:66: missing ',' before newline in argument list autocert-server.go:28:9: expected operand, found '}' autocert-server.go:38:9: missing ',' in argument list autocert-server.go:39:35: expected '==', found '=' autocert-server.go:40:9: expected operand, found '}' autocert-server.go:51:9: missing ',' in argument listWould you be so kind to fix it pls? thx
you can add "{" in end of line 18. It should work.
Sorry, I must have accidentally deleted that character when I uploaded this. It's fixed now 👍
If you're curious, I wrote I forwarding server using this autocert stuff, so you can host "dumb" HTTP services online with HTTPS: https://github.com/samthor/https-forward
Hey @samthor does it work on localhost as well?
go run autocert-server.com localhost
I am not able to get certificate for that.
Or will it be possible to make work on Localhost?
@arshpreetsingh If you want to run your application locally you should use a self signed certificate.
Check this out -> https://pkg.go.dev/crypto/x509
How to test? Why I enter http://xyzabc.com in browser, It not show any something right.
I have configured a domain in host file.
127.0.0.1 xyzabc.com
Hi, when I try it, I'm getting the following errors:
Would you be so kind to fix it pls? thx