Какие из эллиптических кривых поддерживаются сертификатами 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
}
Таким образом, окончательный ответ находится в переключателе. Поддерживаемые эллиптические кривые:
- эллиптический.
- эллиптический. P384
- эллиптический.P256эллиптический.P521
- secp192r1 Вам нужно изменить вашу кривую на. Основное отличие в том, что
secp256k1
кривая Коблица, аsecp256r1
не является. Кривые Коблица, как известно, на несколько бит слабее других кривых.
OpenSSL поддерживает «secp256r1», он просто называется «prime256v1». См. Раздел 2.1.1.1 в RFC 5480, где кривая «secp192r1» называется «prime192v1», а кривая «secp256r1» называется «prime256v1».