Skip to content

Commit f1d8fa6

Browse files
authored
Merge pull request #18 from eclipxe13/maintenance-20230524
Mantenimiento 2023-05-24 (Version 1.2.1)
2 parents 263de44 + 1b87a13 commit f1d8fa6

File tree

4 files changed

+116
-29
lines changed

4 files changed

+116
-29
lines changed

.phive/phars.xml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
<?xml version="1.0" encoding="UTF-8"?>
22
<phive xmlns="https://phar.io/phive">
3-
<phar name="php-cs-fixer" version="^3.14.4" installed="3.14.4" location="./tools/php-cs-fixer" copy="false"/>
3+
<phar name="php-cs-fixer" version="^3.17.0" installed="3.17.0" location="./tools/php-cs-fixer" copy="false"/>
44
<phar name="phpcs" version="^3.7.2" installed="3.7.2" location="./tools/phpcs" copy="false"/>
55
<phar name="phpcbf" version="^3.7.2" installed="3.7.2" location="./tools/phpcbf" copy="false"/>
6-
<phar name="phpstan" version="^1.10.2" installed="1.10.2" location="./tools/phpstan" copy="false"/>
7-
<phar name="composer-normalize" version="^2.29.0" installed="2.29.0" location="./tools/composer-normalize" copy="false"/>
6+
<phar name="phpstan" version="^1.10.15" installed="1.10.15" location="./tools/phpstan" copy="false"/>
7+
<phar name="composer-normalize" version="^2.31.0" installed="2.31.0" location="./tools/composer-normalize" copy="false"/>
88
</phive>

docs/CHANGELOG.md

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,15 @@ versión, aunque sí su incorporación en la rama principal de trabajo. Generalm
1111

1212
## Listado de cambios
1313

14+
### Versión 1.2.1 2023-05-24
15+
16+
PHPStan detectó un uso inapropiado de conversión de objeto a cadena de caracteres.
17+
Esta conversión es innecesaria, por lo que se eliminó.
18+
19+
Se agregó información básica de cómo verificar un certificado emitido por el SAT usando OCSP.
20+
21+
Se actualizaron las herramientas de desarrollo.
22+
1423
### Versión 1.2.0 2023-02-24
1524

1625
Se agrega la funcionalidad para exportar (`PfxExporter`) y leer (`PfxReader`) una credencial con formato PKCS#12 (PFX).

docs/VerificacionCertificadosSAT.md

Lines changed: 103 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -9,42 +9,36 @@ Al no tener un servicio público de verificación, el SAT comparte sus certifica
99
Para ello necesitaremos de `openssl`. El procedimiento general consiste en:
1010

1111
1. 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

1616
Lo mejor sería que el SAT tuviera un servicio público de consulta de certificados, incluso saber si un
1717
certificado ha sido revocado, el problema es que sí tienen el servicio, pero está restringido a agencias
1818
gubernamentales <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

2222
Con 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

2828
Donde:
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

3636
Una 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
5549
openssl 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

6054
El siguiente script básico de bash ejecuta todos los comandos que se requieren para descargar, exportar y poder
6155
utilizar 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"
6761
CA_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"
6963
CA_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

90168
El Gobierno de Colima expone una API JSON en <https://apisnet.col.gob.mx/wsSignGob> que sirve para el propósito

src/Internal/DataArrayTrait.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ protected function extractArrayStrings(string $key): array
5454
{
5555
$array = [];
5656
foreach ($this->extractArray($key) as $name => $value) {
57-
if (is_scalar($value) || is_object($value)) {
57+
if (is_scalar($value)) {
5858
$array[$name] = strval($value);
5959
}
6060
}

0 commit comments

Comments
 (0)