Eu gostaria de usar o JNLP para conectar os escravos Jenkins ao mestre Jenkins. O mestre está executando um proxy SSL nginx configurado de acordo com a documentação oficial . Além desta documentação, encontro problemas relacionados a certificados.
Atualmente, posso fazer com que o escravo sem cabeça JNLP domine a conexão para funcionar apenas com conexão HTTP não segura, mas não com HTTPS (embora meu painel de controle jenkins funcione em geral). Uso um certificado autoassinado assinado por meu próprio certificado CA personalizado (x509 com base em openssl).
Então, como digo ao binário java do meu escravo que confie no meu certificado CA SSL? Eu tentei isso.
# add CA certificate to key store
$ keytool -import -file /usr/local/share/ca-certificates/my_ca.crt -alias my_ca -storepass mypassword
# try to reference keystore to JNLP headless call
$ java -Djavax.net.ssl.keyStorePassword=mypassword -Djavax.net.ssl.keyStore=/home/myuser/.keystore -jar slave.jar -jnlpUrl https://proxied-jenkins.example.com/computer/testslave/slave-agent.jnlp
Na verdade, o JAVA parece não procurar o certificado no keystore fornecido. Qual é o meu erro aqui?
EDITAR
Problema semelhante / mesmo ocorre ao usar o jenkins cli. De acordo com isso , agora suponho que não tenha nada a ver com a confiança no meu certificado, pois não consigo ver umjavax.net.ssl.SSLHandshakeException
Acabei de receber uma redefinição de conexão
Failing to obtain https://proxied-jenkins.example.com/computer/testslave/slave-agent.jnlp
java.net.SocketException: Connection reset
at java.net.SocketInputStream.read(SocketInputStream.java:196)
at java.net.SocketInputStream.read(SocketInputStream.java:122)
at sun.security.ssl.InputRecord.readFully(InputRecord.java:442)
at sun.security.ssl.InputRecord.read(InputRecord.java:480)
at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:934)
at sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1332)
at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1359)
at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1343)
at sun.net.www.protocol.https.HttpsClient.afterConnect(HttpsClient.java:559)
at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(AbstractDelegateHttpsURLConnection.java:185)
at sun.net.www.protocol.https.HttpsURLConnectionImpl.connect(HttpsURLConnectionImpl.java:153)
at hudson.remoting.Launcher.parseJnlpArguments(Launcher.java:269)
at hudson.remoting.Launcher.run(Launcher.java:219)
at hudson.remoting.Launcher.main(Launcher.java:192)
.. então eu assumo um problema de configuração com o meu proxy. Peguei a configuração da configuração do proxy reverso e adicionei a seguinte configuração para forçar o SSL:
upstream jenkins-upstream {
server unproxied-jenkins.example.com:8080 fail_timeout=0;
}
server {
listen 80;
server_name proxied-jenkins.example.com;
return 301 https://$host$request_uri;
}
server {
listen 443;
server_name proxied-jenkins.example.com;
#this is the jenkins web root directory (mentioned in the /etc/default/jenkins file)
root /var/run/jenkins/war/;
ssl on;
ssl_certificate /etc/nginx/conf.d/proxied-jenkins.example.com.crt;
ssl_certificate_key /etc/nginx/conf.d/proxied-jenkins.example.com.key;
ssl_protocols TLSv1.2;
ssl_ciphers EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH;
ssl_prefer_server_ciphers on;
ssl_session_cache shared:SSL:10m;
[...] # continuing according to jenkins documentation
location @jenkins {
proxy_pass http://jenkins-upstream
[....]
}
[....]
}
Novamente, ao mudar para HTTP não seguro, o JNLP e o jenkins-cli funcionam conforme o esperado. Então qual é o erro?
Talvez eu precise passar informações adicionais do cabeçalho? Talvez eu precise de uma configuração SSL adicional nas minhas configurações de proxy?
javax.net.debug=ssl
fez o truque. Eu pude descobrir que o binário java (oracle jdk 7) tentou fazer o handshake TLSv1 com cifras 'fracas' ... Depois de instalar o Java Cryptography Extension (JCE), tive um suporte cifrado mais forte e consegui dizer ao java binário para fazer TLSv1.2. usando -Dhttps.protocols=TLSv1.2
. No entanto, após a atualização para o Oracle JDK 8, ele funciona imediatamente. Então, obrigado pelo seu apoio e me direcionando para a direção certa ... Talvez você formule isso como resposta e eu vou excluí-lo e votá-lo.
javax.net.debug=ssl
, capture a saída (grande!) e adicione isso?