]> Sergey Matveev's repositories - tofuproxy.git/commitdiff
Another refactor
authorSergey Matveev <stargrave@stargrave.org>
Wed, 8 Sep 2021 09:14:58 +0000 (12:14 +0300)
committerSergey Matveev <stargrave@stargrave.org>
Wed, 8 Sep 2021 11:31:01 +0000 (14:31 +0300)
24 files changed:
.gitignore
all.do
cert.pem.do
cert.tmpl [deleted file]
cmd/certgen/main.go [new file with mode: 0644]
cmd/tofuproxy/main.go
default.cmd.do [new file with mode: 0644]
doc/usage.texi
fifos/ensure.do
fifos/fifos.go
fifos/multitail.sh
prv.pem.do [deleted file]
rounds/10log.go [deleted file]
rounds/denyFonts.go [moved from rounds/35denyFonts.go with 100% similarity]
rounds/habrImage.go [moved from rounds/25habrImage.go with 100% similarity]
rounds/noHead.go [moved from rounds/05noHead.go with 100% similarity]
rounds/reddit.go [moved from rounds/20reddit.go with 100% similarity]
rounds/redirectHTML.go [moved from rounds/50redirectHTML.go with 100% similarity]
rounds/spy.go [moved from rounds/15spy.go with 82% similarity]
rounds/transcodeAVIF.go [moved from rounds/45transcodeAVIF.go with 100% similarity]
rounds/transcodeJXL.go [moved from rounds/45transcodeJXL.go with 100% similarity]
rounds/transcodeWebP.go [moved from rounds/40transcodeWebP.go with 100% similarity]
trip.go
verify.go

index 7902b80cf28010ff5f0ae570e4de4c741c6e7bac..1132f689bda9078a6a2ad7938c1fac2f9b3abe0c 100644 (file)
@@ -1,4 +1,5 @@
 /cert.pem
+/certgen.cmd
 /certs
 /prv.pem
-/tofuproxy
+/tofuproxy.cmd
diff --git a/all.do b/all.do
index 7288dc009638978ee8f50edd9f8e886e5e6bf5f1..fbac54c9765c53362da451f1e31241f056742589 100644 (file)
--- a/all.do
+++ b/all.do
@@ -1,2 +1,2 @@
-redo-ifchange cert.pem tofuproxy fifos/ensure
+redo-ifchange cert.pem tofuproxy.cmd fifos/ensure
 mkdir -p certs
index 09c82a34be7ffff2c809425c3d61b20236f6d0f4..f50920aad0c9439e1201fb5188c1791ca9a20a78 100644 (file)
@@ -1,2 +1,2 @@
-redo-ifchange prv.pem cert.tmpl
-certtool --generate-self-signed --load-privkey prv.pem --template cert.tmpl
+[ -e certgen.cmd ] || redo certgen.cmd
+./certgen.cmd -cert $3
diff --git a/cert.tmpl b/cert.tmpl
deleted file mode 100644 (file)
index 3b4a452..0000000
--- a/cert.tmpl
+++ /dev/null
@@ -1,4 +0,0 @@
-dn = "cn=tofu.localhost"
-expiration_days = 365
-ca
-cert_signing_key
diff --git a/cmd/certgen/main.go b/cmd/certgen/main.go
new file mode 100644 (file)
index 0000000..f4a0d97
--- /dev/null
@@ -0,0 +1,95 @@
+/*
+tofuproxy -- HTTP proxy with TLS certificates management
+Copyright (C) 2021 Sergey Matveev <stargrave@stargrave.org>
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, version 3 of the License.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*/
+
+package main
+
+import (
+       "crypto/ecdsa"
+       "crypto/elliptic"
+       "crypto/rand"
+       "crypto/x509"
+       "crypto/x509/pkix"
+       "encoding/pem"
+       "flag"
+       "io"
+       "log"
+       "math/big"
+       "os"
+       "time"
+)
+
+func main() {
+       cn := flag.String("cn", "tofuproxy.localhost", "CommonName")
+       crtPath := flag.String("cert", "cert.pem", "Path to server X.509 certificate")
+       prvPath := flag.String("key", "prv.pem", "Path to server PKCS#8 private key")
+       flag.Parse()
+       log.SetFlags(log.Lshortfile)
+
+       prv, err := ecdsa.GenerateKey(elliptic.P256(), rand.Reader)
+       if err != nil {
+               log.Fatalln(err)
+       }
+       pub := prv.Public()
+       notBefore := time.Now()
+       notAfter := notBefore.Add(365 * 24 * time.Hour)
+
+       serialRaw := make([]byte, 16)
+       if _, err = io.ReadFull(rand.Reader, serialRaw); err != nil {
+               log.Fatalln(err)
+       }
+       serial := big.NewInt(0)
+       serial = serial.SetBytes(serialRaw)
+
+       template := x509.Certificate{
+               SerialNumber:          serial,
+               Subject:               pkix.Name{CommonName: *cn},
+               DNSNames:              []string{*cn},
+               NotBefore:             notBefore,
+               NotAfter:              notAfter,
+               BasicConstraintsValid: true,
+               IsCA:                  true,
+       }
+       certRaw, err := x509.CreateCertificate(
+               rand.Reader, &template, &template, pub, prv,
+       )
+       if err != nil {
+               log.Fatalln(err)
+       }
+       if _, err = x509.ParseCertificate(certRaw); err != nil {
+               log.Fatalln(err)
+       }
+       pkcs8, err := x509.MarshalPKCS8PrivateKey(prv)
+       if err != nil {
+               log.Fatalln(err)
+       }
+
+       fd, err := os.OpenFile(*prvPath, os.O_WRONLY|os.O_CREATE, 0600)
+       if err != nil {
+               log.Fatalln(err)
+       }
+       err = pem.Encode(fd, &pem.Block{Type: "PRIVATE KEY", Bytes: pkcs8})
+       if err != nil {
+               log.Fatalln(err)
+       }
+       fd.Close()
+
+       fd, err = os.OpenFile(*crtPath, os.O_WRONLY|os.O_CREATE, 0600)
+       err = pem.Encode(fd, &pem.Block{Type: "CERTIFICATE", Bytes: certRaw})
+       if err != nil {
+               log.Fatalln(err)
+       }
+}
index 5ad6e62674c9b1eceddd417558937036cb5a1302..5335ffb0f911358a647a23d562a97a554f190f74 100644 (file)
@@ -32,7 +32,7 @@ func main() {
        crtPath := flag.String("cert", "cert.pem", "Path to server X.509 certificate")
        prvPath := flag.String("key", "prv.pem", "Path to server PKCS#8 private key")
        bind := flag.String("bind", "[::1]:8080", "Bind address")
-       certs := flag.String("certs", "certs", "Directory with pinned certificates")
+       certs := flag.String("certs", "./certs", "Directory with pinned certificates")
        dnsSrv := flag.String("dns", "[::1]:53", "DNS server")
        fifosDir := flag.String("fifos", "fifos", "Directory with FIFOs")
        notai := flag.Bool("notai", false, "Do not prepend TAI64N to logs")
diff --git a/default.cmd.do b/default.cmd.do
new file mode 100644 (file)
index 0000000..d15196b
--- /dev/null
@@ -0,0 +1,3 @@
+redo-ifchange *.go cmd/*/*.go fifos/*.go rounds/*.go
+GO_LDFLAGS="${GO_LDFLAGS:--ldflags=-s}"
+${GO:-go} build -o $3 $GO_LDFLAGS ./cmd/${1%.cmd}
index 6965994d9906d74641ac41bbf56b1802e720ed24..8cfbb0600dcfb3bbe85fa3b63ce0d4b7d195ffae 100644 (file)
@@ -36,8 +36,8 @@ Run @command{tofuproxy} itself. By default it will bind to
 (set to an empty string to disable DANE lookups):
 
 @example
-$ ./tofuproxy
-main.go:316: listening: [::1]:8080
+$ ./tofuproxy.cmd
+main.go:316: listening: [::1]:8080 certs: ./certs
 @end example
 
 @item Trust your newly generated CA:
index 682d687c2bda03ce43885c5661de2822ca27d4c8..7aa937ba5a228d19cf21326e2fc7c788b7f76b93 100644 (file)
@@ -1,3 +1,3 @@
-for f in cert err ok other redir req tls ; do
+for f in cert dane err ok other redir req tls ; do
     [ -p $f ] || mkfifo $f
 done
index 6e7809661ea514428ccf4926214fe3cab21eb68b..61f0f63011d98d896d33385410864471a83ef6cf 100644 (file)
@@ -30,6 +30,7 @@ var (
        NoTAI     bool
        FIFOs string
        SinkCert  = make(chan string)
+       SinkDANE  = make(chan string)
        SinkErr   = make(chan string)
        SinkOK    = make(chan string)
        SinkOther = make(chan string)
@@ -63,6 +64,7 @@ func sinker(c chan string, p string) {
 
 func Init() {
        go sinker(SinkCert, filepath.Join(FIFOs, "cert"))
+       go sinker(SinkDANE, filepath.Join(FIFOs, "dane"))
        go sinker(SinkErr, filepath.Join(FIFOs, "err"))
        go sinker(SinkOK, filepath.Join(FIFOs, "ok"))
        go sinker(SinkOther, filepath.Join(FIFOs, "other"))
index e6f29fb096f4871fdc2e5f3142012bc65a8cf50e..8a8ccee89ddd150a550a57dd1ae9d64c73a2b41a 100755 (executable)
@@ -3,6 +3,7 @@
 multitail \
     -wh 10 \
     -t "Certificates" -ci magenta -l "while :; do tai64nlocal < cert ; done" \
+    -t "DANE" --label "DANE " -L "while :; do tai64nlocal < dane ; done" \
     -t "Errors" -ci red -L "while :; do tai64nlocal < err ; done" \
     -t "Responses" -ci green --label "< " -l "while :; do tai64nlocal < ok ; done" \
     -t "Others" -ci white -L "while :; do tai64nlocal < other ; done" \
diff --git a/prv.pem.do b/prv.pem.do
deleted file mode 100644 (file)
index c14af89..0000000
+++ /dev/null
@@ -1,2 +0,0 @@
-umask 077
-certtool --generate-privkey --bits 256 --ecc > $3
diff --git a/rounds/10log.go b/rounds/10log.go
deleted file mode 100644 (file)
index 135394d..0000000
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
-tofuproxy -- HTTP proxy with TLS certificates management
-Copyright (C) 2021 Sergey Matveev <stargrave@stargrave.org>
-
-This program is free software: you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation, version 3 of the License.
-
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with this program.  If not, see <http://www.gnu.org/licenses/>.
-*/
-
-package rounds
-
-import (
-       "fmt"
-       "net/http"
-
-       "go.stargrave.org/tofuproxy/fifos"
-)
-
-func RoundLog(
-       host string,
-       resp *http.Response,
-       w http.ResponseWriter,
-       req *http.Request,
-) (bool, error) {
-       fifos.SinkReq <- fmt.Sprintf("%s %s", req.Method, req.URL.String())
-       return true, nil
-}
similarity index 100%
rename from rounds/35denyFonts.go
rename to rounds/denyFonts.go
similarity index 100%
rename from rounds/25habrImage.go
rename to rounds/habrImage.go
similarity index 100%
rename from rounds/05noHead.go
rename to rounds/noHead.go
similarity index 100%
rename from rounds/20reddit.go
rename to rounds/reddit.go
similarity index 82%
rename from rounds/15spy.go
rename to rounds/spy.go
index 42ebd9ee92eb23cc7dd3e5e27c20b51c86b069cc..3b242f8cfd2b686a37d230c80553ee6508a3e558 100644 (file)
@@ -29,6 +29,7 @@ var spyDomains = []string{
        "google-analytics.com",
        "goo.gl",
        "ads.google.com",
+       "googletagmanager.com",
        "facebook.com",
        "facebook.net",
        "fbcdn.com",
@@ -44,23 +45,30 @@ var spyDomains = []string{
        "tns-counter.ru",
 }
 
+func IsSpy(host string) bool {
+       for _, spy := range spyDomains {
+               if strings.HasSuffix(host, spy) {
+                       return true
+               }
+       }
+       return false
+}
+
 func RoundDenySpy(
        host string,
        resp *http.Response,
        w http.ResponseWriter,
        req *http.Request,
 ) (bool, error) {
-       for _, spy := range spyDomains {
-               if strings.HasSuffix(host, spy) {
-                       http.NotFound(w, req)
-                       fifos.SinkOther <- fmt.Sprintf(
-                               "%s %s\t%d\tdeny spy",
-                               req.Method,
-                               req.URL.String(),
-                               http.StatusNotFound,
-                       )
-                       return false, nil
-               }
+       if IsSpy(host) {
+               http.NotFound(w, req)
+               fifos.SinkOther <- fmt.Sprintf(
+                       "%s %s\t%d\tdeny spy",
+                       req.Method,
+                       req.URL.String(),
+                       http.StatusNotFound,
+               )
+               return false, nil
        }
        return true, nil
 }
diff --git a/trip.go b/trip.go
index 27d4e9e30beacd8239b3827d74fe45a97526d8af..3ad6eb178f1dca2c24d738c883ae7481d5b3a65e 100644 (file)
--- a/trip.go
+++ b/trip.go
@@ -58,10 +58,10 @@ type Round func(
 ) (bool, error)
 
 func roundTrip(w http.ResponseWriter, req *http.Request) {
+       fifos.SinkReq <- fmt.Sprintf("%s %s", req.Method, req.URL.String())
        host := strings.TrimSuffix(req.URL.Host, ":443")
        for _, round := range []Round{
                rounds.RoundNoHead,
-               rounds.RoundLog,
                rounds.RoundDenySpy,
                rounds.RoundRedditOld,
                rounds.RoundHabrImage,
index 4c20c0e6f55f8c1e65e1a5899e8bad1c957e5fa0..b2eb606ab40691cf4ce1b2571a6334bb207d81cd 100644 (file)
--- a/verify.go
+++ b/verify.go
@@ -123,9 +123,9 @@ func verifyCert(
        daneExists, daneMatched := dane(host, certTheir)
        if daneExists {
                if daneMatched {
-                       fifos.SinkCert <- fmt.Sprintf("DANE\t%s\tmatched", host)
+                       fifos.SinkDANE <- fmt.Sprintf("%s\tmatched", host)
                } else {
-                       fifos.SinkErr <- fmt.Sprintf("DANE\t%s\tnot matched", host)
+                       fifos.SinkDANE <- fmt.Sprintf("%s\tNOT matched", host)
                }
        }
        fn := filepath.Join(Certs, host)
@@ -154,7 +154,7 @@ $tErr configure -wrap word -height 5
                        if daneMatched {
                                b.WriteString("label .lDANE -bg green -text \"DANE matched\"\n")
                        } else {
-                               b.WriteString("label .lDANE -bg red -text \"DANE not matched!\"\n")
+                               b.WriteString("label .lDANE -bg red -text \"DANE NOT matched\"\n")
                        }
                        b.WriteString("grid .lDANE\n")
                }