Cómo usar Jenkins con SSL / https

39

Tengo un servidor Fedora ejecutando Jenkins que instalo a través de yum. Todo está bien, puedo acceder con él http://ci.mydomain.com.

Pero ahora, quiero acceder a él https://ci.mydomain.compara que el inicio de sesión con nombre de usuario y contraseña esté encriptado.

¿Cómo puedo hacer esto?

El siguiente es mi /etc/sysconfig/jenkinsarchivo. Iniciar Jenkins funciona, pero no puedo acceder a Jenkins con el navegador web con https://ci.mydomain.como http://ci.mydomain.com:443, ...

## Path:        Development/Jenkins
## Description: Configuration for the Jenkins continuous build server
## Type:        string
## Default:     "/var/lib/jenkins"
## ServiceRestart: jenkins
#
# Directory where Jenkins store its configuration and working
# files (checkouts, build reports, artifacts, ...).
#
JENKINS_HOME="/var/lib/jenkins"

## Type:        string
## Default:     ""
## ServiceRestart: jenkins
#
# Java executable to run Jenkins
# When left empty, we'll try to find the suitable Java.
#
JENKINS_JAVA_CMD=""

## Type:        string
## Default:     "jenkins"
## ServiceRestart: jenkins
#
# Unix user account that runs the Jenkins daemon
# Be careful when you change this, as you need to update
# permissions of $JENKINS_HOME and /var/log/jenkins.
#
JENKINS_USER="jenkins"

## Type:        string
## Default:     "-Djava.awt.headless=true"
## ServiceRestart: jenkins
#
# Options to pass to java when running Jenkins.
#
JENKINS_JAVA_OPTIONS="-Djava.awt.headless=true"

## Type:        integer(0:65535)
## Default:     8080
## ServiceRestart: jenkins
#
# Port Jenkins is listening on.
#
JENKINS_PORT="8080"

## Type:        integer(1:9)
## Default:     5
## ServiceRestart: jenkins
#
# Debug level for logs -- the higher the value, the more verbose.
# 5 is INFO.
#
JENKINS_DEBUG_LEVEL="5"

## Type:        yesno
## Default:     no
## ServiceRestart: jenkins
#
# Whether to enable access logging or not.
#
JENKINS_ENABLE_ACCESS_LOG="no"

## Type:        integer
## Default:     100
## ServiceRestart: jenkins
#
# Maximum number of HTTP worker threads.
#
JENKINS_HANDLER_MAX="100"

## Type:        integer
## Default:     20
## ServiceRestart: jenkins
#
# Maximum number of idle HTTP worker threads.
#
JENKINS_HANDLER_IDLE="20"

## Type:        string
## Default:     ""
## ServiceRestart: jenkins
#
# Pass arbitrary arguments to Jenkins.
# Full option list: java -jar jenkins.war --help
#
JENKINS_ARGS="--httpsPort=443 --httpsKeyStore=/root/.keystore --httpsKeyStorePassword=MYPASSWORD"
Tim
fuente
puede usar authbind para usar cualquier puerto por debajo de 1000 y aún ejecutar jenkins como no root.

Respuestas:

17

Esta página debería ayudarlo a configurarlo detrás de Apache (que manejaría HTTPS): https://wiki.eclipse.org/Hudson-ci/Running_Hudson_behind_Apache

Además de ser un proxy inverso "normal", necesitará esto (como se muestra en esa página):

Header edit Location ^http://www.example.com/hudson/ https://www.example.com/hudson/
Bruno
fuente
2
Gracias por la respuesta. No tengo Apache en funcionamiento, solo tengo el servidor Linux con Jenkins.
Tim
3
En este caso, cree un almacén de claves con su certificado y use httpsPort(y parámetros relacionados): groups.google.com/group/jenkinsci-users/browse_thread/thread/…
Bruno
Bien, tengo mi propio certificado agregado en el almacén de claves. ¿Pero a qué debo llamar ahora? ¿Dónde debería hacer esto? In any case: if I put only --httpsPort=8443 or i put --httpsKeyStore=/ path/to/keystore --httpsKeyStorePassword=myPassowrd in my HUDSON_ARGS?
Tim
Ponga todos los parámetros requeridos (puerto, ubicación de la tienda y contraseña). Luego, inicie Jenkins y señale su navegador http://yourhostname:8443/.
Bruno
1
@ Umesh.ABhat Debería arreglarse ahora.
Bruno
21

En caso de que esté usando Nginx y no Apache, es posible que desee proxy_redirect http:// https://;volver a escribir el encabezado de Ubicación cuando Jenkins le devuelva la respuesta.

Una configuración completa de nginx donde SSL termina con Nginx y se envía internamente a Jenkins usando 8080 podría verse así:

upstream jenkins {
  server 127.0.0.1:8080 fail_timeout=0;
}

server {
  listen 80 default;
  server_name 127.0.0.1 *.mydomain.com;
  rewrite ^ https://$server_name$request_uri? permanent;
}

server {
  listen 443 default ssl;
  server_name 127.0.0.1 *.mydomain.com;

  ssl_certificate           /etc/ssl/certs/my.crt;
  ssl_certificate_key       /etc/ssl/private/my.key;

  ssl_session_timeout  5m;
  ssl_protocols  SSLv3 TLSv1;
  ssl_ciphers HIGH:!ADH:!MD5;
  ssl_prefer_server_ciphers on;

  # auth_basic            "Restricted";
  # auth_basic_user_file  /home/jenkins/htpasswd;

  location / {
    proxy_set_header Host $http_host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-Proto https;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_redirect http:// https://;

    add_header Pragma "no-cache";

    proxy_pass http://jenkins;
  }
}
emm
fuente
14

Tenga en cuenta que (¿en algún momento?) Jenkins puede generar la clave por usted, todo lo que necesita hacer es configurar el --httpsPort=(portnum)parámetro JENKINS_ARGS.

En mi caso configuré JENKINS_PORT="-1"(deshabilito http) y configuré --httpsPort=8080cuál funcionó bien para mis propios fines.

Solo tenga en cuenta que cualquier puerto por debajo de 1000 generalmente requiere acceso de root, así que elija un puerto más alto que eso ...

( Enlace para más información)

Adam Rofer
fuente
3
wiki.jenkins-ci.org/display/JENKINS/… es la documentación oficial para esto, por cierto.
Jesse Glick
2
Sería bueno si esa página tuviera alguna mención sobre la generación de su propia clave; desafortunadamente, debe inferir esta capacidad al notar que usar un "certificado existente" requiere pasos diferentes al predeterminado (que usa su propia clave autogenerada)
Adam Rofer
1
Advertencia: eso es lo suficientemente fácil para claves autogeneradas; sin embargo, intenté usar esas instrucciones con un certificado real, y configurar el almacén de claves fue un gran problema (ya que los almacenes de claves tienen dos contraseñas y las herramientas estándar no son transparentes al respecto).
Blaisorblade
1
Nota: Esto no funciona con OpenJDK, solo con Oracle JRE, porque depende de élsun.security.x509.CertAndKeyGen . Además, se rompió con Java 8 hasta hace muy poco (Jenkins 2.38 lo solucionó). Peor aún, dice el registro de cambios para ese lanzamiento This option is deprecated and will be removed in a future release. We strongly recommend you create self-signed certificates yourself and use --httpsKeyStore.
nh2
9

Para un servidor Ubuntu (suponiendo que haya instalado apt-get install jenkins):

/etc/default/jenkinsQuerrá editar en la parte inferior del archivo, edite Jenkins_args. En mis argumentos, deshabilité el acceso http (usando -1) y puse SSL en el puerto predeterminado de Jenkins (8080). La parte más importante aquí es que envió un httpsPort y un certificado / clave (si tiene uno, de lo contrario, puede dejarlos para el autogenerado). Coloco los crts en apache y luego los uso para ambos, pero podría ponerlos en cualquier lugar.

JENKINS_ARGS="--webroot=/var/cache/jenkins/war --httpsPort=$HTTP_PORT --httpPort=-1 --httpsCertificate=/etc/apache2/ssl.crt/CERT.crt --httpsPrivateKey=/etc/apache2/ssl.key/KEY.key --ajp13Port=$AJP_PORT"

En algunos casos, tendrá que usar un Java Key Store. Primero, convierta sus llaves:

openssl pkcs12 -inkey /var/lib/jenkins/jenkins.key.pem -in /var/lib/jenkins/jenkins.crt.pem  -export -out keys.pkcs12

keytool -importkeystore -srckeystore keys.pkcs12 -srcstoretype pkcs12 -destkeystore jenkins.jks

Ahora usa los argumentos de Jenkins como

JENKINS_ARGS="--webroot=/var/cache/$NAME/war --httpsPort=$HTTP_PORT --httpPort=-1 --httpsKeyStore=/etc/apache2/ssl.crt/jenkins.jks --httpsKeyStorePassword=thePassword --ajp13Port=$AJP_PORT"

Además, consulte https://serverfault.com/a/569898/300544

Loren
fuente
1
Asegúrese de que la contraseña de exportación que proporcione opensslcoincida con la "contraseña del almacén de claves de origen" solicitada por keytool. Además, la contraseña no puede estar en blanco.
obispo