Después de instalar OpenCA y configurar la Autoridad de certificación (CA), encontré un error:"La verificación de firma falló en la clave pública de SPKAC ” mientras firma la solicitud de certificado de entidad final en la máquina CA.
Error while issuing Certificate to David (filename: /home/openca/var/openca/tmp/4229D72DA1BA34B416B9.req). OpenCA::OpenSSL returns errocode 7731075 (OpenCA::OpenSSL->issueCert: OpenSSL fails (7777067). Using configuration from /home/openca/etc/openca/openssl/openssl/User.conf Check that the SPKAC request matches the signature Signature verification failed on SPKAC public key 140250398984096:error:0D06407A:asn1 encoding routines:a2d_ASN1_OBJECT:first num too large:a_object.c:108: 140250398984096:error:0D0C50A1:asn1 encoding routines:ASN1_item_verify:unknown message digest algorithm:a_verify.c:206: error in ca ).
Estoy usando openca-base-1.5.0 y openca-tools-1.3.0
Depuración:
- Habilité la opción de depuración en OpenCA y encontré el comando OpenSSL que firma el certificado de usuario. A continuación se muestra la instantánea de la depuración.
OpenCA::OpenSSL->_execute_command: ca -batch -config /home/openca/etc/openca/openssl/openssl/User.conf -keyfile /home/openca/var/openca/crypto/keys/cakey.pem -passin env:pwd -extfile /home/openca/var/openca/tmp/User.ext -preserveDN -subj "/O=OpenCA Labs/OU=Users/CN=David" -spkac /home/openca/var/openca/tmp/4229D72DA1BA34B416B9.req
Más de la depuración...
OpenCA::OpenSSL->setError: errno: 7731075 OpenCA::OpenSSL->setError: errval: OpenCA::OpenSSL->issueCert: OpenSSL fails (7777067). Using configuration from /home/openca/etc/openca/openssl/openssl/User.conf Check that the SPKAC request matches the signature signature verification failed on SPKAC public key 140030475425696:error:0D06407A:asn1 encoding routines:a2d_ASN1_OBJECT:first num too large:a_object.c:108: 140030475425696:error:0D0C50A1:asn1 encoding routines:ASN1_item_verify:unknown message digest algorithm:a_verify.c:206: error in ca
El error “la verificación de la firma falló en la clave pública SPKAC ” dice claramente que el problema es al firmar la clave pública SPKAC:la solicitud se generó en la ventana del navegador de los usuarios como se muestra a continuación:
La solicitud generada por el navegador consta de la clave pública y la firma de SPKAC. El SPKAC probablemente usa MD5
en su firma. Eso es inseguro y OpenSSL no verifica las firmas que usan MD5
por defecto.
Entonces, ¿cómo le decimos a OpenSSL que acepte solicitudes que usan MD5? Así es como es.
Cómo solucionar el error de verificación de firma en la clave pública SPKAC
Establezca la variable de entorno OPENSSL_ENABLE_MD5_VERIFY
como solución alternativa para permitir que OpenSSL firme solicitudes que usan MD5. Como OpenCA usa sesiones, no puede simplemente configurar la variable de entorno en la línea de comando. Debe configurarlo programáticamente, de modo que cada vez que OpenCA use el comando OpenSSL para firmar, debe configurarse.
Por lo tanto, establezca la variable de entorno OPENSSL_ENABLE_MD5_VERIFY
en /home/openca/lib/openca/perl_modules/perl5/x86_64-linux-thread-multi/OpenCA/OpenSSL.pm
archivo:
Busque la Línea:# ejecutando el comando OpenSSL
A continuación se muestra el código, donde ocurre la firma del certificado.
$self->_debug ("issueCert: openssl=$command"); $ENV{'pwd'} = "$passwd"; $ret = $self->_execute_command (COMMAND => $command, KEY_USAGE => $engine); delete ($ENV{'pwd'}); unlink ($reqfile) if ($reqdata); if( not $ret ) { $self->setError (7731075, $self->{gettext} ("OpenCA::OpenSSL->issueCert: OpenSSL fails (__ERRNO__). __ERRVAL__", "__ERRNO__", $self->errno, "__ERRVAL__", $self->errval)); return undef; }
Antes de ejecutar el código anterior, debe configurar la variable de entorno como se muestra a continuación:
$ENV{OPENSSL_ENABLE_MD5_VERIFY} = 0;
Ahora reinicie el demonio OpenCA y firme su certificado de usuario. Debería funcionar.
Vía Bugzilla