Jak korzystać z Jenkins z SSL / https

39

Mam serwer Fedory z systemem Jenkins, który instaluję przez yum. Wszystko jest w porządku, mogę uzyskać do nich dostęp http://ci.mydomain.com.

Ale teraz chcę uzyskać do niego dostęp, https://ci.mydomain.comwięc login z nazwą użytkownika i hasłem jest szyfrowany.

W jaki sposób mogę to zrobić?

Oto mój /etc/sysconfig/jenkinsplik. Począwszy Jenkins działa, ale nie może uzyskać dostępu Jenkins z WebBrowser z https://ci.mydomain.comlub 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
źródło
możesz użyć authbind, aby użyć dowolnego portu poniżej 1000 i nadal uruchamiać jenkins jako root.

Odpowiedzi:

17

Ta strona powinna pomóc Ci ustawić ją za Apache (który obsługiwałby HTTPS): https://wiki.eclipse.org/Hudson-ci/Running_Hudson_behind_Apache

Oprócz tego, że jest „normalnym” odwrotnym proxy, potrzebujesz tego (jak pokazano na tej stronie):

Header edit Location ^http://www.example.com/hudson/ https://www.example.com/hudson/
Bruno
źródło
2
Dziękuję za odpowiedź. Nie mam uruchomionego Apache, mam tylko serwer Linux z Jenkins.
Tim
3
W takim przypadku utwórz plik kluczy ze swoim certyfikatem i użyj httpsPort(i powiązanych parametrów): groups.google.com/group/jenkinsci-users/browse_thread/thread/…
Bruno
OK, mam własny certyfikat dodany do magazynu kluczy. Ale jak mam teraz zadzwonić? Gdzie mam to zrobić? In any case: if I put only --httpsPort=8443 or i put --httpsKeyStore=/ path/to/keystore --httpsKeyStorePassword=myPassowrd in my HUDSON_ARGS?
Tim
Wprowadź wszystkie wymagane parametry (port, lokalizację sklepu i hasło). Następnie uruchom Jenkins i wskaż swoją przeglądarkę http://yourhostname:8443/.
Bruno
1
@ Umesh.ABhat Należy to teraz naprawić.
Bruno,
21

Na wypadek, gdybyś używał Nginx, a nie Apache, możesz użyć proxy_redirect http:// https://;przepisania nagłówka Location, gdy odpowiedź powróci od Jenkinsa.

Pełna konfiguracja nginx, w której protokół SSL jest zakończony przy użyciu Nginx i wewnętrznie połączony z serwerem Jenkins za pomocą 8080, może wyglądać następująco:

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
źródło
14

Zauważ, że (od jakiegoś czasu?) Jenkins może wygenerować klucz dla ciebie, wszystko co musisz zrobić, to ustawić --httpsPort=(portnum)parametr w JENKINS_ARGS.

W moim przypadku ustawiłem JENKINS_PORT="-1"(wyłączam http) i ustawiłem, --httpsPort=8080który działał dobrze dla moich własnych celów.

Pamiętaj, że każdy port poniżej 1000 zazwyczaj wymaga dostępu do konta root, więc wybierz port wyższy niż ten ...

( Link, aby uzyskać więcej informacji)

Adam Rofer
źródło
3
Nawiasem mówiąc, wiki.jenkins-ci.org/display/JENKINS/... jest oficjalną dokumentacją tego.
Jesse Glick
2
Byłoby miło, gdyby na tej stronie była wzmianka o generowaniu własnego klucza - niestety musisz wywnioskować tę możliwość, zauważając, że usang „istniejący certyfikat” wymaga innych kroków niż domyślny (który używa własnego wygenerowanego przez siebie certyfikatu)
Adam Rofer
1
Ostrzeżenie: to dość łatwe dla kluczy generowanych przez siebie; próbowałem jednak użyć tych instrukcji z prawdziwym certyfikatem, a konfiguracja magazynu kluczy była ogromnym utrapieniem (ponieważ magazyny kluczy mają dwa hasła, a standardowe narzędzia naprawdę nie są przejrzyste).
Blaisorblade
1
Uwaga: To nie działa z OpenJDK, tylko z Oracle JRE, ponieważ polega nasun.security.x509.CertAndKeyGen . Do niedawna był zepsuty w Javie 8 (naprawił to Jenkins 2.38). Co gorsza, dziennik zmian tego wydania mówi 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

W przypadku serwera Ubuntu (zakładając, że został zainstalowany apt-get install jenkins):

Będziesz chciał edytować /etc/default/jenkinsna dole pliku, edytuj Jenkins_args. W moich argumentach wyłączyłem dostęp http (używając -1) i ustawiłem SSL na domyślnym porcie Jenkins (8080). Najważniejsze w tym miejscu jest to, że wysłałeś httpsPort i certyfikat / klucz (jeśli taki posiadasz, w przeciwnym razie możesz pominąć je dla wygenerowanego samodzielnie). Umieszczam crts w apache, a następnie używam ich do obu, ale możesz je umieścić w dowolnym miejscu.

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"

W niektórych przypadkach będziesz musiał użyć Java Key Store. Najpierw przekonwertuj klucze:

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

Teraz użyj takich argumentów jak Jenkins

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

Zobacz także https://serverfault.com/a/569898/300544

Loren
źródło
1
Upewnij się, że podane przez Ciebie hasło eksportu jest opensslzgodne z „hasłem źródłowego pliku kluczy”, o które poprosił keytool. Ponadto hasło nie może być puste.
biskup