Какие из эллиптических кривых поддерживаются сертификатами Kubernetes?

Проблема

Я сгенерировал ключи и сертификаты с помощью secp256k1, запустите rke версия v1.2.8, и возникла следующая ошибка:

      FATA[0000] Failed to read certificates from dir [/home/max/cluster_certs]: failed to read certificate [kube-apiserver-requestheader-ca.pem]: x509: unsupported elliptic curve

kubectl version:

      Client Version: version.Info{Major:"1", Minor:"21", GitVersion:"v1.21.1", GitCommit:"5e58841cce77d4bc13713ad2b91fa0d961e69192", GitTreeState:"clean", BuildDate:"2021-05-12T14:18:45Z", GoVersion:"go1.16.4", Compiler:"gc", Platform:"linux/amd64"}

Я создал ключ корневого ЦС и сертификат следующим образом:

      openssl ecparam -name secp256k1 -genkey -noout -out ca-pvt.pem
openssl ec -in ca-pvt.pem -pubout -out ca-pub.pem
openssl req -config C:\max_doc\CA\openssl.cnf -x509 -sha256 -new -nodes -key ca-pvt.pem -days 10227 -out ca-cert.cer

Затем я использовал его для подписания CSR, созданных rke cert generate-csr из моего Kubernetes Rancher cluster.yml.

Командная строка для утверждения CSR была следующей:

      openssl ca -config openssl.cnf -batch -in %1 -out %2 -rand random.bin -writerand random.bin -create_serial -notext

Вопрос

Какие кривые сегодня поддерживает Kubernetes для сертификатов, если secp256k1 дает x509: unsupported elliptic curve сообщение об ошибке?

1 ответ

Какие кривые сегодня поддерживаются Kubernetes для сертификатов, если дает x509: unsupported elliptic curve сообщение об ошибке?

Чтобы попытаться ответить на этот вопрос, я посмотрю непосредственно на исходный код . Вы можете найти там строки, которые выдают ошибку unsupported elliptic curve:

      case *ecdsa.PublicKey:
        publicKeyBytes = elliptic.Marshal(pub.Curve, pub.X, pub.Y)
        oid, ok := oidFromNamedCurve(pub.Curve)
        if !ok {
            return nil, pkix.AlgorithmIdentifier{}, errors.New("x509: unsupported elliptic curve")
        }

Здесь есть две функции, которые отвечают за обработку кривой:

  • Маршал:
      // Marshal converts a point on the curve into the uncompressed form specified in
// section 4.3.6 of ANSI X9.62.
func Marshal(curve Curve, x, y *big.Int) []byte {
    byteLen := (curve.Params().BitSize + 7) / 8

    ret := make([]byte, 1+2*byteLen)
    ret[0] = 4 // uncompressed point

    x.FillBytes(ret[1 : 1+byteLen])
    y.FillBytes(ret[1+byteLen : 1+2*byteLen])

    return ret
}
  • oidFromNamedCurve:
      // OIDFromNamedCurve returns the OID used to specify the use of the given
// elliptic curve.
func OIDFromNamedCurve(curve elliptic.Curve) (asn1.ObjectIdentifier, bool) {
    switch curve {
    case elliptic.P224():
        return OIDNamedCurveP224, true
    case elliptic.P256():
        return OIDNamedCurveP256, true
    case elliptic.P384():
        return OIDNamedCurveP384, true
    case elliptic.P521():
        return OIDNamedCurveP521, true
    case secp192r1():
        return OIDNamedCurveP192, true
    }

    return nil, false
}

Таким образом, окончательный ответ находится в переключателе. Поддерживаемые эллиптические кривые:

OpenSSL поддерживает «secp256r1», он просто называется «prime256v1». См. Раздел 2.1.1.1 в RFC 5480, где кривая «secp192r1» называется «prime192v1», а кривая «secp256r1» называется «prime256v1».

Другие вопросы по тегам