diff --git a/cmd/boulder-wfe2/main.go b/cmd/boulder-wfe2/main.go
index 8e681840e..a8ecfff97 100644
--- a/cmd/boulder-wfe2/main.go
+++ b/cmd/boulder-wfe2/main.go
@@ -14,14 +14,17 @@ import (
 
 	"github.com/letsencrypt/boulder/cmd"
 	"github.com/letsencrypt/boulder/config"
+	"github.com/letsencrypt/boulder/core"
 	emailpb "github.com/letsencrypt/boulder/email/proto"
 	"github.com/letsencrypt/boulder/features"
 	"github.com/letsencrypt/boulder/goodkey"
 	"github.com/letsencrypt/boulder/goodkey/sagoodkey"
 	bgrpc "github.com/letsencrypt/boulder/grpc"
 	"github.com/letsencrypt/boulder/grpc/noncebalancer"
+	"github.com/letsencrypt/boulder/identifier"
 	"github.com/letsencrypt/boulder/issuance"
 	"github.com/letsencrypt/boulder/nonce"
+	"github.com/letsencrypt/boulder/policy"
 	rapb "github.com/letsencrypt/boulder/ra/proto"
 	"github.com/letsencrypt/boulder/ratelimits"
 	bredis "github.com/letsencrypt/boulder/redis"
@@ -101,7 +104,7 @@ type Config struct {
 		// DirectoryCAAIdentity is used for the /directory response's "meta"
 		// element's "caaIdentities" field. It should match the VA's "issuerDomain"
 		// configuration value (this value is the one used to enforce CAA)
-		DirectoryCAAIdentity string `validate:"required,fqdn"`
+		DirectoryCAAIdentity string `validate:"required"`
 		// DirectoryWebsite is used for the /directory response's "meta" element's
 		// "website" field.
 		DirectoryWebsite string `validate:"required,url"`
@@ -186,6 +189,8 @@ type Config struct {
 			// to enable the pausing feature.
 			URL string `validate:"omitempty,required_with=HMACKey JWTLifetime,url,startswith=https://,endsnotwith=/"`
 		}
+
+		cmd.HostnamePolicyConfig
 	}
 
 	Syslog        cmd.SyslogConfig
@@ -330,12 +335,26 @@ func main() {
 	var limiter *ratelimits.Limiter
 	var txnBuilder *ratelimits.TransactionBuilder
 	var limiterRedis *bredis.Ring
+	var pa *policy.AuthorityImpl
 	overridesRefresherShutdown := func() {}
 	if c.WFE.Limiter.Defaults != "" {
 		// Setup rate limiting.
 		limiterRedis, err = bredis.NewRingFromConfig(*c.WFE.Limiter.Redis, stats, logger)
 		cmd.FailOnError(err, "Failed to create Redis ring")
 
+		// Set Policy Authority for ratelimits
+		pa, err = policy.New(
+			map[identifier.IdentifierType]bool{identifier.TypeDNS: true, identifier.TypeIP: true},
+			map[core.AcmeChallenge]bool{},
+			logger)
+		cmd.FailOnError(err, "Couldn't create PA")
+		if c.WFE.HostnamePolicyFile == "" {
+			cmd.Fail("HostnamePolicyFile must be provided.")
+		}
+		err = pa.LoadIdentPolicyFile(c.WFE.HostnamePolicyFile)
+		cmd.FailOnError(err, "Couldn't load hostname policy file")
+		ratelimits.PA = pa
+
 		source := ratelimits.NewRedisSource(limiterRedis.Ring, clk, stats)
 		limiter, err = ratelimits.NewLimiter(clk, source, stats)
 		cmd.FailOnError(err, "Failed to create rate limiter")
@@ -387,6 +406,7 @@ func main() {
 		unpauseSigner,
 		c.WFE.Unpause.JWTLifetime.Duration,
 		c.WFE.Unpause.URL,
+		pa,
 	)
 	cmd.FailOnError(err, "Unable to create WFE")
 
