Certificado Self-Signed en Nexus Y Como Usarlo en Docker
Llevo missing tiempo, pero es que ha pasado mucho! Y este post es una muestra de ello.
Ultimamente estamos metiendo todo en contenedores, migrando todo lo que corria en VMs y
la verdad que me he encontradados como para agregar rootCA, puesto que lo que vamos a hacer, es agregar este rootCA del nexus como un CA.o con varios problemas, este es uno de ellos:Error response from daemon: Get https://nexus.evil.company:18444/v2/: x509: certificate signed by unknown authority
Y este tiene miga, porque los servers usan CentOS y nuestros equipos Ubuntu, asi que todo lo que tenemos en #Ansible scripteado, no vale. Ya ni que decir de Mac.
Asi es como lo he solucionado en Ubuntu/Debian
Segun varios post, muchos inciden en que este problema viene por usar certificados auto-firmados. Lo cual si bien es cierto, tambien puede ser ( como es nuestro caso ) que tengas tu propio CA para tus certificados y que seas su un root CA de un monton de cosas. Si tienes que estar comprando certificados para esto, te puedes arruinar.
Solucion, agrega tu CA como root y ya puedes hacer lo que te de la gana.
En este caso, el Nexus corre con un autofirmado, pero es igual. Puedes usar este tutorial para autofirmados como para agregar rootCA, puesto que lo que vamos a hacer, es agregar este certificado del nexus como un CA.
Valida que estas teniendo este problema
Ejecutadopenssl s_client -showcerts -connect nexus.evil.company:18444
Os tendra que salir alguna linea donde pongaself signed certificate
Ejemplo:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45CONNECTED(00000003)
depth=0 C = ES, ST = Unspecified, L = Unspecified, O = evilcorp, CN = nexus.evil.company
verify return:1
Certificate chain
0 s:/C=ES/ST=Unspecified/L=Unspecified/O=evil/CN=nexus.evil.company
i:/C=ES/ST=Unspecified/L=Unspecified/O=evil/CN=nexus.evil.company
-----BEGIN CERTIFICATE-----
REDACTADO
-----END CERTIFICATE-----
Server certificate
subject=/C=ES/ST=Unspecified/L=Unspecified/O=evil/CN=nexus.evil.company
issuer=/C=ES/ST=Unspecified/L=Unspecified/O=evil/CN=nexus.evil.company
No client certificate CA names sent
Peer signing digest: SHA512
Server Temp Key: ECDH, P-256, 256 bits
SSL handshake has read 1491 bytes and written 358 bytes
Verification: OK
New, TLSv1.2, Cipher is ECDHE-RSA-AES256-SHA384
Server public key is 2048 bit
Secure Renegotiation IS supported
Compression: NONE
Expansion: NONE
No ALPN negotiated
SSL-Session:
Protocol : TLSv1.2
Cipher : ECDHE-RSA-AES256-SHA384
Session-ID: REDACTADO
Session-ID-ctx:
Master-Key: REDACTADO
PSK identity: None
PSK identity hint: None
SRP username: None
Start Time: 1557921550
Timeout : 7200 (sec)
Verify return code: 18 (self signed certificate)
Extended master secret: no
closedCopiamos / copiamos el certificado y cambiamos de PEM (en nuestro caso ) a CRT. Si no, no lo pilla
mv /tmp/nexus.evil.company.pem /usr/local/share/ca-certificates/nexus.evil.company.crt
- Recargamos los ca-trusts
update-ca-certificates
- Aqui puede ser que os salga este error:
keytool error: java.io.IOException: Illegal header: -----BEGIN CERTIFICATE----
En mi caso, era que al final tenia 4 dash-
en vez de los 5. Pero puede ser espacios tambien. Mirad a ver si se ha creado el simlink por casualidad en
/etc/ssl/certs
y eliminarlo conunlink
antes de volver a intentarlo1
2
3lrwxrwxrwx 1 root root 62 may 15 13:24 nexus.evil.company.pem -> /usr/local/share/ca-certificates/nexus.evil.company.crt
-rw-r--r-- 1 root root 208780 may 15 13:24 ca-certificates.crt
lrwxrwxrwx 1 root root 29 may 15 13:24 d1b64eb2.0 -> nexus.evil.company.pemEjecutad el
update-ca-certificates
hasta que veais que lo agrega y nos os da error1
2Updating certificates in /etc/ssl/certs... 2 added, 0 removed; done.
Running hooks in /etc/ca-certificates/update.d....done.Volved a probar con
openssl
>openssl s_client -showcerts -connect nexus.evil.company:18444
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45CONNECTED(00000003)
depth=0 C = ES, ST = Unspecified, L = Unspecified, O = knockout, CN = nexus.evil.company
verify return:1
Certificate chain
0 s:/C=ES/ST=Unspecified/L=Unspecified/O=evil/CN=nexus.evil.company
i:/C=ES/ST=Unspecified/L=Unspecified/O=evil/CN=nexus.evil.company
-----BEGIN CERTIFICATE-----
REDACTADO
-----END CERTIFICATE-----
Server certificate
subject=/C=ES/ST=Unspecified/L=Unspecified/O=evil/CN=nexus.evil.company
issuer=/C=ES/ST=Unspecified/L=Unspecified/O=evil/CN=nexus.evil.company
No client certificate CA names sent
Peer signing digest: SHA512
Server Temp Key: ECDH, P-256, 256 bits
SSL handshake has read 1491 bytes and written 358 bytes
Verification: OK
New, TLSv1.2, Cipher is ECDHE-RSA-AES256-SHA384
Server public key is 2048 bit
Secure Renegotiation IS supported
Compression: NONE
Expansion: NONE
No ALPN negotiated
SSL-Session:
Protocol : TLSv1.2
Cipher : ECDHE-RSA-AES256-SHA384
Session-ID: REDACTADO
Session-ID-ctx:
Master-Key: REDACTADO
PSK identity: None
PSK identity hint: None
SRP username: None
Start Time: 1557921550
Timeout : 7200 (sec)
Verify return code: 0 (ok)
Extended master secret: no
closedAhora podeis hacer el
docker login
y luego el push/pull de las imagenes del registry de nexus1
2
3
4
5
6
7root@neurona:~# docker login -u LOGIN -p PASSWORD nexus.evil.company:18444
WARNING! Using --password via the CLI is insecure. Use --password-stdin.
WARNING! Your password will be stored unencrypted in /home/nico/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store
Login Succeeded
Saludos!