Why this error (should, from what I understand, be ok)

Karl Denninger karl at denninger.net
Tue Feb 14 03:35:31 UTC 2023


On 2/13/2023 9:53 PM, Viktor Dukhovni wrote:
> On Mon, Feb 13, 2023 at 07:56:22PM -0500, Karl Denninger wrote:
>
>> Environment is a client/server, with both ends checking the certificates.
>>
>>               Netscape Cert Type:
>>               X509v3 Extended Key Usage:
>>                   TLS Web Server Authentication, TLS Web Client Authentication
>>
>> The client is able to follow the signature and verifies it. However,
>> the client certificate with the same extensions connects, but the
>> server complains on verification that the client cert supplied has
>> "invalid purpose."
> The problem purpose may be a result of explicit EKUs for one of the
> issuing CAs, that don't include "TLS Web Client Authentication" (a.k.a.
> "clientAuth").
>
> You don't need to test with TLS connections,  instead, for example:
>
>      # hostname=...
>      # CAfile=...
>      # openssl verify -show_chain -purpose sslclient \
>          -verify_hostname "$hostname" \
>          -trusted "$CAfile" \
>          -untrusted "/etc/letsencrypt/live/$hostname/fullchain.pem" \
>          "/etc/letsencrypt/live/$hostname/cert.pem"
>      /etc/letsencrypt/live/.../cert.pem: OK
>      Chain:
>      depth=0: CN = ... (untrusted)
>      depth=1: C = US, O = Let's Encrypt, CN = R3 (untrusted)
>      depth=2: C = US, O = Internet Security Research Group, CN = ISRG Root X1
>
> While with "smimesign" as the purpose:
>
>      # hostname=...
>      # CAfile=...
>      # openssl verify -show_chain -purpose smimesign \
>          -verify_hostname "$hostname" \
>          -trusted "$CAfile" \
>          -untrusted "/etc/letsencrypt/live/$hostname/fullchain.pem" \
>          "/etc/letsencrypt/live/$hostname/cert.pem"
>      CN = ...
>      error 26 at 0 depth lookup: unsupported certificate purpose
>      C = US, O = Let's Encrypt, CN = R3
>      error 26 at 1 depth lookup: unsupported certificate purpose
>      error /etc/letsencrypt/live/.../cert.pem: verification failed
>
> However, note that the error reported by OpenSSL is "unsupported
> purpose", NOT "invalid purpose", for that error, I actually need to
> specify a made up purpose name.  So it is unclear how your server
> managed to report an "invalid purpose", perhaps there's a typo in
> the server code, and it rejects all client certificates, because
> it tries to check them against an unknown (to OpenSSL) "purpose".

I generated a certificate for the connecting device with "server, 
client" as the purpose (not the EKUs but "nsCertType") and the server 
now accepts it.

This particular code set was used a number of years (and many OpenSSL 
releases) back and didn't complain about this; its not a big deal to 
issue the certs this way for the connecting client endpoints, but I was 
more than a bit surprised when I got the rejections, since the keyUsage 
and EKU parameters appeared to permit what I was doing.

-- 
-- Karl Denninger
/The Market-Ticker/
S/MIME Email accepted and preferred
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://mta.openssl.org/pipermail/openssl-users/attachments/20230213/254cb67b/attachment-0001.htm>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: smime.p7s
Type: application/pkcs7-signature
Size: 4864 bytes
Desc: S/MIME Cryptographic Signature
URL: <https://mta.openssl.org/pipermail/openssl-users/attachments/20230213/254cb67b/attachment-0001.p7s>


More information about the openssl-users mailing list