如何通过SSL / https使用Jenkins


39

我有一台运行Jenkins的Fedora服务器,该服务器通过yum安装。一切正常,我可以使用进行访问http://ci.mydomain.com

但是现在,我想使用来访问它,https://ci.mydomain.com因此使用用户名和密码的登录名已加密。

我怎样才能做到这一点?

以下是我的/etc/sysconfig/jenkins文件。启动Jenkins可以正常工作,但是我无法通过Web浏览器使用https://ci.mydomain.com或来访问Jenkins 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的任何端口,并且仍以非root用户身份运行jenkins。

Answers:


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/

2
谢谢回复。我没有安装和运行Apache,只有带有Jenkins的Linux服务器。

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
蒂姆(Tim)

输入所有必需的参数(端口,存储位置和密码)。然后,启动Jenkins,然后将浏览器指向http://yourhostname:8443/
布鲁诺

1
@ Umesh.ABhat现在应该修复。
布鲁诺

21

以防万一,如果您使用的是Nginx而不是Apache,则可能需要proxy_redirect http:// https://;重写Jenkins响应中的Location标头。

一个完整的nginx设置,其中SSL以Nginx终止,并使用8080在内部代理到Jenkins,可能看起来像这样:

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用户访问权限,因此请选择一个高于该端口的端口...

链接以获取更多信息)



2
如果该页面提及生成自己的密钥,那就太好了-不幸的是,您必须通过注意到使用“现有证书”所需要的步骤与默认步骤不同(使用其自身生成的证书)来推断此功能
亚当·罗弗(Adam Rofer)2013年

1
警告:这对于自生成密钥很简单;但是,我尝试将这些说明与真实证书一起使用,并且设置密钥库非常麻烦(因为密钥库具有两个密码,而标准工具对此实际上并不透明)。
布莱布莱德(Blaisorblade)2015年

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和证书/密钥(如果您有一个,则可以将其留给自己生成的一个)。我将crt放在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

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与要求的“源密钥库密码”匹配keytool。此外,密码不能为空。
主教
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.