tl; dr fijo
He estado ejecutando una instancia de Jenkins por un tiempo con un certificado autofirmado, que funciona bien, excepto la molestia de tener que crear excepciones de validación de certificados en los navegadores. Así que hoy recibí un certificado de nivel 1 gratuito de StartSSL , cambié la ruta /etc/sysconfig/jenkins
y reinicié el servicio, pero no funciona en absoluto:
$ openssl s_client -connect localhost:8080 -debug
CONNECTED(00000003)
write to 0xdce210 [0xdeeca0] (171 bytes => 171 (0xAB))
0000 - 16 03 01 00 a6 01 00 00-a2 03 03 52 e3 f5 18 90 ...........R....
0010 - e2 24 10 6a 6e ee 24 88-cd 52 e8 a8 0b 6f 71 85 .$.jn.$..R...oq.
0020 - 3f 5b a1 53 7b 2c 74 fe-a2 68 25 00 00 54 00 a3 ?[.S{,t..h%..T..
0030 - 00 9f 00 6b 00 6a 00 39-00 38 00 88 00 87 00 9d ...k.j.9.8......
0040 - 00 3d 00 35 00 84 00 16-00 13 00 0a 00 a2 00 9e .=.5............
0050 - 00 67 00 40 00 33 00 32-00 9a 00 99 00 45 00 44 .g.@.3.2.....E.D
0060 - 00 9c 00 3c 00 2f 00 96-00 41 00 07 00 05 00 04 ...<./...A......
0070 - 00 15 00 12 00 09 00 14-00 11 00 08 00 06 00 03 ................
0080 - 00 ff 01 00 00 25 00 23-00 00 00 0d 00 18 00 16 .....%.#........
0090 - 06 01 06 02 05 01 05 02-04 01 04 02 03 01 03 02 ................
00a0 - 02 01 02 02 01 01 00 0f-00 01 01 ...........
read from 0xdce210 [0xdf4200] (7 bytes => 0 (0x0))
140506493065056:error:140790E5:SSL routines:SSL23_WRITE:ssl handshake failure:s23_lib.c:177:
---
no peer certificate available
---
No client certificate CA names sent
---
SSL handshake has read 0 bytes and written 171 bytes
---
New, (NONE), Cipher is (NONE)
Secure Renegotiation IS NOT supported
Compression: NONE
Expansion: NONE
---
No hay indicación de errores en /var/log/jenkins/jenkins.log
o /var/log/messages
.
openssl
parece pensar que mi certificado es legítimo:
openssl x509 -in jenkins.crt.pem -text -noout
Certificate:
Data:
Version: 3 (0x2)
Serial Number: 925667 (0xe1fe3)
Signature Algorithm: sha1WithRSAEncryption
Issuer: C=IL, O=StartCom Ltd., OU=Secure Digital Certificate Signing, CN=StartCom Class 1 Primary Intermediate Server CA
Validity
Not Before: Jan 24 16:19:28 2014 GMT
Not After : Jan 25 15:09:34 2015 GMT
[...]
Después de ponerlo en un archivo Java KeyStore, todavía parece ser válido (anonimizado el FQDN):
$ keytool -list -keystore jenkins.jks
Enter keystore password:
Keystore type: JKS
Keystore provider: SUN
Your keystore contains 1 entry
jenkins_domain_tld, Jan 25, 2014, trustedCertEntry,
Certificate fingerprint (MD5): 3D:6A:AB:83:0B:E8:21:DF:C3:17:E9:88:AD:19:24:EE
El antiguo almacén de claves de certificado autofirmado no es muy diferente:
$ keytool -list -keystore jenkins.jks.old
Enter keystore password:
Keystore type: JKS
Keystore provider: SUN
Your keystore contains 1 entry
jenkins_domain_tld, Jan 11, 2014, PrivateKeyEntry,
Certificate fingerprint (MD5): A6:4E:F6:E8:56:D1:30:5E:11:63:59:C0:AA:24:B2:4F
Intenté usar el certificado directamente con JENKINS_ARGS="--httpsCertificate=/var/lib/jenkins/jenkins.crt.pem --httpsPrivateKey=/var/lib/jenkins/jenkins.key.pem"
, pero Jenkins no comenzó en absoluto:
Jan 25, 2014 5:22:47 PM winstone.Logger logInternal
SEVERE: Container startup failed
java.io.IOException: Failed to start a listener: winstone.HttpsConnectorFactory
at winstone.Launcher.spawnListener(Launcher.java:209)
at winstone.Launcher.<init>(Launcher.java:149)
at winstone.Launcher.main(Launcher.java:354)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:622)
at Main._main(Main.java:293)
at Main.main(Main.java:98)
Caused by: java.io.IOException: DerValue.getBigInteger, not an int 48
at sun.security.util.DerValue.getBigInteger(DerValue.java:508)
at winstone.HttpsConnectorFactory.readPEMRSAPrivateKey(HttpsConnectorFactory.java:171)
at winstone.HttpsConnectorFactory.start(HttpsConnectorFactory.java:90)
at winstone.Launcher.spawnListener(Launcher.java:207)
... 8 more
Después de instalar los certificados intermedios:
$ keytool -list -keystore jenkins.jks
Enter keystore password:
Keystore type: JKS
Keystore provider: SUN
Your keystore contains 3 entries
sub.class1.server.ca, Jan 25, 2014, trustedCertEntry,
Certificate fingerprint (MD5): 30:B0:5A:F7:B2:F4:BE:0C:28:67:15:EA:CC:5B:24:20
ca, Jan 25, 2014, trustedCertEntry,
Certificate fingerprint (MD5): 22:4D:8F:8A:FC:F7:35:C2:BB:57:34:90:7B:8B:22:16
jenkins_domain_tld, Jan 25, 2014, trustedCertEntry,
Certificate fingerprint (MD5): 3D:6A:AB:83:0B:E8:21:DF:C3:17:E9:88:AD:19:24:EE
Versión de Java:
java version "1.7.0_51"
OpenJDK Runtime Environment (IcedTea 2.4.4) (ArchLinux build 7.u51_2.4.4-1-x86_64)
OpenJDK 64-Bit Server VM (build 24.45-b08, mixed mode)
Eso no pareció cambiar nada.
La configuración JENKINS_DEBUG_LEVEL="99"
no produjo ninguna línea de registro relevante por lo que puedo decir.
Creo que la CSR anterior se generó con 2048 bits y la nueva con 4096 : ¿es esa una posible causa?
Ambas claves públicas son 2048 bits RSA.
Según diff -u <(openssl x509 -in jenkins.crt.pem.old -text) <(openssl x509 -in jenkins.crt.pem -text)
el antiguo certificado utilizado, sha256WithRSAEncryption
mientras que el nuevo utiliza el sha1WithRSAEncryption
algoritmo de firma.
¿Es el alias importante? ¿Jenkins no admite claves de más de 2048 bits? ¿Jenkins / OpenJDK / Amazon Linux no funciona con algunas teclas?
¿Qué más debo consultar?