Problem
I have generated keys and certificates by OpenSSL with the secp256k1, run rke
version v1.2.8 from the Rancher Kubernetes Engine (RKE), and got the following error:
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"}
I have generated the root CA key and certificate the following way:
openssl ecparam -name secp256k1 -genkey -noout -out ca-pvt.pem -rand random.bin -writerand random.bin
openssl req -config .\openssl.cnf -x509 -sha256 -new -nodes -key ca-pvt.pem -days 10227 -out ca-cert.cer -rand random.bin -writerand random.bin
Then I used it to sign the CSRs generated by rke cert generate-csr
from my Kubernetes Rancher cluster.yml
.
The command line to approve a CSR was the following:
openssl ca -config openssl.cnf -batch -in %1 -out %2 -create_serial -notext -rand random.bin -writerand random.bin
Question
Which curves are supported today by Kubernetes for the certificates if secp256k1
yields the x509: unsupported elliptic curve
error message?
P.S.
I have also tried the prime256v1
, also known as secp256r1
. It progressed further comparing to secp256k1
, but still got an error.
With prime256v1
, RKE did not complain x509: unsupported elliptic curve
.
Instead, it gave an error panic: interface conversion: interface {} is *ecdsa.PrivateKey, not *rsa.PrivateKey
. Here is the full error message:
Here is the full error message:
DEBU[0000] Certificate file [./cluster_certs/kube-apiserver-requestheader-ca.pem] content is greater than 0
panic: interface conversion: interface {} is *ecdsa.PrivateKey, not *rsa.PrivateKey
goroutine 1 [running]: github.com/rancher/rke/pki.getKeyFromFile(0x7ffe6294c74e, 0xf, 0xc00105cb10, 0x27, 0x8, 0xc00105cb10, 0x27)
/go/src/github.com/rancher/rke/pki/util.go:656 +0x212
secp256r1
? The main difference is thatsecp256k1
is a Koblitz curve, whilesecp256r1
is not. Koblitz curves are known to be a few bits weaker than other curves. – Marquessprime256v1
– Marquessusing curve name prime256v1 instead of secp256r1
. OpenSSL supports "secp256r1", it is just called "prime256v1". Check section 2.1.1.1 in RFC 5480, where the "secp192r1" curve is called "prime192v1" and the "secp256r1" curve is called "prime256v1". – Volcano