Hola, estoy intentando hacer un programita para un chat cifrado usando las librerias ssl. El funcionamiento sería mas o menos este:
openssl s_server -cert servidor/server.crt -key servidor/server.key -Verify 1 openssl s_client -connect 127.0.0.1:4433 -cert cliente/certificado-cliente.pem -key cliente/clave-cliente.pem
Un servidor que se autentifica y exige que el cliente se autentifique( no me he preocupado de las CA de momento para simplificar) y un cliente que se autentifica con un certificado y clave privada extraidas de ficheros. Estos comandos me funcionan perfectamente y lo pase a un prgrama en C usando las librerias sin problema y tambien funciona.
Ahora querría hacer lo mismo, pero esta vez quiero que el cliente use el certificado y clave del DNIe. Como openssl no tiene por defecto soporte para tarjetas hay que usar el engine PKCS11.
Creo que el cliente debería ser así:
OpenSSL> engine -t dynamic -pre SO_PATH:/usr/lib/engines/engine_pkcs11.so \
-pre ID:pkcs11 -pre LIST_ADD:1 -pre LOAD \
-pre MODULE_PATH:/usr/lib/opensc-pkcs11.so
s_client -engine pkcs11 -connect 127.0.0.1:4433 -cert id_4130363036413235323630323641303230313030313230313032343035 -certform engine -key id_4130363036413235323630323641303230313030313230313032343035 -keyform engine
pero me tira error de tarjeta no soportada:
pkcs11 engine: only RSA_PKCS1_PADDING allowed so far [opensc-pkcs11] pkcs15.c:794:sc_pkcs15_bind: returning with: Unsupported card openssl (lock_dbg_cb): not locked (mode=10, type=30) at eng_table.c:173 engine "pkcs11" set. pkcs11 engine: only RSA_PKCS1_PADDING allowed so far [opensc-pkcs11] pkcs15.c:794:sc_pkcs15_bind: returning with: Unsupported card pkcs11 engine: only RSA_PKCS1_PADDING allowed so far [opensc-pkcs11] pkcs15.c:794:sc_pkcs15_bind: returning with: Unsupported card pkcs11 engine: only RSA_PKCS1_PADDING allowed so far [opensc-pkcs11] pkcs15.c:794:sc_pkcs15_bind: returning with: Unsupported card pkcs11 engine: only RSA_PKCS1_PADDING allowed so far [opensc-pkcs11] pkcs15.c:794:sc_pkcs15_bind: returning with: Unsupported card pkcs11 engine: only RSA_PKCS1_PADDING allowed so far [opensc-pkcs11] pkcs15.c:794:sc_pkcs15_bind: returning with: Unsupported card pkcs11 engine: only RSA_PKCS1_PADDING allowed so far [opensc-pkcs11] pkcs15.c:794:sc_pkcs15_bind: returning with: Unsupported card Found empty token; pkcs11 engine: only RSA_PKCS1_PADDING allowed so far [opensc-pkcs11] pkcs15.c:794:sc_pkcs15_bind: returning with: Unsupported card pkcs11 engine: only RSA_PKCS1_PADDING allowed so far [opensc-pkcs11] pkcs15.c:794:sc_pkcs15_bind: returning with: Unsupported card pkcs11 engine: only RSA_PKCS1_PADDING allowed so far [opensc-pkcs11] pkcs15.c:794:sc_pkcs15_bind: returning with: Unsupported card pkcs11 engine: only RSA_PKCS1_PADDING allowed so far [opensc-pkcs11] pkcs15.c:794:sc_pkcs15_bind: returning with: Unsupported card PKCS11_get_private_key returned NULL unable to load client certificate private key file
Pero no tengo muy claro que es lo que falla, ya que cuando te autentificas en una página con el DNIe si que puede hacerlo.
¿Alguien sabe que esta pasando?
Sino había pensado en que el servidor se autentifique con las librerias ssl y la parte de autentificación del cliente programarla a mano: extraer el certificado del DNIe y enviarlo, que el servidor te envie un texto aleatorio, firmarlo y que el servidor verifique la firma ... pero creo que tiene que haber una forma más fácil de hacerlo que no hacer todo esto a mano.
¿Alguna idea?
Gracias