Cara menggunakan Jenkins dengan SSL / https

39

Saya memiliki server Fedora yang menjalankan Jenkins yang saya instal melalui yum. Semuanya baik-baik saja, saya dapat mengaksesnya http://ci.mydomain.com.

Tapi sekarang, saya ingin mengaksesnya dengan https://ci.mydomain.combegitu login dengan nama pengguna dan kata sandi dienkripsi.

Bagaimana saya bisa melakukan ini?

Berikut ini adalah /etc/sysconfig/jenkinsfile saya . Memulai Jenkins berfungsi, tetapi saya tidak dapat mengakses Jenkins dengan browser web dengan https://ci.mydomain.comatau 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
sumber
Anda dapat menggunakan authbind untuk menggunakan port apa saja di bawah 1000 dan masih menjalankan jenkins sebagai non-root.

Jawaban:

17

Halaman ini akan membantu Anda mengaturnya di belakang Apache (yang akan menangani HTTPS): https://wiki.eclipse.org/Hudson-ci/Running_Hudson_behind_Apache

Selain sebagai proxy-terbalik "normal", Anda akan memerlukan ini (seperti yang ditunjukkan pada halaman itu):

Header edit Location ^http://www.example.com/hudson/ https://www.example.com/hudson/
Bruno
sumber
2
Terima kasih balasannya. Saya tidak memiliki Apache dan menjalankan, saya hanya memiliki server Linux dengan Jenkins.
Tim
3
Dalam hal ini, buat keystore dengan sertifikat Anda dan gunakan httpsPort(dan parameter terkait): groups.google.com/group/jenkinsci-users/browse_thread/thread/…
Bruno
Oke, saya punya sertifikat sendiri yang ditambahkan ke dalam keystore. Tapi apa yang harus saya telepon sekarang? Di mana saya harus melakukan ini? In any case: if I put only --httpsPort=8443 or i put --httpsKeyStore=/ path/to/keystore --httpsKeyStorePassword=myPassowrd in my HUDSON_ARGS?
Tim
Masukkan semua parameter yang diperlukan (port, lokasi toko, dan kata sandi). Lalu, mulai Jenkins dan arahkan browser Anda ke http://yourhostname:8443/.
Bruno
1
@ Umesh.ABhat Ini harus diperbaiki sekarang.
Bruno
21

Untuk berjaga-jaga jika Anda menggunakan Nginx dan bukan Apache, Anda mungkin ingin menggunakan proxy_redirect http:// https://;untuk menulis ulang header Lokasi saat respons kembali dari Jenkins.

Pengaturan nginx lengkap tempat SSL diakhiri dengan Nginx dan diproksi secara internal ke Jenkins menggunakan 8080 mungkin terlihat seperti ini:

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

Perhatikan bahwa (kadang-kadang?) Jenkins dapat membuat kunci untuk Anda, semua yang perlu Anda lakukan adalah mengatur --httpsPort=(portnum)parameter JENKINS_ARGS.

Dalam kasus saya, saya mengatur JENKINS_PORT="-1"(menonaktifkan http) dan mengatur --httpsPort=8080yang bekerja dengan baik untuk tujuan saya sendiri.

Harap perhatikan bahwa port apa pun di bawah 1000 umumnya memerlukan akses root, jadi pilih port yang lebih tinggi dari itu ...

( Tautan untuk info lebih lanjut)

Adam Rofer
sumber
3
wiki.jenkins-ci.org/display/JENKINS/… adalah dokumentasi resmi untuk ini.
Jesse Glick
2
Akan lebih baik jika halaman itu menyebutkan tentang menghasilkan kuncinya sendiri - sayangnya Anda harus menyimpulkan kemampuan ini dengan memperhatikan bahwa usang suatu "sertifikat yang ada" memerlukan langkah-langkah yang berbeda dari default (yang menggunakan sendiri yang dihasilkan sendiri)
Adam Rofer
1
Peringatan: itu cukup mudah untuk kunci yang dihasilkan sendiri; Namun, saya mencoba menggunakan instruksi tersebut dengan sertifikat asli, dan mengatur keystore adalah sangat menyusahkan (karena keystores memiliki dua kata sandi dan alat standar benar-benar tidak transparan mengenai hal ini).
Blaisorblade
1
Catatan: Ini tidak berfungsi dengan OpenJDK, hanya dengan Oracle JRE, karena itu bergantungsun.security.x509.CertAndKeyGen . Juga, itu rusak dengan Java 8 sampai saat ini (Jenkins 2.38 memperbaikinya). Lebih buruk lagi, changelog untuk rilis itu mengatakan 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

Untuk server Ubuntu (dengan asumsi Anda menginstal dengan apt-get install jenkins):

Anda ingin mengedit /etc/default/jenkinsdi bagian bawah file, mengedit Jenkins_args. Dalam argumen saya, saya telah menonaktifkan akses http (menggunakan -1) dan meletakkan SSL pada port Jenkins default (8080). Bagian terpenting di sini adalah Anda mengirim httpsPort dan sertifikat / kunci (jika Anda memilikinya, jika tidak, Anda dapat membatalkannya untuk yang dihasilkan sendiri). Saya menempatkan crts di apache dan kemudian menggunakannya untuk keduanya, tetapi Anda bisa meletakkannya di mana saja.

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"

Dalam beberapa kasus, Anda harus menggunakan Java Key Store. Pertama, konversikan kunci Anda:

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

Sekarang gunakan Jenkins args like

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

Juga, lihat https://serverfault.com/a/569898/300544

Loren
sumber
1
Pastikan bahwa kata sandi ekspor yang Anda berikan opensslsesuai dengan "kata sandi keystore sumber" yang diminta oleh keytool. Selanjutnya, kata sandi tidak boleh kosong.
Uskup