Как использовать Jenkins с SSL / https

39

У меня есть сервер Fedora под управлением Jenkins, который я устанавливаю через yum. Все хорошо, я могу получить к нему доступ http://ci.mydomain.com.

Но теперь я хочу получить к нему доступ, https://ci.mydomain.comпоэтому логин с именем пользователя и паролем зашифрован.

Как я могу это сделать?

Ниже мой /etc/sysconfig/jenkinsфайл. Запуск Jenkins работает, но я не могу получить доступ к Jenkins через веб-браузер с помощью https://ci.mydomain.comили 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"
Тим
источник
Вы можете использовать authbind, чтобы использовать любой порт ниже 1000, и при этом запускать jenkins без полномочий root.

Ответы:

17

Эта страница должна помочь вам настроить его за Apache (который будет обрабатывать HTTPS): https://wiki.eclipse.org/Hudson-ci/Running_Hudson_behind_Apache

Помимо «нормального» обратного прокси, вам понадобится это (как показано на этой странице):

Header edit Location ^http://www.example.com/hudson/ https://www.example.com/hudson/
Bruno
источник
2
Спасибо за ответ. У меня не работает Apache, у меня есть только сервер Linux с Jenkins.
Тим
3
В этом случае создайте хранилище ключей со своим сертификатом и используйте httpsPort(и связанные параметры): groups.google.com/group/jenkinsci-users/browse_thread/thread/…
Bruno
Хорошо, у меня есть собственный сертификат, добавленный в хранилище ключей. Но как мне теперь позвонить? Где я должен это сделать? In any case: if I put only --httpsPort=8443 or i put --httpsKeyStore=/ path/to/keystore --httpsKeyStorePassword=myPassowrd in my HUDSON_ARGS?
Тим
Поставьте все необходимые параметры (порт, местоположение магазина и пароль). Затем запустите Jenkins и укажите свой браузер на http://yourhostname:8443/.
Бруно
1
@ Umesh.ABhat Это должно быть исправлено сейчас.
Бруно
21

На всякий случай, если вы используете Nginx, а не Apache, вы можете использовать его proxy_redirect http:// https://;для перезаписи заголовка Location, когда ответ приходит от Jenkins.

Полная настройка nginx, где SSL завершается с помощью Nginx и внутренне передается в Jenkins с использованием 8080, может выглядеть следующим образом:

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;
  }
}
эмм
источник
14

Обратите внимание, что (на какое-то время?) Jenkins может сгенерировать ключ для вас, все, что вам нужно сделать, это установить --httpsPort=(portnum)параметр в JENKINS_ARGS.

В моем случае я установил JENKINS_PORT="-1"(отключил http) и установил, --httpsPort=8080который работал хорошо для моих собственных целей.

Просто отметьте, что любой порт ниже 1000 обычно требует root-доступа, поэтому выберите порт выше этого ...

( Ссылка для получения дополнительной информации)

Адам Рофер
источник
3
Кстати, официальная документация для этого - wiki.jenkins-ci.org/display/JENKINS/…
Джесси Глик
2
Было бы неплохо, если бы на этой странице было упоминание о генерации своего собственного ключа - к сожалению, вы должны сделать вывод об этой возможности, заметив, что для использования «существующего сертификата» требуются другие шаги, чем по умолчанию (который использует собственный самогенерируемый)
Адам Рофер
1
Предупреждение: это достаточно просто для автоматически сгенерированных ключей; Тем не менее, я попытался использовать эти инструкции с настоящим сертификатом, и настройка хранилища ключей была огромной болью (поскольку хранилища ключей имеют два пароля, и стандартные инструменты на самом деле не прозрачны в этом отношении).
Blaisorblade
1
Примечание: это не работает с OpenJDK, только с Oracle JRE, потому что оно опирается наsun.security.x509.CertAndKeyGen . Кроме того, это было сломано с Java 8 до самого недавнего времени (Jenkins 2.38 исправил это). Что еще хуже, в журнале изменений этого релиза говорится 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

Для сервера Ubuntu (если вы установили с apt-get install jenkins):

Вы захотите отредактировать /etc/default/jenkinsв нижней части файла, отредактируйте Jenkins_args. В моих аргументах я отключил http-доступ (используя -1) и установил SSL на порт Jenkins по умолчанию (8080). Наиболее важной частью здесь является то, что вы отправили httpsPort и сертификат / ключ (если у вас есть, в противном случае вы можете оставить их для самогенерируемого). Я помещаю crts в apache и затем использую их для обоих, но вы можете поместить их где угодно.

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"

В некоторых случаях вам придется использовать хранилище ключей Java. Сначала конвертируйте ваши ключи:

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

Теперь используйте аргументы Дженкинса, как

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

Также см. Https://serverfault.com/a/569898/300544.

Loren
источник
1
Убедитесь, что пароль экспорта, который вы указываете, opensslсоответствует «исходному паролю хранилища ключей», запрошенному keytool. Кроме того, пароль не может быть пустым.
епископ