Skip to content

Commit fcb7add

Browse files
authored
Merge pull request #5 from eclipxe13/master
Version 1.1.0
2 parents fc920c5 + d7561fa commit fcb7add

22 files changed

+256
-82
lines changed

.gitattributes

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,17 +3,14 @@
33

44
# Do not put this files on a distribution package (by .gitignore)
55
/vendor export-ignore
6-
/build export-ignore
76
/composer.lock export-ignore
8-
.phpunit.result.cache export-ignore
97

108
# Do not put this files on a distribution package
11-
/docs/ export-ignore
9+
/build/ export-ignore
1210
/tests/ export-ignore
1311
/.gitattributes export-ignore
1412
/.gitignore export-ignore
1513
/.php_cs.dist export-ignore
16-
/.phplint.yml export-ignore
1714
/.scrutinizer.yml export-ignore
1815
/.travis.yml export-ignore
1916
/phpcs.xml.dist export-ignore

.gitignore

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,3 @@
11
# do not include this files on git
22
/vendor
3-
/build
43
/composer.lock
5-
.phpunit.result.cache

.phplint.yml

Lines changed: 0 additions & 11 deletions
This file was deleted.

.travis.yml

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,10 @@ matrix:
77
allow_failures:
88
- php: "7.4snapshot"
99

10-
# This triggers builds to run on the new TravisCI infrastructure.
11-
# See: http://docs.travis-ci.com/user/workers/container-based-infrastructure/
12-
sudo: false
10+
env:
11+
global:
12+
- PHP_CS_FIXER_FUTURE_MODE=1
13+
- PHP_CS_FIXER_IGNORE_ENV=1
1314

1415
cache:
1516
- directories:
@@ -18,10 +19,8 @@ cache:
1819
before_script:
1920
- phpenv config-rm xdebug.ini || true
2021
- travis_retry composer install --no-interaction --prefer-dist
21-
- mkdir -p build
2222

2323
script:
24-
- vendor/bin/phplint
2524
- vendor/bin/php-cs-fixer fix --verbose
2625
- vendor/bin/phpcbf --colors -sp src/ tests/
2726
- vendor/bin/phpunit --testdox --verbose

CONTRIBUTING.md

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,6 @@ If any of these do not pass, it will result in a complete build failure.
7575
Before you can run these, be sure to `composer install` or `composer update`.
7676

7777
```shell
78-
vendor/bin/parallel-lint src/ tests/
7978
vendor/bin/phpcs -sp src/ tests/
8079
vendor/bin/php-cs-fixer fix -v --dry-run
8180
vendor/bin/phpunit --coverage-text

README.md

Lines changed: 63 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -18,10 +18,10 @@ Esta librería ha sido creada para poder trabajar con los archivos CSD y FIEL de
1818
se simplifica el proceso de firmar, verificar firma y obtener datos particulares del archivo de certificado
1919
así como de la llave pública.
2020

21-
* El CSD (Certificado de Sello Digital) es utilizado para firmar Comprobantes Fiscales Digitales.
21+
- El CSD (Certificado de Sello Digital) es utilizado para firmar Comprobantes Fiscales Digitales.
2222

23-
* La FIEL (o eFirma) es utilizada para firmar electrónicamente documentos (generalmente usando XML-SEC) y
24-
está reconocida por el gobierno mexicano como una manera de firma legal de una persona física o moral.
23+
- La FIEL (o eFirma) es utilizada para firmar electrónicamente documentos (generalmente usando XML-SEC) y
24+
está reconocida por el gobierno mexicano como una manera de firma legal de una persona física o moral.
2525

2626

2727
## Instalación
@@ -38,8 +38,8 @@ composer require phpcfdi/credentials
3838
```php
3939
<?php declare(strict_types=1);
4040

41-
$cerFile = 'fiel/certificado.cer'; // PEM o DER
42-
$pemKeyFile = 'fiel/privatekey.pem'; // en formato PEM
41+
$cerFile = 'fiel/certificado.cer';
42+
$pemKeyFile = 'fiel/privatekey.key';
4343
$passPhrase = '12345678a'; // contraseña para abrir la llave privada
4444

4545
$fiel = PhpCfdi\Credentials\Credential::openFiles($cerFile, $pemKeyFile, $passPhrase);
@@ -63,10 +63,66 @@ echo $certificado->serialNumber()->bytes(), PHP_EOL; // número de serie del cer
6363
```
6464

6565

66+
## Acerca de los archivos de certificado y llave privada
67+
68+
Los archivos de certificado vienen en formato `X.509 DER` y los de llave privada en formato `PKCS#8 DER`.
69+
Ambos formatos no se pueden interpretar directamente en PHP (con `ext-openssl`), sin embargo sí lo pueden hacer
70+
en el formatos compatible [`PEM`](https://en.wikipedia.org/wiki/Privacy-Enhanced_Mail).
71+
72+
Esta librería tiene la capacidad de hacer esta conversión internamente (sin `openssl`), pues solo consiste en codificar
73+
a `base64`, en renglones de 64 caracteres y con cabeceras específicas para certificado y llave privada.
74+
75+
De esta forma, para usar el certificado `AAA010101AAA.cer` o la llave privada `AAA010101AAA.key` provistos por
76+
el SAT, no es necesario convertirlos con `openssl` y la librería los detectará correctamente.
77+
78+
79+
### Crear un objeto de certificado `Certificate`
80+
81+
El objeto `Certificate` no se creará si contiene datos no válidos.
82+
83+
El SAT entrega el certificado en formato `X.509 DER`, por lo que internamente se puede convertir a `X.509 PEM`.
84+
También es frecuente usar el formato `X.509 DER base64`, por ejemplo, en el atributo `Comprobante@Certificado`
85+
o en las firmas XML, por este motivo, los formatos soportados para crear un objeto `Certificate` son
86+
`X.509 DER`, `X.509 DER base64` y `X.509 PEM`.
87+
88+
- Para abrir usando un archivo local: `$certificate = Certificate::openFile($filename);`
89+
- Para abrir usando una cadena de caracteres: `$certificate = new Certificate($content);`
90+
- Si `$content` es un certificado en formato `X.509 PEM` con cabeceras ese se utiliza.
91+
- Si `$content` está totalmente en `base64`, se interpreta como `X.509 DER base64` y se formatea a `X.509 PEM`
92+
- En otro caso, se interpreta como formato `X.509 DER`, por lo que se formatea a `X.509 PEM`.
93+
94+
95+
### Crear un objeto de llave privada `PrivateKey`
96+
97+
El objeto `PrivateKey` no se creará si contiene datos no válidos.
98+
99+
En SAT entrega la llave en formato `PKCS#8 DER`, por lo que internamente se puede convertir a `PKCS#8 PEM`
100+
(con la misma contraseña) y usarla desde PHP.
101+
102+
Una vez abierta la llave también se puede cambiar o eliminar la contraseña, creando así un nuevo objeto `PrivateKey`.
103+
104+
- Para abrir usando un archivo local: `$key = PrivateKey::openFile($filename, $passPhrase);`
105+
- Para abrir usando una cadena de caracteres: `$key = new PrivateKey($content, $passPhrase);`
106+
- Si `$content` es una llave privada en formato `PEM` (`PKCS#8` o `PKCS#5`) se utiliza.
107+
- En otro caso, se interpreta como formato `PKCS#8 DER`, por lo que se formatea a `PKCS#8 PEM`.
108+
109+
Notas de tratamiento de archivos `DER`:
110+
111+
- Al convertir `PKCS#8 DER` a `PKCS#8 PEM` se determina si es una llave encriptada si se estableció
112+
una contraseña, si no se estableció se tratará como una llave plana (no encriptada).
113+
- No se sabe reconocer de forma automática si se trata de un archivo `PKCS#5 DER` por lo que este
114+
tipo de llave se deben convertir *manualmente* antes de intentar abrirlos, su cabecera es `RSA PRIVATE KEY`.
115+
- A diferencia de los certificados que pueden interpretar un formato `DER base64`, la lectura de llave
116+
privada no hace esta distinción, si desea trabajar con un formato sin caracteres especiales use `PEM`.
117+
118+
Para entender más de los formatos de llaves privadas se puede consultar la siguiente liga:
119+
<https://github.com/kjur/jsrsasign/wiki/Tutorial-for-PKCS5-and-PKCS8-PEM-private-key-formats-differences>
120+
121+
66122
## Compatilibilidad
67123

68124
Esta librería se mantendrá compatible con al menos la versión con
69-
[soporte activo de PHP](http://php.net/supported-versions.php) más reciente.
125+
[soporte activo de PHP](https://www.php.net/supported-versions.php) más reciente.
70126

71127
También utilizamos [Versionado Semántico 2.0.0](https://semver.org/lang/es/) por lo que puedes usar esta librería
72128
sin temor a romper tu aplicación.
@@ -95,7 +151,7 @@ and licensed for use under the MIT License (MIT). Please see [LICENSE][] for mor
95151
[coverage]: https://scrutinizer-ci.com/g/phpcfdi/credentials/code-structure/master/code-coverage/src/
96152
[downloads]: https://packagist.org/packages/phpcfdi/credentials
97153

98-
[badge-source]: http://img.shields.io/badge/source-phpcfdi/credentials-blue?style=flat-square
154+
[badge-source]: https://img.shields.io/badge/source-phpcfdi/credentials-blue?style=flat-square
99155
[badge-release]: https://img.shields.io/github/release/phpcfdi/credentials?style=flat-square
100156
[badge-license]: https://img.shields.io/github/license/phpcfdi/credentials?style=flat-square
101157
[badge-build]: https://img.shields.io/travis/phpcfdi/credentials/master?style=flat-square

build/.gitignore

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
*
2+
!.gitignore

composer.json

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,7 @@
2323
},
2424
"require-dev": {
2525
"ext-json": "*",
26-
"phpunit/phpunit": "^8.0",
27-
"overtrue/phplint": "^1.0",
26+
"phpunit/phpunit": "^8.4",
2827
"squizlabs/php_codesniffer": "^3.0",
2928
"friendsofphp/php-cs-fixer": "^2.4",
3029
"phpstan/phpstan-shim": "^0.11"
@@ -50,7 +49,7 @@
5049
"vendor/bin/phpcbf --colors -sp src/ tests/"
5150
],
5251
"dev:test": [
53-
"vendor/bin/phplint",
52+
"@dev:check-style",
5453
"vendor/bin/phpunit --testdox --verbose --stop-on-failure",
5554
"vendor/bin/phpstan analyse --no-progress --verbose --level max src/ tests/"
5655
],
@@ -62,7 +61,7 @@
6261
"dev:build": "DEV: run dev:fix-style dev:tests and dev:docs, run before pull request",
6362
"dev:check-style": "DEV: search for code style errors using php-cs-fixer and phpcs",
6463
"dev:fix-style": "DEV: fix code style errors using php-cs-fixer and phpcbf",
65-
"dev:test": "DEV: run phplint, phpunit and phpstan",
64+
"dev:test": "DEV: dev:check-style, phpunit and phpstan",
6665
"dev:coverage": "DEV: run phpunit with xdebug and storage coverage in build/coverage/html/"
6766
}
6867
}

docs/CHANGELOG.md

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,16 @@
66

77
Nos apegamos a [SEMVER](SEMVER.md), revisa la información para entender mejor el control de versiones.
88

9+
## Version 1.1.0 2019-11-19
10+
11+
- Se puede crear una llave privada en formato `PKCS#8 DER` encriptada o desprotegida.
12+
Con este cambio se pueden leer las llaves tal y como las envía el SAT. Gracias @eislasq.
13+
- Si la llave privada no estaba en formato `PEM` se hace una conversión de `PKCS#8 DER` a `PKCS#8 PEM`.
14+
- Se agrega el método `PrivateKey::changePassPhrase` que devuelve una llave privada con la nueva contraseña.
15+
- Se documenta la apertida de certificados y llaves privadas en diferentes formatos.
16+
- Se limpia el entorno de desarrollo y se publica en el paquete distribuible la carpeta de documentación.
17+
- Se hacen refactorizaciones menores para un mejor uso de memoria y rendimiento.
18+
919
## Version 1.0.1 2019-09-18
1020

1121
- Agregar métodos a `PrivateKey` para poder exponer la llave privada en formato PEM y la frase de paso.

docs/TODO.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,3 +6,5 @@
66

77
- [ ] Verificar si un certificado fue realmente emitido por el SAT
88
Ver [VerificacionCertificadosSAT](VerificacionCertificadosSAT.md)
9+
10+
- [ ] Usar excepciones específicas en lugar de genéricas

0 commit comments

Comments
 (0)