pyopenssl icon indicating copy to clipboard operation
pyopenssl copied to clipboard

X509StoreContext.verify_certificate() not checking certificate signature (by default?)

Open ellepdesk opened this issue 7 years ago • 2 comments

I'n trying to set up a system to generate and check certificates using pyopenssl. In my test suite I am generating certificates, with all sorts of faults.

When I generate a, properly signed, certificate with a 'not valid after' date in the past, verify_certificate() correctly throws an error. However, when I then set the 'not valid after' date to a new date in the future, but not re-signing it, verify_certificate() returns true, indicating the certificate is valid.

When I export the modified certificate and use the openssl command line to verify the certificate it correctly reports the signature to be (correctly) invalid.

Am I missing some setting, or did I hit a bug?

I've compressed my project into a single file to illustrate my problem: pyopenssl_test.py

ellepdesk avatar Oct 24 '16 18:10 ellepdesk

crypto.py, in def __init__ for X509StoreContext:

1596         ret = _lib.X509_STORE_CTX_init(
1597             self._store_ctx, self._store._store, self._cert._x509, _ffi.NULL
1598         )

The store context is not being populated with the CA chain. In the code above, the _ffi.NULL is being passed as the trusted CA stack and should be populated. I'm still looking for how to create the appropriate Cryptography_STACK_OF_X509 pointer to pass as a parameter there.

trav1th avatar Nov 27 '16 19:11 trav1th

You can create a Cryptography_STACK_OF_X509 object with sk_X509_new_null(void). You can then push X509 objects onto it via sk_X509_push(X509 *). These are both bound in cryptography's bindings. However, you'll need to carefully investigate the memory handling of that to be sure it's safe to add an X509 object's underlying X509 * to it (does it retain and take ownership?).

reaperhulk avatar Nov 28 '16 01:11 reaperhulk