วิธีใช้ Jenkins กับ SSL / https


39

ฉันมีเซิร์ฟเวอร์ Fedora ที่ใช้ Jenkins ซึ่งฉันติดตั้งผ่าน yum http://ci.mydomain.comทุกอย่างถูกต้องผมสามารถเข้าถึงได้ด้วย

แต่ตอนนี้ฉันต้องการเข้าถึงด้วยhttps://ci.mydomain.comดังนั้นการเข้าสู่ระบบด้วยชื่อผู้ใช้และรหัสผ่านจะถูกเข้ารหัส

ฉันจะทำสิ่งนี้ได้อย่างไร

ต่อไปนี้เป็น/etc/sysconfig/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 เพื่อใช้พอร์ตใดก็ได้ที่ต่ำกว่า 1,000 และยังคงเรียกใช้เจนกินส์ว่าไม่ใช่ราก

คำตอบ:


17

หน้านี้ควรช่วยคุณตั้งค่าไว้ด้านหลัง Apache (ซึ่งจะจัดการกับ HTTPS): https://wiki.eclipse.org/Hudson-ci/Running_Hudson_behind_Apache

นอกเหนือจากการเป็น reverse-proxy ปกติแล้วคุณจะต้องใช้สิ่งนี้ (ดังที่แสดงในหน้านั้น):

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

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?
ทิม

ใส่พารามิเตอร์ที่จำเป็นทั้งหมด (พอร์ตที่ตั้งร้านค้าและรหัสผ่าน) http://yourhostname:8443/จากนั้นเริ่มต้นเจนกินส์และเบราว์เซอร์ของคุณเพื่อ
Bruno

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

โปรดทราบว่า (เหมือนบางครั้ง?) เจนกินส์สามารถสร้างที่สำคัญสำหรับคุณทั้งหมดที่คุณต้องทำคือการตั้งค่าพารามิเตอร์ใน--httpsPort=(portnum)JENKINS_ARGS

ในกรณีของฉันฉันตั้งค่าJENKINS_PORT="-1"(ปิดการใช้งาน http) และชุด--httpsPort=8080ที่ทำงานได้ดีสำหรับวัตถุประสงค์ของฉันเอง

เพียงทราบว่าพอร์ตใดก็ตามที่ต่ำกว่า 1,000 โดยทั่วไปจำเป็นต้องมีการเข้าถึงรูทดังนั้นเลือกพอร์ตที่สูงกว่านั้น ...

( ลิงก์สำหรับข้อมูลเพิ่มเติม)


3
wiki.jenkins-ci.org/display/JENKINS/…เป็นเอกสารอย่างเป็นทางการสำหรับเรื่องนี้โดยวิธี
Jesse Glick

2
มันต้องการจะดีถ้าหน้านั้นมีการพูดถึงใด ๆ เกี่ยวกับการสร้างที่สำคัญของตัวเอง - น่าเสียดายที่คุณจะต้องสรุปความสามารถนี้โดยสังเกตเห็นว่า usang เป็น "ใบรับรองที่มีอยู่" ต้องมีขั้นตอนที่แตกต่างกันกว่าค่าเริ่มต้น (ซึ่งใช้อย่างใดอย่างหนึ่งด้วยตนเองที่สร้างของตัวเอง)
Adam Rofer

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 ใน 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 Key Store ก่อนอื่นแปลงคีย์ของคุณ:

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 เช่น

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


1
ตรวจสอบให้แน่ใจว่ารหัสผ่านที่คุณส่งออกจัดหาให้opensslตรงกับรหัสผ่าน "keystore แหล่งที่มา" keytoolการร้องขอจาก นอกจากนี้รหัสผ่านต้องไม่เว้นว่าง
อธิการ
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.