1. Introducción
El siguiente artículo explica cómo resolver el problema reciente causado por la emisión de certificados firmados por SectiGo por el cual, debido a certificados raíces no presentes en instalaciones antiguas, hace que el certificado no pueda ser importado/verificado correctamente.
A esto une el hecho de que la emisión de los certificados afectados por este problema incluyen dos raíces. Una nueva, disponible hasta el 2030 y otra antigua, disponible hasta el pasado 30/05/2020.
Resumiendo los detalles, el problema viene causado por dos motivos concurrentes:
-
Software de verificación, como openssl, que afecta a apache2, nginx, curl, php, encuentra en la cadena de verificación un certificado expirado el 30/05/2020 (a pesar de tener en la cadena el certificado que podría ayudarle a completar la verificación, válido hasta el 2030). El certificado afectado es el siguiente:
-
El segundo problema es que algunos configuraciones antiguas, no incluyen el certificado raíz que permite aceptar (“validar”), a su vez, el nuevo certificado raíz, válido hasta 2030.
A continuación explicamos cómo resolver ambos problemas.
En cualquier caso, los síntomas de fallo son los mismos:
-
Al verificar la web en cuestión, aparece la indicación de certificado expirado:
-
Al mismo tiempo, aparecen indicaciones de fallo openssl con error concreto:
Warning: file_get_contents(): SSL operation failed with code 1. OpenSSL Error messages: error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed
-
SectiGo (la nueva Comodo), ha publicado un artículo explicando los detalles en:
2. Cómo resolver el problema para tu sistema con Core-Admin
Actualización 05/05/2020:
Core-Admin, revisión 10420, incluye una actualización para detectar, y borrar certificados intermedios expirados asociados a esta incidencia. La actualización opera de manera totalmente automatizada.
A continuación nota histórica usada para resolver la incidencia:
Las siguientes indicaciones son para Core-Admin pero te ayudarán para tu sistema ya que son genéricas.
Básicamente, hay que retirar de la cadena presentada al cliente, el certificado raíz que está expirado. Para ello:
-
Exporta el certificado afectado:
-
Coge el resultado de la exportación, en especial el certificado y el “intermediate/chain certificate”.
-
Ahora, pincha a completar el certificado, reintroduciendo el certificado y el “intermediate/chain certificate”, pero quitando la segunda parte, la expirada, que sería la siguiente:
…e introduces el certificado en “Crt. firmado” y el intermedio sin la segunda parte en “Ca intermedio”:
…la segunda parte a eliminar es la siguiente:
-----BEGIN CERTIFICATE----- MIIFdzCCBF+gAwIBAgIQE+oocFv07O0MNmMJgGFDNjANBgkqhkiG9w0BAQwFADBv MQswCQYDVQQGEwJTRTEUMBIGA1UEChMLQWRkVHJ1c3QgQUIxJjAkBgNVBAsTHUFk ZFRydXN0IEV4dGVybmFsIFRUUCBOZXR3b3JrMSIwIAYDVQQDExlBZGRUcnVzdCBF eHRlcm5hbCBDQSBSb290MB4XDTAwMDUzMDEwNDgzOFoXDTIwMDUzMDEwNDgzOFow gYgxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpOZXcgSmVyc2V5MRQwEgYDVQQHEwtK ZXJzZXkgQ2l0eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMS4wLAYD VQQDEyVVU0VSVHJ1c3QgUlNBIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIICIjAN BgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAgBJlFzYOw9sIs9CsVw127c0n00yt UINh4qogTQktZAnczomfzD2p7PbPwdzx07HWezcoEStH2jnGvDoZtF+mvX2do2NC tnbyqTsrkfjib9DsFiCQCT7i6HTJGLSR1GJk23+jBvGIGGqQIjy8/hPwhxR79uQf jtTkUcYRZ0YIUcuGFFQ/vDP+fmyc/xadGL1RjjWmp2bIcmfbIWax1Jt4A8BQOujM 8Ny8nkz+rwWWNR9XWrf/zvk9tyy29lTdyOcSOk2uTIq3XJq0tyA9yn8iNK5+O2hm AUTnAU5GU5szYPeUvlM3kHND8zLDU+/bqv50TmnHa4xgk97Exwzf4TKuzJM7UXiV Z4vuPVb+DNBpDxsP8yUmazNt925H+nND5X4OpWaxKXwyhGNVicQNwZNUMBkTrNN9 N6frXTpsNVzbQdcS2qlJC9/YgIoJk2KOtWbPJYjNhLixP6Q5D9kCnusSTJV882sF qV4Wg8y4Z+LoE53MW4LTTLPtW//e5XOsIzstAL81VXQJSdhJWBp/kjbmUZIO8yZ9 HE0XvMnsQybQv0FfQKlERPSZ51eHnlAfV1SoPv10Yy+xUGUJ5lhCLkMaTLTwJUdZ +gQek9QmRkpQgbLevni3/GcV4clXhB4PY9bpYrrWX1Uu6lzGKAgEJTm4Diup8kyX HAc/DVL17e8vgg8CAwEAAaOB9DCB8TAfBgNVHSMEGDAWgBStvZh6NLQm9/rEJlTv A73gJMtUGjAdBgNVHQ4EFgQUU3m/WqorSs9UgOHYm8Cd8rIDZsswDgYDVR0PAQH/ BAQDAgGGMA8GA1UdEwEB/wQFMAMBAf8wEQYDVR0gBAowCDAGBgRVHSAAMEQGA1Ud HwQ9MDswOaA3oDWGM2h0dHA6Ly9jcmwudXNlcnRydXN0LmNvbS9BZGRUcnVzdEV4 dGVybmFsQ0FSb290LmNybDA1BggrBgEFBQcBAQQpMCcwJQYIKwYBBQUHMAGGGWh0 dHA6Ly9vY3NwLnVzZXJ0cnVzdC5jb20wDQYJKoZIhvcNAQEMBQADggEBAJNl9jeD lQ9ew4IcH9Z35zyKwKoJ8OkLJvHgwmp1ocd5yblSYMgpEg7wrQPWCcR23+WmgZWn RtqCV6mVksW2jwMibDN3wXsyF24HzloUQToFJBv2FAY7qCUkDrvMKnXduXBBP3zQ YzYhBx9G/2CkkeFnvN4ffhkUyWNnkepnB2u0j4vAbkN9w6GAbLIevFOFfdyQoaS8 Le9Gclc1Bb+7RrtubTeZtv8jkpHGbkD4jylW6l/VXxRTrPBPYer3IsynVgviuDQf Jtl7GQVoP7o81DgGotPmjw7jtHFtQELFhLRAlSv0ZaBIefYdgWOWnU914Ph85I6p 0fKtirOMxyHNwu8= -----END CERTIFICATE-----
-
Si al completar el certificado, aparece el siguiente mensaje de error, entonces el sistema está afectado por el segundo problema:
)
3. Cómo resolver fallo de validación local del certificado
En el caso de que al completar el certificado obtengamos un error similar al siguiente:
>> openssl verify -verbose -purpose sslserver -CAfile /pth/to/certificate
...
error 2 at 1 depth lookup: unable to get issuer certificate
Check system default certificates to be installed and accepted. In Debian/Ubuntu systems this includes installing and accepting ca-certificates package.
Este problema, como hemos indicado al principio, es debido a que no está presente un certificado raíz que completaría la cadena de este certificado. El certificado que falta se puede descargar desde:
https://support.sectigo.com/Com_KnowledgeDetailPage?Id=kA01N000000rfBO
En nuestro caso, hemos dejado una copia de este certificado público en la siguiente ruta:
http://www.aspl.es/downloads/USERTrustRSA-AAACA-xSign.crt
-
En caso de que el sistema afectado sea una debian, ejecuta los siguientes pasos:
>> cd /usr/share/ca-certificates/mozilla/ >> wget http://www.aspl.es/downloads/USERTrustRSA-AAACA-xSign.crt >> dpkg-reconfigure ca-certificates
-
A continuación aceptar la selección de certificado:
…después confirmamos certificado instalado:
-
Una vez llegados a este punto, intentar completar el certificado como se ha indicado en la sección anterior.
4. Cómo resolver el problema en el lado cliente
No es recomendable. Lo ideal es corregir la instalación del certificado en el lado servidor. Sin embargo, si por algún motivo no puedes contar con esta resolución en el lado servidor, puedes modificar tu cliente para que no haga verificación. A continuación algunos ejemplos:
- Para CakePHP, usar ssl_peer_verify = false:
$HttpSocket = new HttpSocket(array('ssl_verify_peer' => false, 'ssl_verify_host' => false));