Como usar o Jenkins com SSL / https

39

Eu tenho um servidor Fedora executando o Jenkins que instalo via yum. Está tudo bem, posso acessá-lo http://ci.mydomain.com.

Mas agora, quero acessá-lo https://ci.mydomain.compara que o login com nome de usuário e senha seja criptografado.

Como posso fazer isso?

O seguinte é o meu /etc/sysconfig/jenkinsarquivo. Iniciar o Jenkins funciona, mas não consigo acessar o Jenkins com o navegador da web com https://ci.mydomain.comou 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
fonte
você pode usar o authbind para usar qualquer porta abaixo de 1000 e ainda executar o jenkins como não raiz.

Respostas:

17

Esta página deve ajudá-lo a configurá-lo atrás do Apache (que seria compatível com HTTPS): https://wiki.eclipse.org/Hudson-ci/Running_Hudson_behind_Apache

Além de ser um proxy reverso "normal", você precisará disso (como mostrado nessa página):

Header edit Location ^http://www.example.com/hudson/ https://www.example.com/hudson/
Bruno
fonte
2
Obrigado pela resposta. Não tenho o Apache instalado e em execução; só tenho o servidor Linux com o Jenkins.
Tim
3
Nesse caso, crie um keystore com seu certificado e use httpsPort(e parâmetros relacionados): groups.google.com/group/jenkinsci-users/browse_thread/thread/…
Bruno
Ok, eu tenho meu próprio certificado adicionado ao keystore. Mas como devo ligar agora? Onde devo fazer isso? In any case: if I put only --httpsPort=8443 or i put --httpsKeyStore=/ path/to/keystore --httpsKeyStorePassword=myPassowrd in my HUDSON_ARGS?
Tim
Coloque todos os parâmetros necessários (porta, local da loja e senha). Em seguida, inicie o Jenkins e aponte seu navegador para http://yourhostname:8443/.
de Bruno
11
@ Umesh.ABhat Deve ser corrigido agora.
25418 Bruno
21

Caso esteja usando o Nginx e não o Apache, convém proxy_redirect http:// https://;reescrever o cabeçalho Location quando a resposta voltar do Jenkins.

Uma configuração completa do nginx em que o SSL é encerrado com o Nginx e proxy internamente para o Jenkins usando o 8080 pode ser assim:

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

Note-se que (a partir de algum dia?) Jenkins pode gerar a chave para você, tudo que você precisa fazer é definir o --httpsPort=(portnum)parâmetro JENKINS_ARGS.

No meu caso, defino JENKINS_PORT="-1"(desativei o http) e defina o --httpsPort=8080que funcionou bem para meus próprios propósitos.

Observe que qualquer porta abaixo de 1000 geralmente requer acesso root, então escolha uma porta maior que essa ...

( Link para mais informações)

Adam Rofer
fonte
3
wiki.jenkins-ci.org/display/JENKINS/… é a documentação oficial para isso, a propósito.
precisa saber é o seguinte
2
Seria bom se essa página tivesse alguma menção sobre a geração de sua própria chave - infelizmente, você precisa inferir esse recurso ao perceber que a utilização de um "certificado existente" requer etapas diferentes do padrão (que usa seu próprio código gerado automaticamente)
Adam Rofer
11
Aviso: isso é fácil o suficiente para chaves geradas automaticamente; no entanto, tentei usar essas instruções com um certificado real e configurar o keystore foi uma grande dor (já que os keystores têm duas senhas e as ferramentas padrão não são transparentes sobre isso).
Blaisorblade
11
Nota: Isso não funciona com o OpenJDK, apenas com o Oracle JRE, porque dependesun.security.x509.CertAndKeyGen . Além disso, ele foi quebrado com o Java 8 até muito recentemente (Jenkins 2.38 corrigiu isso). Pior ainda, diz o changelog desse lançamento 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 26/01
9

Para um servidor Ubuntu (supondo que você tenha instalado apt-get install jenkins):

Você deseja editar /etc/default/jenkinsna parte inferior do arquivo, edite Jenkins_args. Nos meus argumentos, desabilitei o acesso http (usando -1) e coloquei o SSL na porta Jenkins padrão (8080). A parte mais importante aqui é que você enviou um httpsPort e um certificado / chave (se você tiver um, caso contrário, poderá deixá-los fora do que é gerado automaticamente). Coloco as crts no apache e depois as uso para as duas, mas você pode colocá-las em qualquer lugar.

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"

Em alguns casos, você precisará usar um Java Key Store. Primeiro, converta suas chaves:

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

Agora use os argumentos do Jenkins como

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

Além disso, consulte https://serverfault.com/a/569898/300544

Loren
fonte
11
Verifique se a senha de exportação que você fornece opensslcorresponde à "senha do keystore de origem" solicitada por keytool. Além disso, a senha não pode ficar em branco.
bispo