Verwendung von Jenkins mit SSL / https

39

Ich habe einen Fedora-Server mit Jenkins, den ich über yum installiere. Alles ist in Ordnung, ich kann mit zugreifen http://ci.mydomain.com.

Jetzt möchte ich aber darauf zugreifen, https://ci.mydomain.comdamit der Login mit Benutzername und Passwort verschlüsselt wird.

Wie kann ich das machen?

Das Folgende ist meine /etc/sysconfig/jenkinsAkte. Das Starten von Jenkins funktioniert, aber ich kann nicht mit dem Webbrowser auf Jenkins zugreifen https://ci.mydomain.comoder 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
quelle
Sie können authbind verwenden, um einen beliebigen Port unter 1000 zu verwenden und jenkins weiterhin als Nicht-Root auszuführen.

Antworten:

17

Diese Seite soll Ihnen helfen, es hinter Apache einzurichten (das HTTPS handhaben würde): https://wiki.eclipse.org/Hudson-ci/Running_Hudson_behind_Apache

Abgesehen davon, dass Sie ein "normaler" Reverse-Proxy sind, benötigen Sie Folgendes (wie auf dieser Seite gezeigt):

Header edit Location ^http://www.example.com/hudson/ https://www.example.com/hudson/
Bruno
quelle
2
Danke für die Antwort. Ich habe keinen aktiven Apache, ich habe nur den Linux-Server mit Jenkins.
Tim
3
Erstellen Sie in diesem Fall einen Keystore mit Ihrem Zertifikat und verwenden Sie httpsPort(und die zugehörigen Parameter): groups.google.com/group/jenkinsci-users/browse_thread/thread/…
Bruno,
Okay, ich habe mein eigenes Zertifikat im Keystore hinzugefügt. Aber wie soll ich jetzt anrufen? Wo soll ich das machen? In any case: if I put only --httpsPort=8443 or i put --httpsKeyStore=/ path/to/keystore --httpsKeyStorePassword=myPassowrd in my HUDSON_ARGS?
Tim
Geben Sie alle erforderlichen Parameter ein (Port, Speicherort und Passwort). Starten Sie dann Jenkins und zeigen Sie mit Ihrem Browser auf http://yourhostname:8443/.
Bruno
1
@Umesh.ABhat Das sollte jetzt behoben sein.
Bruno
21

Nur für den Fall, dass Sie Nginx und nicht Apache verwenden, möchten Sie möglicherweise proxy_redirect http:// https://;den Location-Header neu schreiben, wenn die Antwort von Jenkins zurückkommt.

Ein vollständiges Nginx-Setup, bei dem SSL mit Nginx beendet und mit 8080 intern an Jenkins weitergeleitet wird, könnte folgendermaßen aussehen:

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
quelle
14

Beachten Sie, dass Jenkins (ab irgendwann?) Den Schlüssel für Sie generieren kann. Sie müssen lediglich den --httpsPort=(portnum)Parameter in einstellen JENKINS_ARGS.

In meinem Fall setze ich JENKINS_PORT="-1"(deaktiviere http) und setze --httpsPort=8080was für meine eigenen Zwecke gut funktioniert.

Beachten Sie nur, dass jeder Port unter 1000 im Allgemeinen Root-Zugriff erfordert. Wählen Sie also einen höheren Port als diesen ...

( Link für mehr Infos)

Adam Rofer
quelle
3
wiki.jenkins-ci.org/display/JENKINS/… ist übrigens die offizielle Dokumentation dafür.
Jesse Glick
2
Es wäre schön, wenn die Seite jede Erwähnung hat über seinen eigenen Schlüssel zu erzeugen - leider muss man diese Fähigkeit ableiten , indem zu bemerken , dass ein „bestehendes Zertifikat“ usang verschiedene Schritte als der Standard erfordert (was seine eigene selbsterzeugte verwendet man )
Adam Rofer
1
Warnung: Das ist für selbst erstellte Schlüssel einfach genug. Ich habe jedoch versucht, diese Anweisungen mit einem echten Zertifikat zu verwenden, und das Einrichten des Keystores war sehr mühsam (da Keystores zwei Kennwörter haben und die Standardtools diesbezüglich wirklich nicht transparent sind).
Blaisorblade
1
Hinweis: Dies funktioniert nicht mit OpenJDK, sondern nur mit Oracle JRE, da es darauf angewiesen istsun.security.x509.CertAndKeyGen . Außerdem war es bis vor kurzem mit Java 8 defekt (Jenkins 2.38 hat das behoben). Schlimmer noch, das Changelog für diese Veröffentlichung besagt es 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

Für einen Ubuntu-Server (vorausgesetzt, Sie haben mit installiert apt-get install jenkins):

Sie möchten /etc/default/jenkinsam Ende der Datei bearbeiten, bearbeiten Sie Jenkins_args. In meinen Argumenten habe ich den HTTP-Zugriff deaktiviert (mit -1) und SSL auf den Standard-Jenkins-Port (8080) gesetzt. Der wichtigste Teil hier ist, dass Sie einen httpsPort und ein Zertifikat / einen Schlüssel gesendet haben (falls Sie einen haben, können Sie diese für den selbst erstellten auslassen). Ich lege die crts in Apache und benutze sie dann für beide, aber Sie könnten sie überall ablegen.

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"

In einigen Fällen müssen Sie einen Java-Schlüsselspeicher verwenden. Konvertieren Sie zunächst Ihre Schlüssel:

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

Verwenden Sie jetzt Jenkins Argumente wie

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

Siehe auch https://serverfault.com/a/569898/300544

Loren
quelle
1
Stellen Sie sicher, dass das von Ihnen angegebene Exportkennwort opensslmit dem von angeforderten "Quellschlüsselspeicherkennwort" übereinstimmt keytool. Außerdem darf das Passwort nicht leer sein.
Bischof