Comment utiliser Jenkins avec SSL / https

39

J'ai un serveur Fedora sous Jenkins que j'installe via yum. Tout va bien, je peux y accéder avec http://ci.mydomain.com.

Mais maintenant, je veux y accéder avec https://ci.mydomain.compour que le login avec nom d'utilisateur et mot de passe soit crypté.

Comment puis-je faire ceci?

Ce qui suit est mon /etc/sysconfig/jenkinsdossier. Démarrer Jenkins fonctionne, mais je ne peux pas accéder à Jenkins avec le navigateur Web avec https://ci.mydomain.comou 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
la source
vous pouvez utiliser authbind pour utiliser n’importe quel port inférieur à 1 000 et toujours exécuter Jenkins en tant que non-root.

Réponses:

17

Cette page devrait vous aider à la configurer derrière Apache (qui gérera le protocole HTTPS): https://wiki.eclipse.org/Hudson-ci/Running_Hudson_behind_Apache

En plus d'être un proxy inverse "normal", vous en aurez besoin (comme indiqué sur cette page):

Header edit Location ^http://www.example.com/hudson/ https://www.example.com/hudson/
Bruno
la source
2
Merci pour la réponse. Apache n'est pas encore opérationnel, je n'ai que le serveur Linux avec Jenkins.
Tim
3
Dans ce cas, créez un magasin de clés avec votre certificat et utilisez-le httpsPort(ainsi que les paramètres associés): groups.google.com/group/jenkinsci-users/browse_thread/thread/…
Bruno
D'accord, j'ai mon propre certificat ajouté dans le magasin de clés. Mais que dois-je appeler maintenant? Où devrais-je faire ça? In any case: if I put only --httpsPort=8443 or i put --httpsKeyStore=/ path/to/keystore --httpsKeyStorePassword=myPassowrd in my HUDSON_ARGS?
Tim
Mettez tous les paramètres requis (port, emplacement du magasin et mot de passe). Ensuite, lancez Jenkins et pointez votre navigateur sur http://yourhostname:8443/.
Bruno
1
@ Umesh.ABhat Cela devrait être corrigé maintenant.
Bruno
21

Juste au cas où vous utilisez Nginx et non Apache, vous pouvez utiliser proxy_redirect http:// https://;pour réécrire l'en-tête Location lorsque la réponse revient de Jenkins.

Une configuration complète de nginx dans laquelle SSL est résilié avec Nginx et envoyé à Jenkins via un proxy interne à l'aide de 8080 pourrait ressembler à ceci:

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
la source
14

Notez que Jenkins peut générer la clé pour vous, il vous suffit de définir le --httpsPort=(portnum)paramètre dans JENKINS_ARGS.

Dans mon cas, j'ai défini JENKINS_PORT="-1"(désactiver http) et défini --httpsPort=8080ce qui a bien fonctionné pour mes propres besoins.

Notez simplement que tout port inférieur à 1000 nécessite généralement un accès root, aussi choisissez un port supérieur à celui-ci ...

( Lien pour plus d'informations)

Adam Rofer
la source
3
Au fait, wiki.jenkins-ci.org/display/JENKINS/… en est la documentation officielle.
Jesse Glick
2
Ce serait bien si cette page mentionnait la possibilité de générer sa propre clé. Malheureusement, vous devez déduire cette possibilité en remarquant que, pour utiliser un "certificat existant", il faut suivre des étapes différentes de celles par défaut (qui utilise sa propre clé)
Adam Rofer
1
Attention: c'est assez facile pour les clés générées par l'utilisateur. Cependant, j'ai essayé d'utiliser ces instructions avec un vrai certificat et la configuration du magasin de clés a été très pénible (car les magasins de clés ont deux mots de passe et les outils standard ne sont vraiment pas transparents à ce sujet).
Blaisorblade
1
Remarque: Cela ne fonctionne pas avec OpenJDK, mais uniquement avec le JRE Oracle, car il repose sursun.security.x509.CertAndKeyGen . En outre, il était cassé avec Java 8 jusqu'à très récemment (Jenkins 2.38 corrigé cela). Pire encore, le changelog de cette version dit 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

Pour un serveur Ubuntu (en supposant que vous avez installé avec apt-get install jenkins):

Vous voudrez éditer /etc/default/jenkinsau bas du fichier, éditez Jenkins_args. Dans mes arguments, j'ai désactivé l'accès http (avec -1) et mis SSL sur le port par défaut de Jenkins (8080). La partie la plus importante ici est que vous avez envoyé un httpsPort et un certificat / clé (si vous en avez un, sinon vous pouvez laisser ceux-ci pour le système auto-généré). Je place les crts dans Apache puis je les utilise pour les deux, mais vous pouvez les placer n'importe où.

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"

Dans certains cas, vous devrez utiliser un magasin de clés Java. Commencez par convertir vos clés:

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

Maintenant, utilisez les arguments de Jenkins comme

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

Voir également https://serverfault.com/a/569898/300544.

Loren
la source
1
Assurez-vous que le mot de passe d'exportation que vous avez fourni opensslcorrespond au "mot de passe du magasin de clés source" demandé par keytool. De plus, le mot de passe ne peut pas être vide.
évêque