Search code examples
sslcurlcertificateself-signed

curl: "Certificate key usage inadequate for attempted operation"


I've read quite a few posts regarding inadequate key usage and I think I understood how to make curl accept self-signed certificates, but I still can't make it work for me:

I have a trust store that contains the CA of my certificate:

./my.trust.crt

I retrieved the cert ./my.server.com.pem from the server using

> openssl s_client -showcerts -servername my.server.com -connect my.server.com:443

I checked that the certificate is fit for use:

> openssl verify -purpose sslserver -CAfile ./my.trust.crt my.server.com.pem
my.server.com.pem: OK
>

But still, curl complains:

> curl -v --cacert ./my.trust.crt https://my.server.com
* About to connect() to my.server.com port 443 (#0)
*   Trying 192.168.x.y...
* Connected to my.server.com (192.168.x.y) port 443 (#0)
* Initializing NSS with certpath: sql:/etc/pki/nssdb
*   CAfile: ./my.trust.crt
  CApath: none
* Server certificate:
*       subject: CN=my.server.com,OU=x,O=y,L=z,ST=ZH,C=CH
*       start date: Mar 07 13:19:00 2019 GMT
*       expire date: Mar 07 13:19:00 2029 GMT
*       common name:my.server.com
*       issuer: CN=My Certificate Authority,O=y,L=z,ST=ZH,C=CH
* NSS error -8102 (SEC_ERROR_INADEQUATE_KEY_USAGE)
* Certificate key usage inadequate for attempted operation.
* Closing connection 0
curl: (60) Certificate key usage inadequate for attempted operation.
More details here: http://curl.haxx.se/docs/sslcerts.html
...

Any hints on how I could in find out what the problem is? Is my openssl verification correct? Anything else I'm doing wrong?

Additional info: there is a single CA in the ca "bundle". Anonymized contents of both CA and server certs as per suggestion (thanks!)

> openssl x509 -in my.server.pem -noout -text
Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number:
            c2:48:fb:ed:52:57:1e:24
    Signature Algorithm: sha256WithRSAEncryption
        Issuer: C=CH, ST=ZH, L=Z, O=Company, CN=Company Certificate Authority
        Validity
            Not Before: Mar  7 13:19:00 2019 GMT
            Not After : Mar  7 13:19:00 2024 GMT
        Subject: C=CH, ST=ZH, L=Z, O=Company, OU=Dept, CN=my.server.com
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
                Public-Key: (2048 bit)
                Modulus:
                    <lots of hex stuff>
                Exponent: 65537 (0x10001)
        X509v3 extensions:
            X509v3 Basic Constraints:
                CA:FALSE
            X509v3 Subject Key Identifier:
                A4:51:53:0C:51:01:2F:51:48:D1:C0:49:B3:8B:CF:BD:7B:91:27:40
            X509v3 Authority Key Identifier:
                keyid:91:E5:80:D7:86:77:4C:B8:16:19:49:DF:74:E4:A7:05:D2:86:12:FE
                DirName:/C=CH/ST=ZH/L=Z/O=Company/CN=Company Certificate Authority
                serial:C2:48:FB:ED:52:57:1D:8B

            X509v3 Key Usage: critical
                Digital Signature
            X509v3 Extended Key Usage: critical
                TLS Web Server Authentication
            X509v3 Subject Alternative Name:
                DNS:my.server.com, DNS:my-1.server.com, DNS:my-2.server.com
    Signature Algorithm: sha256WithRSAEncryption
         <lots of hex stuff>
         
> openssl x509 -in my.trust.crt -noout -text
Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number:
            c2:48:fb:ed:52:57:1d:8b
    Signature Algorithm: sha256WithRSAEncryption
        Issuer: C=CH, ST=ZH, L=Z, O=Company, CN=Company Certificate Authority
        Validity
            Not Before: Sep  9 11:49:46 2015 GMT
            Not After : Sep  9 11:49:46 2025 GMT
        Subject: C=CH, ST=ZH, L=Z, O=Company, CN=Company Certificate Authority
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
                Public-Key: (4096 bit)
                Modulus:
                    <lots of hex stuff>
                Exponent: 65537 (0x10001)
        X509v3 extensions:
            X509v3 Subject Key Identifier:
                91:E5:80:D7:86:77:4C:B8:16:19:49:DF:74:E4:A7:05:D2:86:12:FE
            X509v3 Authority Key Identifier:
                keyid:91:E5:80:D7:86:77:4C:B8:16:19:49:DF:74:E4:A7:05:D2:86:12:FE

            X509v3 Basic Constraints:
                CA:TRUE
    Signature Algorithm: sha256WithRSAEncryption
         <lots of hex stuff>
No Trusted Uses.
No Rejected Uses.
Alias: Company Certificate Authority

Solution

  • As @SteffenUllrich correctly pointed out: the keyEncipherment usage was missing in the server certificate. Adding this (respectively creating certificates that include this usage) solved the issue!