Cách sử dụng Jenkins với SSL / https


39

Tôi có một máy chủ Fedora chạy Jenkins mà tôi cài đặt qua yum. Mọi thứ đều ổn, tôi có thể truy cập nó http://ci.mydomain.com.

Nhưng bây giờ, tôi muốn truy cập nó https://ci.mydomain.comđể đăng nhập với tên người dùng và mật khẩu được mã hóa.

Tôi có thể làm cái này như thế nào?

Sau đây là /etc/sysconfig/jenkinstập tin của tôi . Bắt đầu Jenkins hoạt động, nhưng tôi không thể truy cập Jenkins bằng webbrowser bằng https://ci.mydomain.comhoặc 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"

bạn có thể sử dụng authbind để sử dụng bất kỳ cổng nào dưới 1000 và vẫn chạy jenkins dưới dạng không root.

Câu trả lời:


17

Trang này sẽ giúp bạn thiết lập nó phía sau Apache (sẽ xử lý HTTPS): https://wiki.eclipse.org/Hudson-ci/Rasty_Hudson_behind_Apache

Ngoài việc là một proxy ngược "bình thường", bạn sẽ cần điều này (như được hiển thị trên trang đó):

Header edit Location ^http://www.example.com/hudson/ https://www.example.com/hudson/

2
Cảm ơn vi đa trả lơi. Tôi không có Apache và chạy, tôi chỉ có máy chủ Linux với Jenkins.
Tim

3
Trong trường hợp này, hãy tạo một kho lưu trữ khóa với chứng chỉ của bạn và sử dụng httpsPort(và các tham số liên quan): Groups.google.com/group/jenkinsci-users/browse_thread/thread/ Lỗi
Bruno

Được rồi, tôi có chứng chỉ của riêng tôi được thêm vào kho khóa. Nhưng tôi nên gọi gì bây giờ? Tôi nên làm điều này ở đâu? In any case: if I put only --httpsPort=8443 or i put --httpsKeyStore=/ path/to/keystore --httpsKeyStorePassword=myPassowrd in my HUDSON_ARGS?
Tim

Đặt tất cả các tham số cần thiết (cổng, vị trí lưu trữ và mật khẩu). Sau đó, khởi động Jenkins và trỏ trình duyệt của bạn tới http://yourhostname:8443/.
Bruno

1
@ Umesh.ABhat Nó nên được sửa chữa ngay bây giờ.
Bruno

21

Chỉ trong trường hợp bạn đang sử dụng Nginx chứ không phải Apache, bạn có thể muốn sử dụng proxy_redirect http:// https://;để viết lại tiêu đề Vị trí khi phản hồi trở lại từ Jenkins.

Một thiết lập nginx hoàn chỉnh trong đó SSL bị chấm dứt với Nginx và được ủy quyền nội bộ cho Jenkins bằng 8080 có thể trông như thế này:

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

Lưu ý rằng (đôi khi?) Jenkins có thể tạo khóa cho bạn, tất cả những gì bạn cần làm là đặt --httpsPort=(portnum)tham số JENKINS_ARGS.

Trong trường hợp của tôi, tôi đặt JENKINS_PORT="-1"(tắt http) và thiết lập --httpsPort=8080hoạt động tốt cho mục đích của riêng tôi.

Chỉ cần lưu ý rằng bất kỳ cổng nào dưới 1000 thường yêu cầu quyền truy cập root, vì vậy hãy chọn một cổng cao hơn ...

( Liên kết để biết thêm)


3
wiki.jenkins-ci.org/display/JENKINS/, là tài liệu chính thức cho việc này, nhân tiện.
Jesse Glick

2
Thật tuyệt nếu trang đó có bất kỳ đề cập nào về việc tạo khóa riêng của mình - thật không may là bạn phải suy luận khả năng này bằng cách nhận thấy rằng "chứng chỉ hiện có" yêu cầu các bước khác với mặc định (sử dụng khóa tự tạo của chính nó)
Adam Rofer

1
Cảnh báo: đủ dễ dàng cho các khóa tự tạo; tuy nhiên, tôi đã thử sử dụng các hướng dẫn đó với một chứng chỉ thực và thiết lập kho khóa là một nỗi đau rất lớn (vì các kho khóa có hai mật khẩu và các công cụ tiêu chuẩn thực sự không minh bạch về điều này).
Blaisorblade

1
Lưu ý: Điều này không hoạt động với OpenJDK, chỉ với Oracle JRE, vì nó phụ thuộc vàosun.security.x509.CertAndKeyGen . Ngoài ra, nó đã bị hỏng với Java 8 cho đến gần đây (Jenkins 2.38 đã sửa nó). Tệ hơn, thay đổi cho bản phát hành nói 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

Đối với máy chủ Ubuntu (giả sử bạn đã cài đặt apt-get install jenkins):

Bạn sẽ muốn chỉnh sửa /etc/default/jenkinsở dưới cùng của tệp, chỉnh sửa Jenkins_args. Theo lập luận của tôi, tôi đã vô hiệu hóa quyền truy cập http (sử dụng -1) và đặt SSL trên cổng Jenkins mặc định (8080). Phần quan trọng nhất ở đây là bạn đã gửi httpsPort và chứng chỉ / khóa (nếu bạn có, nếu không, bạn có thể để lại những thứ đó cho cái tự tạo). Tôi đặt các crts trong apache và sau đó sử dụng chúng cho cả hai, nhưng bạn có thể đặt chúng ở bất cứ đâu.

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"

Trong một số trường hợp, bạn sẽ phải sử dụng Kho lưu trữ khóa Java. Đầu tiên, chuyển đổi các khóa của bạn:

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

Bây giờ sử dụng Jenkins args như

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

Ngoài ra, hãy xem https://serverfault.com/a/569898/300544


1
Đảm bảo rằng mật khẩu xuất mà bạn cung cấp opensslkhớp với "mật khẩu kho khóa nguồn" được yêu cầu bởi keytool. Hơn nữa, mật khẩu không thể để trống.
giám mục
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.