Verifique mediante programación la cadena de certificados utilizando la API de OpenSSL

Esto es muy similar a otras preguntas, pero las que he visto no tienen una respuesta o no hacen la misma pregunta. Tengo un certificado de CA autofirmado y otros dos certificados que están firmados con ese certificado de CA. Estoy bastante seguro de que los certificados son correctos, porque 'openssl Verify' funciona:

$ openssl verify -CAfile ca.pem server.pem
server.pem: OK

(Lo anterior es de memoria, no los tengo delante de mí, por lo que puede estar un poco apagado).

Ahora quiero verificar los certificados programáticamente. Tengo una función de utilidad con pseudocódigo a continuación:

int verify_cert(X509 *cert, X509 *cacert)
{
     int ret;
     X509_STORE *store;
     X509_STORE_CTX *ctx;

     store = X509_STORE_new();
     X590_STORE_add_cert(store, cacert);

     ctx = X509_STORE_CTX_new();
     X509_STORE_CTX_init(ctx, store, cert, NULL);

     ret = X590_verify_cert(ctx);

     /* check for errors and clean up */
}

Mi problema es que el código anterior siempre devuelve 'no se pudo encontrar el certificado del emisor'. ¿Qué he hecho mal? Creo que estoy creando una nueva tienda, agregando el cacert, creando un nuevo contexto, y agregando el certificado de niño para ser verificado al contexto con un puntero a la tienda que contiene la CA. Obviamente estoy haciendo algo mal, pero no estoy seguro de qué.

¿Algunas ideas?

Actualizar: Soy consciente de que puedo guardar estos certificados en el disco y usar algo como X509_LOOKUP_file o algo similar. Estoy buscando una solución que no toque el disco innecesariamente.

Respuestas a la pregunta(5)

Su respuesta a la pregunta