aboutsummaryrefslogtreecommitdiff
path: root/examples/server.go
diff options
context:
space:
mode:
authoradnano <[email protected]>2020-10-13 14:22:15 -0400
committeradnano <[email protected]>2020-10-13 14:22:15 -0400
commitdb89a34935c6404e141a6e635c529dae2dad928c (patch)
tree96f562420e820c60498a9074ae8d318c4e01521d /examples/server.go
parentRemove (*Request).Hostname function (diff)
downloadgo-gemini-db89a34935c6404e141a6e635c529dae2dad928c.tar.xz
go-gemini-db89a34935c6404e141a6e635c529dae2dad928c.zip
examples/server: Generate new certificates when they expire
Diffstat (limited to 'examples/server.go')
-rw-r--r--examples/server.go29
1 files changed, 29 insertions, 0 deletions
diff --git a/examples/server.go b/examples/server.go
index a4ed808..2385c95 100644
--- a/examples/server.go
+++ b/examples/server.go
@@ -3,7 +3,9 @@
package main
import (
+ "crypto/tls"
"log"
+ "time"
"git.sr.ht/~adnano/gmi"
)
@@ -13,6 +15,33 @@ func main() {
if err := server.CertificateStore.Load("/var/lib/gemini/certs"); err != nil {
log.Fatal(err)
}
+ server.GetCertificate = func(hostname string, store *gmi.CertificateStore) *tls.Certificate {
+ cert, err := store.Lookup(hostname)
+ if err != nil {
+ switch err {
+ case gmi.ErrInvalidCertificate:
+ log.Print("Old certificate expired, creating new one")
+ // Generate a new certificate if the old one is expired.
+ crt, key, err := gmi.NewRawCertificate(hostname, time.Minute)
+ if err != nil {
+ // Failed to generate new certificate, abort
+ return nil
+ }
+ // Store and return the new certificate
+ err = gmi.WriteX509KeyPair("/var/lib/gemini/certs/"+hostname, crt, key)
+ if err != nil {
+ return nil
+ }
+ newCert, err := tls.X509KeyPair(crt, key)
+ if err != nil {
+ return nil
+ }
+ store.Add(hostname, newCert)
+ return &newCert
+ }
+ }
+ return cert
+ }
var mux gmi.ServeMux
mux.Handle("/", gmi.FileServer(gmi.Dir("/var/www")))