もがき系プログラマの日常

もがき系エンジニアの勉強したこと、日常のこと、気になっている技術、備忘録などを紹介するブログです。

EC2に立てたJenkinsにLet's Encryptを適用させる

EC2に立てたJenkinsにLet's Encryptを適用させる

参考サイト

概要

現在お仕事を頂いている会社にCIを導入したいなと思いまして、Jenknis入れようと思いました。

CircleCIやTravisCIも考えましたが、一番慣れてたJenkinsにしました。

で、せっかく立ち上げたので、オレオレではなく、Let's Encryptを使ってキチンとSSL化しようと思います。

導入

Jenkninsインストール

この辺はネットにいっぱい転がっているのですが、コマンド的には以下です。

## OpenJDKのインストール
$ sudo yum -y install java-1.8.0-openjdk-devel

## Jenkinsのインストール
$ sudo wget -O /etc/yum.repos.d/jenkins.repo https://pkg.jenkins.io/redhat-stable/jenkins.repo
$ sudo rpm --import https://pkg.jenkins.io/redhat-stable/jenkins.io.key
$ sudo yum install jenkins

Jenkinsの設定

次にJenkinsの設定を変更します。

vim /etc/sysconfig/jenkins で以下の項目を変更します。

JENKINS_PORT=""
JENKINS_HTTPS_PORT="8443"
JENKINS_ARGS="--prefix=/jenkins"

Let's Encryptのインストール

参考サイトに記載している記事がとてもわかり易かったです。

$ sudo curl https://dl.eff.org/certbot-auto -o /usr/bin/certbot-auto
$ sudo chmod 700 /usr/bin/certbot-auto
$ sudo certbot-auto certonly -d ドメイン --email メールアドレス

インタラクティブな選択が出てて、apacheを選択すれば以下の場所に、以下のようなファイルが作成されます。

# ll /etc/letsencrypt/live/ドメイン/
合計 4
-rw-r--r-- 1 root root 543  1月 22 23:10 README
lrwxrwxrwx 1 root root  38  1月 22 23:10 cert.pem -> ../../archive/ドメイン/cert1.pem
lrwxrwxrwx 1 root root  39  1月 22 23:10 chain.pem -> ../../archive/ドメイン/chain1.pem
lrwxrwxrwx 1 root root  43  1月 22 23:10 fullchain.pem -> ../../archive/ドメイン/fullchain1.pem
lrwxrwxrwx 1 root root  41  1月 22 23:10 privkey.pem -> ../../archive/ドメイン/privkey1.pem

Apacheとの連携

先程の証明書を指定して、JenkinsとApache連携します。

<VirtualHost *:443>
  NameVirtualHost *:443

  <IfModule mod_proxy.c>
    SSLEngine On
    SSLProxyEngine on

    SSLCertificateFile /etc/letsencrypt/live/ドメイン/cert.pem
    SSLCertificateKeyFile /etc/letsencrypt/live/ドメイン/privkey.pem
    SSLCertificateChainFile /etc/letsencrypt/live/ドメイン/chain.pem

    ProxyPass /jenkins https://localhost:8443/jenkins nocanon
    ProxyPassReverse /jenkins https://localhost:8443/jenkins
    ProxyRequests Off
  </IfModule>
</VirtualHost>

JenkinsとApacheを起動すれば以下のように有効な証明書となります。

f:id:kojirooooocks:20180123105410p:plain

証明書の更新

Let's Encryptは有効期限が3ヶ月と短いので気づいたらあっという間に切れているということになりそうです。

なので、cronで更新のスクリプトを叩くように設定しておきます。

00 01 * * * root /usr/bin/certbot-auto renew --post-hook "service httpd restart"

現状実行しても作成したばかりなので処理がスキップされますが、更新1ヶ月前に確認して、更新されるかをチェックします。

感想

Let's Encryptを使用したことなく今回はじめて使ったのですが、簡単に実装できるものなのですね。もっと積極的に使っていきたいと思います。