Thứ ba, 01/08/2017 | 00:00 GMT+7

Cách cấu hình GoCD với Let's Encrypt SSL Certificates trên Ubuntu 16.04

GoCD là một nền tảng phân phối và tích hợp liên tục mạnh mẽ được thiết kế để tự động hóa các quy trình thử nghiệm và phát hành. Với nhiều tính năng nâng cao như khả năng so sánh các bản dựng, trực quan hóa quy trình làm việc phức tạp và tự động hóa theo dõi version bản dựng, GoCD là một công cụ linh hoạt có thể giúp các group cung cấp phần mềm đã được kiểm tra tốt cho môi trường production .

Trong bài viết trước, ta đã cài đặt server GoCD, cài đặt tác nhân và cấu hình xác thực . Trong hướng dẫn này, ta sẽ cấu hình GoCD để sử dụng certificate SSL Let's Encrypt tin cậy để ngăn chặn các cảnh báo của trình duyệt khi truy cập giao diện web. Ta sẽ cung cấp hướng dẫn cho hai cấu hình có thể khác nhau.

Phương pháp đầu tiên sẽ cài đặt một web server Nginx làm Reverse Proxy sẽ chuyển tiếp các kết nối đến điểm cuối HTTP của GoCD. Lựa chọn này cung cấp trải nghiệm Let's Encrypt liền mạch hơn và có lẽ sẽ là lựa chọn tốt nhất cho hầu hết mọi người.

Phương pháp thứ hai ta sẽ thảo luận sẽ lấy certificate từ Let's Encrypt và sau đó chuyển certificate được sử dụng bởi điểm cuối HTTPS của GoCD. Trong khi điều này loại bỏ yêu cầu đối với web server riêng biệt, có thể tiết kiệm tài nguyên, GoCD sử dụng repository certificate SSL kho khóa Java không tương thích trực tiếp với định dạng certificate do Let's Encrypt cung cấp. Ta cần tạo một tập lệnh để tự động chuyển đổi certificate sang định dạng mong muốn mỗi khi gia hạn xảy ra. Tùy chọn này là tốt nhất nếu server của bạn có tài nguyên tối thiểu và bạn muốn phân bổ mọi thứ có sẵn cho chính GoCD.

Yêu cầu

Nếu bạn chưa có server GoCD được cấu hình trên Ubuntu 16.04, bạn cần phải cấu hình một server trước khi bắt đầu hướng dẫn này. Server cơ sở yêu cầu ít nhất 2G RAM và 2 lõi CPU . GoCD cũng cần một phân vùng hoặc đĩa chuyên dụng để sử dụng cho việc lưu trữ tạo tác. Bạn có thể tìm hiểu cách cấu hình không gian bổ sung này bằng một trong hai hướng dẫn sau:

Sau khi server được cài đặt , bạn có thể thực hiện một số cấu hình ban đầu và cài đặt GoCD bằng các hướng dẫn sau:

Để có được certificate SSL từ Let's Encrypt, server của bạn cần phải có tên domain .

Các yêu cầu khác tùy thuộc vào phương pháp bạn muốn theo đuổi và sẽ được giải thích trong các phần thích hợp. Khi đã sẵn sàng tiếp tục, hãy chọn phương pháp bạn muốn sử dụng và làm theo các hướng dẫn liên quan.

Tùy chọn 1: Cấu hình Nginx làm Reverse Proxy cho GoCD

Nếu bạn muốn cài đặt Nginx làm Reverse Proxy kết thúc SSL cho GoCD, hãy làm theo phần này. Trong cấu hình này, Nginx sẽ được cấu hình để phục vụ truy cập HTTP S bằng certificate Let's Encrypt. Nó sẽ giải mã các kết nối client và sau đó chuyển tiếp lưu lượng đến giao diện web của GoCD bằng HTTP thông thường. Điều này yêu cầu một số chi phí bổ sung cho giao diện user Nginx, nhưng là một cách tiếp cận đơn giản hơn.

Các yêu cầu bổ sung

Nếu bạn muốn sử dụng Nginx làm Reverse Proxy cho GoCD, trước tiên bạn cần cài đặt Nginx và ứng dụng Let's Encrypt, sau đó certificate request cho domain của bạn. Các hướng dẫn này cung cấp các bước cần thiết để lấy certificate và cấu hình web server của bạn:

Khi bạn đã hoàn thành các hướng dẫn ở trên, vẫn có thể truy cập GoCD bằng certificate tự ký bằng cách truy cập https:// your_domain :8154 và trang Nginx mặc định sẽ được hiển thị bằng certificate Let's Encrypt khi bạn xóa thông số cổng.

Bây giờ, ta có thể cấu hình Nginx cho các yêu cầu proxy tới phần backend GoCD để các kết nối client được mã hóa bằng certificate Let's Encrypt.

Cấu hình Nginx To Proxy cho Giao diện Web HTTP của GoCD

Ta đã download certificate SSL từ Let's Encrypt và cấu hình Nginx để sử dụng certificate khi cung cấp các yêu cầu trên cổng SSL mặc định. Bước tiếp theo của ta là cấu hình Nginx để ủy quyền các yêu cầu đó tới giao diện web HTTP thông thường của GoCD, có sẵn trên cổng 8153.

Để bắt đầu, hãy mở file khối server Nginx mặc định được cấu hình để sử dụng certificate Let's Encrypt của bạn:

  • sudo nano /etc/nginx/sites-available/default

Ở phía trên cùng của file , bên ngoài của server khối, mở mới upsteam phần. Ta sẽ gọi khối này là gocd để sau này có thể dễ dàng nhận ra. Bên trong, chỉ định địa chỉ mà Nginx có thể sử dụng để liên hệ với giao diện HTTP của GoCD. Trong trường hợp của ta , điều này sẽ sử dụng thiết bị lặp local , vì vậy địa chỉ đầy đủ phải là 127.0.0.1:8153 :

/ etc / nginx / sites-available / default
upstream gocd {     server 127.0.0.1:8153; }  server {     . . . 

Tiếp theo, trong khối server , hãy tìm location / khối. Bên trong, hãy comment chỉ thị try_files để ta có thể chỉ cấu hình proxy của bạn . Thay cho dòng try_files , hãy thêm một thẻ proxy vào gocd ngược dòng mà ta đã xác định, sử dụng giao thức http:// . Bao gồm file proxy_params để đặt các cài đặt proxy khác mà khối vị trí của ta yêu cầu:

/ etc / nginx / sites-available / default
. . .  server     . . .      location / {         #try_files $uri $uri/ =404;         proxy_pass http://gocd;         include proxy_params;     }      . . . 

Lưu file khi bạn hoàn tất.

Khi bạn quay lại dòng lệnh, hãy kiểm tra cấu hình Nginx để biết lỗi cú pháp bằng lệnh :

  • sudo nginx -t

Nếu không tìm thấy lỗi nào, hãy khởi động lại dịch vụ Nginx bằng lệnh :

  • sudo systemctl restart nginx

Giao diện user web GoCD của bạn hiện có thể truy cập được thông qua domain thông thường của bạn với giao thức https:// .

Lưu ý: Mặc dù ta đang yêu cầu proxy trên cổng 80 và 443 thông qua Nginx, ta vẫn cần giữ cổng HTTPS 8154 mở trong firewall của bạn . Đại lý GoCD cần có khả năng liên hệ trực tiếp với server GoCD (không có proxy) để server có thể xác thực trực tiếp certificate SSL của client . Để cổng 8154 mở sẽ cho phép các tác nhân bên ngoài liên hệ với server một cách chính xác trong khi các yêu cầu web thông thường thông qua trình duyệt có thể đi qua proxy.

Mục cuối cùng ta cần điều chỉnh là cài đặt URL của trang web trong giao diện user web của GoCD.

Cập nhật URL trang web GoCD để sử dụng địa chỉ mới

Khi bạn đã khởi động lại Nginx, nhiệm vụ còn lại duy nhất là sửa đổi cài đặt URL trang web mà GoCD sử dụng nội bộ để tạo các liên kết thích hợp.

Truy cập domain server GoCD của bạn trong trình duyệt web và đăng nhập nếu cần:

https://example.com 

Tiếp theo, nhấp vào QUẢN TRỊ ở thanh menu trên cùng và chọn Cấu hình server từ menu thả xuống:

Liên kết  server  cấu hình GoCD

Trong phần Quản lý Server , hãy sửa đổi URL Trang web để xóa thông số cổng :8154 khỏi cuối. Nếu bạn đang sử dụng địa chỉ IP thay vì domain trước đây, hãy thay đổi URL để sử dụng cả domain của bạn:

Cài đặt URL trang web GoCD

Cuộn xuống cuối trang và nhấp vào LƯU để thực hiện thay đổi ngay lập tức. Trang web hiện được cài đặt để ủy quyền tất cả các yêu cầu cho domain của bạn thông qua Nginx tới giao diện user web GoCD.

Tùy chọn 2: Cấu hình SSL root của GoCD để sử dụng certificate Let's Encrypt

Thực hiện theo phần này nếu bạn muốn cấu hình web server riêng của GoCD để sử dụng certificate Let's Encrypt. Trong cấu hình này, ta sẽ thay thế certificate tự ký đã được server GoCD sử dụng bằng certificate tin cậy do Let's Encrypt cung cấp. Tuy nhiên, để làm điều này, ta cần chuyển đổi file certificate sang định dạng mới và nhập chúng vào file kho khóa Java. Ta sẽ tạo một tập lệnh để quá trình này có thể được lặp lại mỗi khi các file certificate được gia hạn.

Các yêu cầu bổ sung

Nếu bạn muốn xử lý tất cả các hoạt động SSL từ bên trong GoCD, bạn cần download certificate từ Let's Encrypt mà không cần thủ tục cấu hình web server . Làm theo hướng dẫn này để download ứng dụng client thích hợp và lấy certificate cho domain của bạn:

Khi bạn đã hoàn thành các hướng dẫn ở trên, vẫn có thể truy cập GoCD bằng certificate tự ký bằng cách truy cập vào https:// your_domain :8154 và các file certificate do Let's Encrypt cung cấp sẽ có sẵn trong folder /etc/letsencrypt/live/ your_domain .

Tạo tập lệnh chuyển đổi certificate

GoCD sử dụng kho khóa Java để xử lý certificate SSL. Thật không may, đây là một định dạng khác với định dạng mà Let's Encrypt sử dụng. Để sử dụng certificate Let's Encrypt với GoCD, ta sẽ phải chuyển đổi chúng bằng một quy trình rất cụ thể.

Do sự phức tạp của thủ tục và nhu cầu chuyển đổi certificate mỗi khi chúng được gia hạn, ta sẽ tạo một tập lệnh để tự động hóa quy trình. Trong folder /usr/local/bin , hãy tạo và mở một tập lệnh có tên convert_certs_for_gocd.sh trong editor của bạn:

  • sudo nano /usr/local/bin/convert_certs_for_gocd.sh

Bên trong, hãy dán tập lệnh sau. Cài đặt duy nhất bạn cần cập nhật là giá trị của biến base_domain . Đặt domain đó thành domain của server GoCD của bạn (tên này phải trùng với giá trị của folder bên trong /etc/letsencrypt/live/ ):

/usr/local/bin/convert_certs_for_gocd.sh
#!/bin/bash  base_domain="example.com" le_directory="/etc/letsencrypt/live/${base_domain}" working_dir="$(mktemp -d)" gocd_pass="serverKeystorepa55w0rd"   clean_up () {     rm -rf "${working_dir}" }  # Use this to echo to standard error error () {     printf "%s: %s\n" "$(basename "${BASH_SOURCE}")" "${1}" >&2     clean_up     exit 1 }  trap 'error "An unexpected error occurred."' ERR  copy_cert_files () {     cp "${le_directory}/fullchain.pem" "${working_dir}"     cp "${le_directory}/privkey.pem" "${working_dir}" }  convert_to_pkcs12 () {     openssl_pkcs12_args=(         "pkcs12"         "-inkey" "${working_dir}/privkey.pem"         "-in" "${working_dir}/fullchain.pem"         "-export"         "-out" "${working_dir}/${base_domain}.crt.pkcs12"         "-passout" "pass:${gocd_pass}"     )     openssl "${openssl_pkcs12_args[@]}" }  import_to_keytool () {     keytool_args=(         "-importkeystore"         "-srckeystore" "${working_dir}/${base_domain}.crt.pkcs12"         "-srcstoretype" "PKCS12"         "-srcstorepass" "${gocd_pass}"         "-destkeystore" "${working_dir}/keystore"         "-srcalias" "1"         "-destalias" "cruise"         "-deststorepass" "${gocd_pass}"         "-destkeypass" "${gocd_pass}"     )     keytool "${keytool_args[@]}" }  install_new_keystore () {     cp /etc/go/keystore /etc/go/keystore.bak     mv "${working_dir}/keystore" "/etc/go/keystore"     chown go:go /etc/go/keystore     systemctl restart go-server }  if (( EUID != 0 )); then     error "This script requires root privileges" fi  copy_cert_files && convert_to_pkcs12 && import_to_keytool && install_new_keystore && clean_up 

Hãy xem lại chính xác những gì script này đang làm.

Lúc đầu, ta đặt một số biến để giúp tập lệnh của ta làm việc dễ dàng hơn. Ta đặt domain cho các certificate mà ta muốn chuyển đổi và một biến mở rộng đến folder certificate Let's Encrypt. Ta tạo một folder làm việc tạm thời bằng lệnh mktemp và gán giá trị cho một biến khác. GoCD yêu cầu tất cả password kho khóa Java của nó phải là serverKeystorepa55w0rd , ta đặt một biến khác để giữ giá trị đó.

Tiếp theo, ta xác định một hàm xóa folder tạm thời khi được gọi. Ta sử dụng điều này ở cuối tập lệnh của bạn để tự dọn dẹp và cũng như khi có bất kỳ lỗi không mong muốn nào xảy ra. Để thực hiện khả năng thứ hai này, ta tạo một chức năng khác hiển thị thông báo lỗi và dọn dẹp trước khi thoát. Ta sử dụng lệnh trap để gọi chức năng này tự động khi nào có lỗi xuất hiện.

Sau đó, ta tạo các hàm thực hiện chuyển đổi thực tế. Chức năng đầu tiên cài đặt không gian làm việc của ta bằng cách sao chép private key và certificate chuỗi đầy đủ vào folder làm việc. Hàm convert_to_pkcs12 sử dụng openssl để kết hợp file certificate chuỗi đầy đủ và file private key trong file PKCS 12 kết hợp mà keytool sử dụng. Quá trình này yêu cầu password xuất, vì vậy ta sử dụng biến password GoCD.

Hàm tiếp theo nhập file PKCS 12 mới vào file kho khóa Java. Ta nhập file và cung cấp password xuất. Sau đó, ta cung cấp cùng một password cho các password khác nhau của file kho khóa. Cuối cùng, chức năng cuối cùng sao chép file keystore mới vào folder /etc/go (sau khi backup keystore cũ), điều chỉnh quyền sở hữu file và khởi động lại server GoCD.

Ở phần cuối của tập lệnh, ta kiểm tra xem tập lệnh có đang được gọi với các quyền thích hợp hay không bằng cách kiểm tra xem ID user hiệu quả có phải là “0” hay không, nghĩa là “có cùng các quyền như root”. Sau đó, gọi các chức năng theo thứ tự thích hợp để chuyển đổi chính xác các certificate và cài đặt file keystore mới.

Khi bạn hoàn tất, hãy lưu file để tiếp tục.

Thực hiện chuyển đổi ban đầu

Bây giờ ta có một tập lệnh chuyển đổi, ta nên sử dụng nó để thực hiện chuyển đổi certificate ban đầu.

Đầu tiên, đánh dấu tập lệnh là có thể thực thi để nó có thể được thực thi trực tiếp mà không cần gọi trình thông dịch:

  • sudo chmod +x /usr/local/bin/convert_certs_for_gocd.sh

Bây giờ, hãy gọi tập lệnh với sudo để thực hiện chuyển đổi ban đầu, cài đặt file keystore tạo và khởi động lại quy trình GoCD

  • sudo /usr/local/bin/convert_certs_for_gocd.sh

Vì server GoCD phải khởi động lại, quá trình này có thể mất một chút thời gian. Sau khi tập lệnh hoàn tất, có thể mất thêm một hoặc hai giây nữa trước khi server sẵn sàng lắng nghe kết nối. Bạn có thể xem các cổng hiện đang được các ứng dụng sử dụng bằng lệnh :

  • sudo watch netstat -plnt

Chế độ xem này sẽ hiển thị các cổng TCP mà các ứng dụng hiện đang nghe với tốc độ làm mới hai giây. Khi GoCD bắt đầu nghe các cổng 8153 và 8154, màn hình sẽ trông như thế này:

Output
Every 2.0s: netstat -plnt Thu Jul 27 20:16:20 2017 Active Internet connections (only servers) Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1736/sshd tcp6 0 0 :::22 :::* LISTEN 1736/sshd tcp6 0 0 :::8153 :::* LISTEN 8942/java tcp6 0 0 :::8154 :::* LISTEN 8942/java

Khi các cổng 8153 và 8154 xuất hiện, nhấn CTRL-C để thoát khỏi màn hình.

Sau khi ứng dụng bắt đầu lắng nghe các kết nối, hãy kiểm tra giao diện web bằng cách truy cập domain GoCD của bạn trên cổng 8154 bằng HTTPS:

https://example.com:8154 

Trước đây, khi trang này được truy cập, một biểu tượng trên thanh địa chỉ cho biết rằng certificate không thể tin cậy được ( lưu ý chỉ báo trực quan của trình duyệt của bạn có thể khác):

Biểu tượng certificate  SSL của Chrome không  tin cậy

Lần đầu tiên truy cập, bạn có thể phải nhấp qua màn hình cảnh báo trong trình duyệt của bạn :

Cảnh báo SSL của trình duyệt

Như vậy, ta đã thay thế certificate tự ký bằng certificate tin cậy do Let's Encrypt cung cấp, trình duyệt sẽ cho biết rằng certificate tin cậy và user sẽ không phải bỏ qua cảnh báo của trình duyệt để truy cập trang web. Lưu ý certificate trước đó có thể được trình duyệt của bạn lưu vào bộ nhớ đệm cho đến khi bạn đóng tab, cửa sổ hoặc phiên hiện tại của bạn :

Biểu tượng tin cậy certificate  SSL của Chrome

Điều này nghĩa là GoCD đã có thể sử dụng certificate Let's Encrypt mà ta đã chuyển đổi.

Cài đặt móc nối tự động gia hạn

Bây giờ ta đã xác minh tập lệnh của ta đã chuyển đổi nội dung certificate một cách chính xác, ta có thể đảm bảo certbot gọi tập lệnh của ta mỗi khi certificate được gia hạn.

Mở file cấu hình gia hạn cho domain của bạn trong folder /etc/letsencrypt/renewal bằng lệnh :

  • sudo nano /etc/letsencrypt/renewal/example.com.conf

Bên trong, trong phần [renewalparams] của file , hãy thêm cài đặt dòng renew_hook vào vị trí tập lệnh của bạn:

/etc/letsencrypt/renewal/example.com.conf
. . . [renewalparams] . . . renew_hook = /usr/local/bin/convert_certs_for_gocd.sh 

Phần mềm certbot cài đặt một cron việc cron để kiểm tra xem có bất kỳ certificate nào nên được gia hạn hai lần một ngày hay không. Sau khi certificate được gia hạn, tập lệnh được chỉ định bởi renew_hook sẽ được chạy. Bằng cách này, ta có thể đảm bảo GoCD luôn sử dụng certificate hợp lệ mới nhất có được từ Let's Encrypt.

Lưu file khi bạn hoàn tất.

Bạn có thể kiểm tra xem bạn không đưa ra bất kỳ lỗi cú pháp nào cho file bằng cách thực hiện chạy nhanh quy trình gia hạn. Lưu ý điều này sẽ không chạy tập lệnh chuyển đổi certificate của ta , nhưng nó sẽ in ra thông báo về việc nó bị bỏ qua:

  • sudo certbot renew --dry-run
Output
Saving debug log to /var/log/letsencrypt/letsencrypt.log ------------------------------------------------------------------------------- Processing /etc/letsencrypt/renewal/example.com.conf ------------------------------------------------------------------------------- Cert not due for renewal, but simulating renewal for dry run Renewing an existing certificate Performing the following challenges: http-01 challenge for example.com Waiting for verification... Cleaning up challenges Dry run: skipping renewal hook command: /usr/local/bin/convert_certs_for_gocd.sh ------------------------------------------------------------------------------- new certificate deployed without reload, fullchain is /etc/letsencrypt/live/example.com/fullchain.pem ------------------------------------------------------------------------------- ** DRY RUN: simulating 'certbot renew' close to cert expiry ** (The test certificates below have not been saved.) Congratulations, all renewals succeeded. The following certs have been renewed: /etc/letsencrypt/live/example.com/fullchain.pem (success) ** DRY RUN: simulating 'certbot renew' close to cert expiry ** (The test certificates above have not been saved.)

Kết quả ở trên xác minh những thay đổi ta đã thực hiện không ngăn cản việc gia hạn certificate . Kết quả kết quả cũng cho biết móc gia hạn được trỏ đến đúng vị trí tập lệnh.

Kết luận

Trong hướng dẫn này, ta đã đề cập đến hai cách khác nhau đảm bảo cài đặt GoCD bằng certificate SSL tin cậy từ Let's Encrypt. Phương pháp đầu tiên cài đặt certificate với Nginx và sau đó ủy quyền lưu lượng truy cập đến giao diện web của GoCD. Tùy chọn thứ hai đã chuyển đổi file certificate Let's Encrypt sang định dạng PKCS 12 và nhập chúng vào file kho khóa Java để GoCD sử dụng nguyên bản. Cả hai tùy chọn đều bảo mật giao diện web của GoCD bằng certificate tin cậy , nhưng chúng thực hiện điều này bằng cách sử dụng các chiến lược khác nhau và với sự đánh đổi duy nhất. Cách tiếp cận phù hợp với bạn sẽ phụ thuộc phần lớn vào yêu cầu và mục tiêu của group bạn.


Tags:

Các tin liên quan

Cách cài đặt và cấu hình GoCD trên Ubuntu 16.04
2017-08-01
Cách cài đặt và cấu hình SimpleSAMLphp để Xác thực SAML trên Ubuntu 16.04
2017-07-30
Cách sử dụng chế độ độc lập của Certbot để lấy chứng chỉ SSL mã hóa trên Ubuntu 16.04
2017-07-28
Cách sử dụng chế độ độc lập của Certbot để lấy chứng chỉ SSL mã hóa trên Ubuntu 16.04
2017-07-28
Cách cài đặt Virtualmin với Webmin, LAMP, BIND và PostFix trên Ubuntu 16.04
2017-07-26
Cách cài đặt Matrix Synapse trên Ubuntu 16.04
2017-07-21
Cách cài đặt Bro trên Ubuntu 16.04
2017-07-14
Cách thiết lập đường ống tích hợp liên tục với Concourse CI trên Ubuntu 16.04
2017-07-11
Cách cài đặt Ruby on Rails với RVM trên Ubuntu 16.04
2017-07-03
Cách thiết lập đường ống tích hợp liên tục với Drone trên Ubuntu 16.04
2017-06-28