forked from TrueCloudLab/certificates
acme: go fmt
This commit is contained in:
parent
9af4dd3692
commit
bdadea8a37
3 changed files with 35 additions and 41 deletions
|
@ -206,7 +206,7 @@ func (h *Handler) GetChallenge(w http.ResponseWriter, r *http.Request) {
|
||||||
}
|
}
|
||||||
|
|
||||||
var (
|
var (
|
||||||
ch *acme.Challenge
|
ch *acme.Challenge
|
||||||
chID = chi.URLParam(r, "chID")
|
chID = chi.URLParam(r, "chID")
|
||||||
)
|
)
|
||||||
ch, err = h.Auth.ValidateChallenge(prov, acc.GetID(), chID, acc.GetKey())
|
ch, err = h.Auth.ValidateChallenge(prov, acc.GetID(), chID, acc.GetKey())
|
||||||
|
|
|
@ -57,12 +57,12 @@ var (
|
||||||
orderTable = []byte("acme_orders")
|
orderTable = []byte("acme_orders")
|
||||||
ordersByAccountIDTable = []byte("acme_account_orders_index")
|
ordersByAccountIDTable = []byte("acme_account_orders_index")
|
||||||
certTable = []byte("acme_certs")
|
certTable = []byte("acme_certs")
|
||||||
ordinal int
|
ordinal int
|
||||||
)
|
)
|
||||||
|
|
||||||
// Ordinal is used during challenge retries to indicate ownership.
|
// Ordinal is used during challenge retries to indicate ownership.
|
||||||
func init() {
|
func init() {
|
||||||
ordstr := os.Getenv("STEP_CA_ORDINAL");
|
ordstr := os.Getenv("STEP_CA_ORDINAL")
|
||||||
if ordstr == "" {
|
if ordstr == "" {
|
||||||
ordinal = 0
|
ordinal = 0
|
||||||
} else {
|
} else {
|
||||||
|
@ -323,13 +323,12 @@ func (a *Authority) ValidateChallenge(p provisioner.Interface, accID, chID strin
|
||||||
// Take ownership of the challenge status and retry state. The values must be reset.
|
// Take ownership of the challenge status and retry state. The values must be reset.
|
||||||
up := ch.clone()
|
up := ch.clone()
|
||||||
up.Status = StatusProcessing
|
up.Status = StatusProcessing
|
||||||
up.Retry = &Retry {
|
up.Retry = &Retry{
|
||||||
Owner: ordinal,
|
Owner: ordinal,
|
||||||
ProvisionerID: p.GetID(),
|
ProvisionerID: p.GetID(),
|
||||||
NumAttempts: 0,
|
NumAttempts: 0,
|
||||||
MaxAttempts: 10,
|
MaxAttempts: 10,
|
||||||
NextAttempt: time.Now().Add(retryInterval).UTC().Format(time.RFC3339),
|
NextAttempt: time.Now().Add(retryInterval).UTC().Format(time.RFC3339),
|
||||||
|
|
||||||
}
|
}
|
||||||
err = up.save(a.db, ch)
|
err = up.save(a.db, ch)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -382,7 +381,6 @@ func (a *Authority) validate(ch challenge, jwk *jose.JSONWebKey) (challenge, err
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
const retryInterval = 12 * time.Second
|
const retryInterval = 12 * time.Second
|
||||||
|
|
||||||
// see: ValidateChallenge
|
// see: ValidateChallenge
|
||||||
|
@ -458,7 +456,6 @@ func (a *Authority) RetryChallenge(chID string) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// GetCertificate retrieves the Certificate by ID.
|
// GetCertificate retrieves the Certificate by ID.
|
||||||
func (a *Authority) GetCertificate(accID, certID string) ([]byte, error) {
|
func (a *Authority) GetCertificate(accID, certID string) ([]byte, error) {
|
||||||
cert, err := getCert(a.db, certID)
|
cert, err := getCert(a.db, certID)
|
||||||
|
@ -470,4 +467,3 @@ func (a *Authority) GetCertificate(accID, certID string) ([]byte, error) {
|
||||||
}
|
}
|
||||||
return cert.toACME(a.db, a.dir)
|
return cert.toACME(a.db, a.dir)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -25,15 +25,15 @@ import (
|
||||||
// Challenge is a subset of the challenge type containing only those attributes
|
// Challenge is a subset of the challenge type containing only those attributes
|
||||||
// required for responses in the ACME protocol.
|
// required for responses in the ACME protocol.
|
||||||
type Challenge struct {
|
type Challenge struct {
|
||||||
Type string `json:"type"`
|
Type string `json:"type"`
|
||||||
Status string `json:"status"`
|
Status string `json:"status"`
|
||||||
Token string `json:"token"`
|
Token string `json:"token"`
|
||||||
Validated string `json:"validated,omitempty"`
|
Validated string `json:"validated,omitempty"`
|
||||||
URL string `json:"url"`
|
URL string `json:"url"`
|
||||||
Error *AError `json:"error,omitempty"`
|
Error *AError `json:"error,omitempty"`
|
||||||
RetryAfter string `json:"retry_after,omitempty"`
|
RetryAfter string `json:"retry_after,omitempty"`
|
||||||
ID string `json:"-"`
|
ID string `json:"-"`
|
||||||
AuthzID string `json:"-"`
|
AuthzID string `json:"-"`
|
||||||
}
|
}
|
||||||
|
|
||||||
// ToLog enables response logging.
|
// ToLog enables response logging.
|
||||||
|
@ -86,10 +86,10 @@ type challenge interface {
|
||||||
|
|
||||||
// ChallengeOptions is the type used to created a new Challenge.
|
// ChallengeOptions is the type used to created a new Challenge.
|
||||||
type ChallengeOptions struct {
|
type ChallengeOptions struct {
|
||||||
AccountID string
|
AccountID string
|
||||||
AuthzID string
|
AuthzID string
|
||||||
ProvisionerID string
|
ProvisionerID string
|
||||||
Identifier Identifier
|
Identifier Identifier
|
||||||
}
|
}
|
||||||
|
|
||||||
// baseChallenge is the base Challenge type that others build from.
|
// baseChallenge is the base Challenge type that others build from.
|
||||||
|
@ -294,18 +294,17 @@ func unmarshalChallenge(data []byte) (challenge, error) {
|
||||||
// Challenge retry information is internally relevant and needs to be stored in the DB, but should not be part
|
// Challenge retry information is internally relevant and needs to be stored in the DB, but should not be part
|
||||||
// of the public challenge API apart from the Retry-After header.
|
// of the public challenge API apart from the Retry-After header.
|
||||||
type Retry struct {
|
type Retry struct {
|
||||||
Owner int `json:"owner"`
|
Owner int `json:"owner"`
|
||||||
ProvisionerID string `json:"provisionerid"`
|
ProvisionerID string `json:"provisionerid"`
|
||||||
NumAttempts int `json:"numattempts"`
|
NumAttempts int `json:"numattempts"`
|
||||||
MaxAttempts int `json:"maxattempts"`
|
MaxAttempts int `json:"maxattempts"`
|
||||||
NextAttempt string `json:"nextattempt"`
|
NextAttempt string `json:"nextattempt"`
|
||||||
}
|
}
|
||||||
|
|
||||||
func (r *Retry) Active() bool {
|
func (r *Retry) Active() bool {
|
||||||
return r.NumAttempts < r.MaxAttempts
|
return r.NumAttempts < r.MaxAttempts
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// http01Challenge represents an http-01 acme challenge.
|
// http01Challenge represents an http-01 acme challenge.
|
||||||
type http01Challenge struct {
|
type http01Challenge struct {
|
||||||
*baseChallenge
|
*baseChallenge
|
||||||
|
@ -452,8 +451,8 @@ func (tc *tlsALPN01Challenge) validate(jwk *jose.JSONWebKey, vo validateOptions)
|
||||||
|
|
||||||
leafCert := certs[0]
|
leafCert := certs[0]
|
||||||
if len(leafCert.DNSNames) != 1 || !strings.EqualFold(leafCert.DNSNames[0], tc.Value) {
|
if len(leafCert.DNSNames) != 1 || !strings.EqualFold(leafCert.DNSNames[0], tc.Value) {
|
||||||
e := errors.Errorf("incorrect certificate for tls-alpn-01 challenge: " +
|
e := errors.Errorf("incorrect certificate for tls-alpn-01 challenge: "+
|
||||||
"leaf certificate must contain a single DNS name, %v", tc.Value)
|
"leaf certificate must contain a single DNS name, %v", tc.Value)
|
||||||
up.Error = RejectedIdentifierErr(e).ToACME()
|
up.Error = RejectedIdentifierErr(e).ToACME()
|
||||||
return up, nil
|
return up, nil
|
||||||
}
|
}
|
||||||
|
@ -472,7 +471,7 @@ func (tc *tlsALPN01Challenge) validate(jwk *jose.JSONWebKey, vo validateOptions)
|
||||||
if idPeAcmeIdentifier.Equal(ext.Id) {
|
if idPeAcmeIdentifier.Equal(ext.Id) {
|
||||||
if !ext.Critical {
|
if !ext.Critical {
|
||||||
e := errors.Errorf("incorrect certificate for tls-alpn-01 challenge: " +
|
e := errors.Errorf("incorrect certificate for tls-alpn-01 challenge: " +
|
||||||
"acmeValidationV1 extension not critical")
|
"acmeValidationV1 extension not critical")
|
||||||
up.Error = IncorrectResponseErr(e).ToACME()
|
up.Error = IncorrectResponseErr(e).ToACME()
|
||||||
return up, nil
|
return up, nil
|
||||||
}
|
}
|
||||||
|
@ -482,15 +481,15 @@ func (tc *tlsALPN01Challenge) validate(jwk *jose.JSONWebKey, vo validateOptions)
|
||||||
|
|
||||||
if err != nil || len(rest) > 0 || len(hashedKeyAuth) != len(extValue) {
|
if err != nil || len(rest) > 0 || len(hashedKeyAuth) != len(extValue) {
|
||||||
e := errors.Errorf("incorrect certificate for tls-alpn-01 challenge: " +
|
e := errors.Errorf("incorrect certificate for tls-alpn-01 challenge: " +
|
||||||
"malformed acmeValidationV1 extension value")
|
"malformed acmeValidationV1 extension value")
|
||||||
up.Error = IncorrectResponseErr(e).ToACME()
|
up.Error = IncorrectResponseErr(e).ToACME()
|
||||||
return up, nil
|
return up, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
if subtle.ConstantTimeCompare(hashedKeyAuth[:], extValue) != 1 {
|
if subtle.ConstantTimeCompare(hashedKeyAuth[:], extValue) != 1 {
|
||||||
e := errors.Errorf("incorrect certificate for tls-alpn-01 challenge: " +
|
e := errors.Errorf("incorrect certificate for tls-alpn-01 challenge: "+
|
||||||
"expected acmeValidationV1 extension value %s for this challenge but got %s",
|
"expected acmeValidationV1 extension value %s for this challenge but got %s",
|
||||||
hex.EncodeToString(hashedKeyAuth[:]), hex.EncodeToString(extValue))
|
hex.EncodeToString(hashedKeyAuth[:]), hex.EncodeToString(extValue))
|
||||||
up.Error = IncorrectResponseErr(e).ToACME()
|
up.Error = IncorrectResponseErr(e).ToACME()
|
||||||
// There is an appropriate value, but it doesn't match.
|
// There is an appropriate value, but it doesn't match.
|
||||||
up.Status = StatusInvalid
|
up.Status = StatusInvalid
|
||||||
|
@ -511,13 +510,13 @@ func (tc *tlsALPN01Challenge) validate(jwk *jose.JSONWebKey, vo validateOptions)
|
||||||
|
|
||||||
if foundIDPeAcmeIdentifierV1Obsolete {
|
if foundIDPeAcmeIdentifierV1Obsolete {
|
||||||
e := errors.Errorf("incorrect certificate for tls-alpn-01 challenge: " +
|
e := errors.Errorf("incorrect certificate for tls-alpn-01 challenge: " +
|
||||||
"obsolete id-pe-acmeIdentifier in acmeValidationV1 extension")
|
"obsolete id-pe-acmeIdentifier in acmeValidationV1 extension")
|
||||||
up.Error = IncorrectResponseErr(e).ToACME()
|
up.Error = IncorrectResponseErr(e).ToACME()
|
||||||
return up, nil
|
return up, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
e := errors.Errorf("incorrect certificate for tls-alpn-01 challenge: "+
|
e := errors.Errorf("incorrect certificate for tls-alpn-01 challenge: " +
|
||||||
"missing acmeValidationV1 extension")
|
"missing acmeValidationV1 extension")
|
||||||
up.Error = IncorrectResponseErr(e).ToACME()
|
up.Error = IncorrectResponseErr(e).ToACME()
|
||||||
return tc, nil
|
return tc, nil
|
||||||
}
|
}
|
||||||
|
@ -600,7 +599,7 @@ func (dc *dns01Challenge) validate(jwk *jose.JSONWebKey, vo validateOptions) (ch
|
||||||
|
|
||||||
up.Status = StatusInvalid
|
up.Status = StatusInvalid
|
||||||
e := errors.Errorf("keyAuthorization does not match; expected %s, but got %s",
|
e := errors.Errorf("keyAuthorization does not match; expected %s, but got %s",
|
||||||
expectedKeyAuth, txtRecords)
|
expectedKeyAuth, txtRecords)
|
||||||
up.Error = IncorrectResponseErr(e).ToACME()
|
up.Error = IncorrectResponseErr(e).ToACME()
|
||||||
return up, nil
|
return up, nil
|
||||||
}
|
}
|
||||||
|
@ -630,4 +629,3 @@ func getChallenge(db nosql.DB, id string) (challenge, error) {
|
||||||
}
|
}
|
||||||
return ch, nil
|
return ch, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue