@@ -9,42 +9,36 @@ Al no tener un servicio público de verificación, el SAT comparte sus certifica
99Para ello necesitaremos de ` openssl ` . El procedimiento general consiste en:
1010
11111 . Descargar los certificados raíz de producción
12- 1 . Convertir los certificados DER en PEM
13- 1 . Adaptar la carpeta para reconocerla como un directorio de Certificate Authority (CA)
14- 1 . Comparar el certificado PEM contra los certificados raíz.
12+ 2 . Convertir los certificados DER en PEM
13+ 3 . Adaptar la carpeta para reconocerla como un directorio de Certificate Authority (CA)
14+ 4 . Comparar el certificado PEM contra los certificados raíz.
1515
1616Lo mejor sería que el SAT tuviera un servicio público de consulta de certificados, incluso saber si un
1717certificado ha sido revocado, el problema es que sí tienen el servicio, pero está restringido a agencias
1818gubernamentales < https://www.gob.mx/cms/uploads/attachment/file/36607/ANEXO-UNICO_Req-de-uso-de-OCSP.pdf >
1919
20- ## Verificación de certificado
20+ ## Verificación local de certificado
2121
2222Con el siguiente comando se hace la verificación de un certificado
2323
2424``` shell
25- openssl verify -no_check_time -CApath sat_ca_prod - mi_certificado.pem
25+ openssl verify -no_check_time -CApath sat_ca_prod mi_certificado.pem
2626```
2727
2828Donde:
2929
3030- ` -no_check_time ` : No verificar que los certificados raíz sean válidos en el tiempo.
3131- ` -CAPath sat_ca_prod ` : Lugar en donde están los certificados raíz ya procesados.
32- - ` - mi_certificado.pem` : Certificado en formato PEM a validar
32+ - ` mi_certificado.pem ` : Certificado en formato PEM a validar
3333
3434## Creación de la carpeta de certificados raíz
3535
3636Una vez que tengas los archivos raíz descomprimidos puedes ejecutar estos comandos para que la carpeta sea
37- usable para el comando ` openssl verify ` .
37+ usable para el comando ` openssl verify ` o ` openssl ocsp ` .
3838
3939* Exportar en formato PEM los certificados que no están como tal:
4040
41- Para cada archivo ` .cer ` en el directorio ` sat_ca_prod ` ejecuta ` openssl ` para exportar de formato PEM a DER.
42-
43- ``` shell
44- find sat_ca_prod/ -type f -maxdepth 0 -name " *.cer" -exec \
45- openssl x509 -inform DER -outform PEM -in " {}" -out " {}.pem" \
46- \;
47- ```
41+ Para cada archivo ` .cer ` o ` .crt ` en el directorio ` sat_ca_prod ` ejecuta ` openssl ` para exportar de formato DER a PEM.
4842
4943* Crear enlaces simbólicos a los archivos por el número de hash
5044
@@ -55,36 +49,120 @@ los archivos por número de hash, si no están así entonces no se tomarán en c
5549openssl rehash sat_ca_prod
5650```
5751
58- ## Script para crear toda la estructura de producción y pruebas
52+ ### Script para crear toda la estructura de producción y pruebas
5953
6054El siguiente script básico de bash ejecuta todos los comandos que se requieren para descargar, exportar y poder
6155utilizar como ` CApath ` los certificados raíz ofrecidos por el SAT:
6256
6357``` bash
6458#! /bin/bash -e
6559
66- CA_PROD_SOURCE=" https ://omawww.sat.gob.mx/tramitesyservicios/Paginas/documentos/Cert_Prod.zip"
60+ CA_PROD_SOURCE=" http ://omawww.sat.gob.mx/tramitesyservicios/Paginas/documentos/Cert_Prod.zip"
6761CA_PROD_DEST=" ca_production"
68- CA_TEST_SOURCE=" https ://omawww.sat.gob.mx/tramitesyservicios/Paginas/documentos/Certificados_P.zip"
62+ CA_TEST_SOURCE=" http ://omawww.sat.gob.mx/tramitesyservicios/Paginas/documentos/Certificados_P.zip"
6963CA_TEST_DEST=" ca_testing"
7064
71- function extract () {
65+ function extract_certificates () {
7266 local url=" $1 "
7367 local source=" $( basename " $url " ) "
68+ local extractto=" ${source% .* } "
7469 local ca_folder=" $2 "
7570 rm -f " $source "
7671 wget " $url " -O " $source "
77- rm -rf $ca_folder
78- mkdir -p " $ca_folder "
79- unzip " $source " -d " $ca_folder "
80- find . -type f -name " *.cer" -exec openssl x509 -inform DER -outform PEM -in " {}" -out " {}.pem" \;
81- find " $ca_folder " -type d -exec openssl rehash " {}" \;
72+ rm -rf " $ca_folder " " $extractto "
73+ mkdir -p " $ca_folder " " $extractto "
74+ unzip " $source " -d " $extractto "
75+
76+ find " $extractto " -type f \( -name " *.cer" -o -name " *.crt" \) | while read certificate; do
77+ rename_or_convert_certificate " $certificate " " $ca_folder "
78+ done
79+ rm -rf " $extractto "
80+
81+ openssl rehash " $ca_folder "
82+ }
83+
84+ function rename_or_convert_certificate {
85+ local source=" $1 "
86+ local sourcebasename=" $( basename " $source " ) "
87+ local destination=" $2 /${sourcebasename% .* } .pem"
88+ if [ " text/plain" == " $( file " $source " -b --mime-type) " ]; then
89+ echo " Copy $source -> $destination "
90+ cp " $source " " $destination "
91+ return ;
92+ fi
93+ echo " Convert $source -> $destination "
94+ openssl x509 -inform DER -outform PEM -in " $source " -out " $destination "
8295}
8396
84- extract " $CA_PROD_SOURCE " " $CA_PROD_DEST "
85- extract " $CA_TEST_SOURCE " " $CA_TEST_DEST "
97+ extract_certificates " $CA_PROD_SOURCE " " $CA_PROD_DEST "
98+ extract_certificates " $CA_TEST_SOURCE " " $CA_TEST_DEST "
99+ ```
100+
101+ ## Verificación a través de OCSP
102+
103+ A pesar de que el SAT anuncia que su servicio OCSP es privado, en realidad sí se encuentra públicamente disponible.
104+
105+ El siguiente comando sirve para verificar un certificado (FIEL o CSD) emitido por el SAT.
106+
107+ ``` shell
108+ OPENSSL_CONF=/etc/ssl/openssl_custom.cnf \
109+ openssl ocsp -issuer ca_production/AC4_SAT.cer.pem -cert certificate.cer \
110+ -text -CApath ca_production -url https://cfdi.sat.gob.mx/edofiel
111+ ```
112+
113+ Y entrega una respuesta como:
114+
115+ ``` text
116+ Response verify OK
117+ certificate.cer: revoked
118+ This Update: May 23 14:44:07 2023 GMT
119+ Next Update: May 23 14:45:07 2023 GMT
120+ Reason: unspecified
121+ Revocation Time: May 18 19:02:47 2023 GMT
122+ ```
123+
124+ ### ` OPENSSL_CONF=/etc/ssl/openssl_custom.cnf `
125+
126+ El sitio del SAT no tiene la seguridad adecuada y las nuevas versiones de OpenSSL 3.x no permiten hacer la consulta.
127+
128+ En 2023-05-23 se encontró que utilizaba ` TLSv1.2, Cipher is DHE-RSA-AES256-GCM-SHA384 ... Server Temp Key: DH, 1024 bits `
129+ y no es considerado seguro en el nivel 2 de OpenSSL:
130+ * RSA, DSA and DH keys shorter than 2048 bits and ECC keys shorter than 224 bits are prohibited* .
131+
132+ Por lo que hay que degradar la configuración a ` SECLEVEL=1 ` , generalmente agregando la siguiente información:
133+
134+ ``` ini
135+ [openssl_init]
136+ ssl_conf = ssl_sect
137+
138+ [ssl_sect]
139+ system_default = system_default_sect
140+
141+ [system_default_sect]
142+ CipherString = DEFAULT@SECLEVEL =1
143+ ```
144+
145+ ### ` -issuer ca_production/AC4_SAT.cer.pem `
146+
147+ El certificado padre del SAT, si se está usando el certificado incorrecto el comando fallará y
148+ mostrará un mensaje de error como este:
149+
150+ ``` text
151+ Responder Error: trylater (3)
86152```
87153
154+ ### ` -cert certificate.cer `
155+
156+ El certificado que se desea revisar, no es necesario convertirlo a formato PEM.
157+
158+ ### ` -url https://cfdi.sat.gob.mx/edofiel `
159+
160+ Dirección del servicio OSCP del SAT.
161+
162+ ### ` -CApath ca_production `
163+
164+ Dirección donde están los certificados de confianza del SAT.
165+
88166## Verificación de certificados a través de la página del Gobierno de Colima
89167
90168El Gobierno de Colima expone una API JSON en < https://apisnet.col.gob.mx/wsSignGob > que sirve para el propósito
0 commit comments