Skip to content

Commit 3d6cb4d

Browse files
committed
feat: add ability to automatically acquire WSS certificates using p2p-forge and libp2p.direct
1 parent 6454bdb commit 3d6cb4d

File tree

10 files changed

+128
-26
lines changed

10 files changed

+128
-26
lines changed

config/experiments.go

+1
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ type Experiments struct {
1010
OptimisticProvide bool
1111
OptimisticProvideJobsPoolSize int
1212
GatewayOverLibp2p bool `json:",omitempty"`
13+
P2PForgeClient bool `json:",omitempty"`
1314

1415
GraphsyncEnabled graphsyncEnabled `json:",omitempty"`
1516
AcceleratedDHTClient experimentalAcceleratedDHTClient `json:",omitempty"`

core/node/groups.go

+2
Original file line numberDiff line numberDiff line change
@@ -133,6 +133,8 @@ func LibP2P(bcfg *BuildCfg, cfg *config.Config, userResourceOverrides rcmgr.Part
133133

134134
// Services (resource management)
135135
fx.Provide(libp2p.ResourceManager(cfg.Swarm, userResourceOverrides)),
136+
maybeProvide(libp2p.P2PForgeCertMgr, cfg.Experimental.P2PForgeClient),
137+
maybeInvoke(libp2p.StartP2PForgeCertMgr, cfg.Experimental.P2PForgeClient),
136138
fx.Provide(libp2p.AddrFilters(cfg.Swarm.AddrFilters)),
137139
fx.Provide(libp2p.AddrsFactory(cfg.Addresses.Announce, cfg.Addresses.AppendAnnounce, cfg.Addresses.NoAnnounce)),
138140
fx.Provide(libp2p.SmuxTransport(cfg.Swarm.Transports)),

core/node/libp2p/addrs.go

+64-3
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,21 @@
11
package libp2p
22

33
import (
4+
"context"
45
"fmt"
6+
"net/http"
7+
"os"
58

9+
"github.com/ipfs/kubo/config"
10+
p2pforge "github.com/ipshipyard/p2p-forge/client"
611
"github.com/libp2p/go-libp2p"
12+
"github.com/libp2p/go-libp2p/core/host"
713
p2pbhost "github.com/libp2p/go-libp2p/p2p/host/basic"
814
ma "github.com/multiformats/go-multiaddr"
915
mamask "github.com/whyrusleeping/multiaddr-filter"
16+
17+
"github.com/caddyserver/certmagic"
18+
"go.uber.org/fx"
1019
)
1120

1221
func AddrFilters(filters []string) func() (*ma.Filters, Libp2pOpts, error) {
@@ -87,12 +96,26 @@ func makeAddrsFactory(announce []string, appendAnnouce []string, noAnnounce []st
8796
}, nil
8897
}
8998

90-
func AddrsFactory(announce []string, appendAnnouce []string, noAnnounce []string) func() (opts Libp2pOpts, err error) {
91-
return func() (opts Libp2pOpts, err error) {
92-
addrsFactory, err := makeAddrsFactory(announce, appendAnnouce, noAnnounce)
99+
func AddrsFactory(announce []string, appendAnnouce []string, noAnnounce []string) interface{} {
100+
return func(params struct {
101+
fx.In
102+
ForgeMgr *p2pforge.P2PForgeCertMgr `optional:"true"`
103+
},
104+
) (opts Libp2pOpts, err error) {
105+
var addrsFactory p2pbhost.AddrsFactory
106+
announceAddrsFactory, err := makeAddrsFactory(announce, appendAnnouce, noAnnounce)
93107
if err != nil {
94108
return opts, err
95109
}
110+
if params.ForgeMgr == nil {
111+
addrsFactory = announceAddrsFactory
112+
} else {
113+
addrsFactory = func(multiaddrs []ma.Multiaddr) []ma.Multiaddr {
114+
forgeProcessing := params.ForgeMgr.AddressFactory()(multiaddrs)
115+
annouceProcessing := announceAddrsFactory(forgeProcessing)
116+
return annouceProcessing
117+
}
118+
}
96119
opts.Opts = append(opts.Opts, libp2p.AddrsFactory(addrsFactory))
97120
return
98121
}
@@ -107,3 +130,41 @@ func ListenOn(addresses []string) interface{} {
107130
}
108131
}
109132
}
133+
134+
func P2PForgeCertMgr() (*p2pforge.P2PForgeCertMgr, error) {
135+
storagePath, err := config.Path("", "p2p-forge-certs")
136+
if err != nil {
137+
return nil, err
138+
}
139+
140+
const authEnvVar = "FORGE_ACCESS_TOKEN"
141+
const authForgeHeader = "Forge-Authorization"
142+
authKey, foundAuthKey := os.LookupEnv(authEnvVar)
143+
144+
certMgr, err := p2pforge.NewP2PForgeCertMgr(
145+
p2pforge.WithModifiedForgeRequest(func(req *http.Request) error {
146+
if foundAuthKey {
147+
req.Header.Set(authForgeHeader, authKey)
148+
}
149+
return nil
150+
}),
151+
p2pforge.WithCertificateStorage(&certmagic.FileStorage{Path: storagePath}))
152+
if err != nil {
153+
return nil, err
154+
}
155+
156+
return certMgr, nil
157+
}
158+
159+
func StartP2PForgeCertMgr(lc fx.Lifecycle, certMgr *p2pforge.P2PForgeCertMgr, h host.Host) {
160+
lc.Append(fx.Hook{
161+
OnStart: func(ctx context.Context) error {
162+
certMgr.ProvideHost(h)
163+
return certMgr.Start()
164+
},
165+
OnStop: func(ctx context.Context) error {
166+
certMgr.Stop()
167+
return nil
168+
},
169+
})
170+
}

core/node/libp2p/transport.go

+10-5
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,8 @@ package libp2p
22

33
import (
44
"fmt"
5-
65
"github.com/ipfs/kubo/config"
6+
"github.com/ipshipyard/p2p-forge/client"
77
"github.com/libp2p/go-libp2p"
88
"github.com/libp2p/go-libp2p/core/metrics"
99
quic "github.com/libp2p/go-libp2p/p2p/transport/quic"
@@ -16,20 +16,25 @@ import (
1616
)
1717

1818
func Transports(tptConfig config.Transports) interface{} {
19-
return func(pnet struct {
19+
return func(params struct {
2020
fx.In
21-
Fprint PNetFingerprint `optional:"true"`
21+
Fprint PNetFingerprint `optional:"true"`
22+
ForgeMgr *client.P2PForgeCertMgr `optional:"true"`
2223
},
2324
) (opts Libp2pOpts, err error) {
24-
privateNetworkEnabled := pnet.Fprint != nil
25+
privateNetworkEnabled := params.Fprint != nil
2526

2627
if tptConfig.Network.TCP.WithDefault(true) {
2728
// TODO(9290): Make WithMetrics configurable
2829
opts.Opts = append(opts.Opts, libp2p.Transport(tcp.NewTCPTransport, tcp.WithMetrics()))
2930
}
3031

3132
if tptConfig.Network.Websocket.WithDefault(true) {
32-
opts.Opts = append(opts.Opts, libp2p.Transport(websocket.New))
33+
if params.ForgeMgr == nil {
34+
opts.Opts = append(opts.Opts, libp2p.Transport(websocket.New))
35+
} else {
36+
opts.Opts = append(opts.Opts, libp2p.Transport(websocket.New, websocket.WithTLSConfig(params.ForgeMgr.TLSConfig())))
37+
}
3338
}
3439

3540
if tptConfig.Network.QUIC.WithDefault(!privateNetworkEnabled) {

docs/examples/kubo-as-a-library/go.mod

+3-3
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ require (
2929
github.com/coreos/go-systemd/v22 v22.5.0 // indirect
3030
github.com/crackcomm/go-gitignore v0.0.0-20231225121904-e25f5bc08668 // indirect
3131
github.com/cskr/pubsub v1.0.2 // indirect
32-
github.com/davecgh/go-spew v1.1.1 // indirect
32+
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect
3333
github.com/davidlazar/go-crypto v0.0.0-20200604182044-b73af7476f6c // indirect
3434
github.com/decred/dcrd/dcrec/secp256k1/v4 v4.3.0 // indirect
3535
github.com/dgraph-io/badger v1.6.2 // indirect
@@ -162,7 +162,7 @@ require (
162162
github.com/pion/turn/v2 v2.1.6 // indirect
163163
github.com/pion/webrtc/v3 v3.3.0 // indirect
164164
github.com/pkg/errors v0.9.1 // indirect
165-
github.com/pmezard/go-difflib v1.0.0 // indirect
165+
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect
166166
github.com/polydawn/refmt v0.89.0 // indirect
167167
github.com/prometheus/client_golang v1.19.1 // indirect
168168
github.com/prometheus/client_model v0.6.1 // indirect
@@ -208,7 +208,7 @@ require (
208208
golang.org/x/mod v0.19.0 // indirect
209209
golang.org/x/net v0.27.0 // indirect
210210
golang.org/x/sync v0.7.0 // indirect
211-
golang.org/x/sys v0.24.0 // indirect
211+
golang.org/x/sys v0.25.0 // indirect
212212
golang.org/x/text v0.16.0 // indirect
213213
golang.org/x/tools v0.23.0 // indirect
214214
golang.org/x/xerrors v0.0.0-20240716161551-93cc26a95ae9 // indirect

docs/examples/kubo-as-a-library/go.sum

+3
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,7 @@ github.com/davecgh/go-spew v0.0.0-20171005155431-ecdeabc65495/go.mod h1:J7Y8YcW2
9797
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
9898
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
9999
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
100+
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
100101
github.com/davidlazar/go-crypto v0.0.0-20200604182044-b73af7476f6c h1:pFUpOrbxDR6AkioZ1ySsx5yxlDQZ8stG2b88gTPxgJU=
101102
github.com/davidlazar/go-crypto v0.0.0-20200604182044-b73af7476f6c/go.mod h1:6UhI8N9EjYm1c2odKpFpAYeR8dsBeM7PtzQhRgxRr9U=
102103
github.com/decred/dcrd/crypto/blake256 v1.0.1 h1:7PltbUIQB7u/FfZ39+DGa/ShuMyJ5ilcvdfma9wOH6Y=
@@ -632,6 +633,7 @@ github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
632633
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
633634
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
634635
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
636+
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
635637
github.com/polydawn/refmt v0.0.0-20201211092308-30ac6d18308e/go.mod h1:uIp+gprXxxrWSjjklXD+mN4wed/tMfjMMmN/9+JsA9o=
636638
github.com/polydawn/refmt v0.89.0 h1:ADJTApkvkeBZsN0tBTx8QjpD9JkmxbKp0cxfr9qszm4=
637639
github.com/polydawn/refmt v0.89.0/go.mod h1:/zvteZs/GwLtCgZ4BL6CBsk9IKIlexP43ObX9AxTqTw=
@@ -1001,6 +1003,7 @@ golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
10011003
golang.org/x/sys v0.16.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
10021004
golang.org/x/sys v0.24.0 h1:Twjiwq9dn6R1fQcyiK+wQyHWfaz/BJB+YIpzU/Cv3Xg=
10031005
golang.org/x/sys v0.24.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
1006+
golang.org/x/sys v0.25.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
10041007
golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw=
10051008
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
10061009
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=

go.mod

+13-5
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ require (
55
contrib.go.opencensus.io/exporter/prometheus v0.4.2
66
github.com/benbjohnson/clock v1.3.5
77
github.com/blang/semver/v4 v4.0.0
8+
github.com/caddyserver/certmagic v0.21.3
89
github.com/cenkalti/backoff/v4 v4.3.0
910
github.com/ceramicnetwork/go-dag-jose v0.1.0
1011
github.com/cheggaaa/pb v1.0.29
@@ -44,6 +45,7 @@ require (
4445
github.com/ipld/go-car/v2 v2.13.1
4546
github.com/ipld/go-codec-dagpb v1.6.0
4647
github.com/ipld/go-ipld-prime v0.21.0
48+
github.com/ipshipyard/p2p-forge v0.0.0-20240916192145-ae0139ef07ef
4749
github.com/jbenet/go-temp-err-catcher v0.1.0
4850
github.com/jbenet/goprocess v0.1.4
4951
github.com/julienschmidt/httprouter v1.3.0
@@ -87,7 +89,7 @@ require (
8789
golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56
8890
golang.org/x/mod v0.19.0
8991
golang.org/x/sync v0.7.0
90-
golang.org/x/sys v0.24.0
92+
golang.org/x/sys v0.25.0
9193
google.golang.org/protobuf v1.34.2
9294
)
9395

@@ -97,16 +99,16 @@ require (
9799
github.com/alecthomas/units v0.0.0-20240626203959-61d1e3462e30 // indirect
98100
github.com/alexbrainman/goissue34681 v0.0.0-20191006012335-3fc7a47baff5 // indirect
99101
github.com/beorn7/perks v1.0.1 // indirect
100-
github.com/cespare/xxhash v1.1.0 // indirect
102+
github.com/caddyserver/zerossl v0.1.3 // indirect
101103
github.com/cespare/xxhash/v2 v2.3.0 // indirect
102104
github.com/containerd/cgroups v1.1.0 // indirect
103105
github.com/crackcomm/go-gitignore v0.0.0-20231225121904-e25f5bc08668 // indirect
104106
github.com/cskr/pubsub v1.0.2 // indirect
105-
github.com/davecgh/go-spew v1.1.1 // indirect
107+
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect
106108
github.com/davidlazar/go-crypto v0.0.0-20200604182044-b73af7476f6c // indirect
107109
github.com/decred/dcrd/dcrec/secp256k1/v4 v4.3.0 // indirect
108110
github.com/dgraph-io/badger v1.6.2 // indirect
109-
github.com/dgraph-io/ristretto v0.0.2 // indirect
111+
github.com/dgraph-io/ristretto v0.1.1 // indirect
110112
github.com/docker/go-units v0.5.0 // indirect
111113
github.com/elastic/gosigar v0.14.3 // indirect
112114
github.com/felixge/httpsnoop v1.0.4 // indirect
@@ -120,6 +122,7 @@ require (
120122
github.com/go-task/slim-sprig/v3 v3.0.0 // indirect
121123
github.com/godbus/dbus/v5 v5.1.0 // indirect
122124
github.com/gogo/protobuf v1.3.2 // indirect
125+
github.com/golang/glog v1.2.0 // indirect
123126
github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect
124127
github.com/golang/protobuf v1.5.4 // indirect
125128
github.com/golang/snappy v0.0.4 // indirect
@@ -149,6 +152,7 @@ require (
149152
github.com/klauspost/compress v1.17.9 // indirect
150153
github.com/klauspost/cpuid/v2 v2.2.8 // indirect
151154
github.com/koron/go-ssdp v0.0.4 // indirect
155+
github.com/libdns/libdns v0.2.2 // indirect
152156
github.com/libp2p/go-buffer-pool v0.1.0 // indirect
153157
github.com/libp2p/go-cidranger v1.1.0 // indirect
154158
github.com/libp2p/go-flow-metrics v0.1.0 // indirect
@@ -166,6 +170,7 @@ require (
166170
github.com/mattn/go-isatty v0.0.20 // indirect
167171
github.com/mattn/go-runewidth v0.0.4 // indirect
168172
github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b // indirect
173+
github.com/mholt/acmez/v2 v2.0.1 // indirect
169174
github.com/miekg/dns v1.1.61 // indirect
170175
github.com/mikioh/tcpinfo v0.0.0-20190314235526-30a79bb1804b // indirect
171176
github.com/mikioh/tcpopt v0.0.0-20190314235656-172688c1accc // indirect
@@ -198,7 +203,7 @@ require (
198203
github.com/pion/turn/v2 v2.1.6 // indirect
199204
github.com/pion/webrtc/v3 v3.3.0 // indirect
200205
github.com/pkg/errors v0.9.1 // indirect
201-
github.com/pmezard/go-difflib v1.0.0 // indirect
206+
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect
202207
github.com/polydawn/refmt v0.89.0 // indirect
203208
github.com/prometheus/client_model v0.6.1 // indirect
204209
github.com/prometheus/common v0.55.0 // indirect
@@ -221,6 +226,7 @@ require (
221226
github.com/whyrusleeping/chunker v0.0.0-20181014151217-fe64bd25879f // indirect
222227
github.com/whyrusleeping/go-keyspace v0.0.0-20160322163242-5b898ac5add1 // indirect
223228
github.com/wlynxg/anet v0.0.3 // indirect
229+
github.com/zeebo/blake3 v0.2.3 // indirect
224230
go.opentelemetry.io/contrib/propagators/aws v1.21.1 // indirect
225231
go.opentelemetry.io/contrib/propagators/b3 v1.21.1 // indirect
226232
go.opentelemetry.io/contrib/propagators/jaeger v1.21.1 // indirect
@@ -252,3 +258,5 @@ require (
252258
)
253259

254260
go 1.22
261+
262+
replace github.com/libp2p/go-libp2p => github.com/libp2p/go-libp2p v0.36.3-0.20240909195832-fbc0ac8f743c

0 commit comments

Comments
 (0)