tl; dr Fixed
Estou executando uma instância do Jenkins há um tempo com um certificado autoassinado, que funciona bem, exceto pelo incômodo de ter que criar exceções de validação de certificado nos navegadores. Hoje, recebi um certificado de camada 1 gratuito do StartSSL , alterei o caminho /etc/sysconfig/jenkins
e reiniciei o serviço, mas ele não funciona:
$ 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
---
Não há indicação de erros em /var/log/jenkins/jenkins.log
ou /var/log/messages
.
openssl
parece achar que meu certificado é 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
[...]
Depois de colocá-lo em um arquivo Java KeyStore, ele ainda parece válido (anonimizou o 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
O antigo armazenamento de chaves de certificado autoassinado não é muito 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
Tentei usar o certificado diretamente com JENKINS_ARGS="--httpsCertificate=/var/lib/jenkins/jenkins.crt.pem --httpsPrivateKey=/var/lib/jenkins/jenkins.key.pem"
, mas Jenkins não iria começar:
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
Depois de instalar os certificados intermediários:
$ 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
Versão 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)
Isso não pareceu mudar nada.
A configuração JENKINS_DEBUG_LEVEL="99"
não produziu nenhuma linha de log relevante, até onde eu sei.
Acredito que o antigo CSR foi gerado usando 2048 bits e o novo usando 4096 - Essa é uma causa possível?
Ambas as chaves públicas são RSA de 2048 bits.
De acordo com diff -u <(openssl x509 -in jenkins.crt.pem.old -text) <(openssl x509 -in jenkins.crt.pem -text)
o certificado antigo usado sha256WithRSAEncryption
enquanto o novo usa o sha1WithRSAEncryption
algoritmo de assinatura.
O apelido é importante? Jenkins não suporta chaves com mais de 2048 bits? O Jenkins / OpenJDK / Amazon Linux não funciona com algumas chaves?
O que mais devo verificar?