Cài SSL cho Zimbra Mail

Cài SSL cho Zimbra Mail

Cài SSL cho Zimbra Mail một cách tự động bằng Bash script

Tên tệp: zimbra_letsencrypt.sh
Cách sử dụng:

  1. Cấp quyền thực thi: chmod +x zimbra_letsencrypt.sh
  2. Chỉnh sửa các biến cấu hình ở đầu tệp (như EMAIL, ZIMBRA_FQDN) phù hợp với môi trường của bạn.
  3. Chạy lệnh với quyền root hoặc qua sudo: sudo ./zimbra_letsencrypt.sh
#!/usr/bin/env bash
#
# Tự động lấy chứng chỉ Let’s Encrypt và triển khai lên Zimbra.
#
# LƯU Ý / MIỄN TRỪ TRÁCH NHIỆM:
#   1. Tập lệnh này chỉ được kiểm thử trên một số phiên bản/biến thể hệ điều hành giới hạn.
#   2. Hãy tùy chỉnh tập lệnh nếu bạn dùng môi trường/hệ điều hành khác.
#   3. Luôn sao lưu môi trường Zimbra trước khi chạy các công cụ tự động.
#   4. Bạn tự chịu trách nhiệm khi sử dụng tập lệnh này!set -euo pipefail

# ------------------ THIẾT LẬP BIẾN NGƯỜI DÙNG (CẦN CHỈNH SỬA NẾU CẦN) ------------------

# Địa chỉ email của bạn dùng cho Certbot (bỏ qua nếu dùng --register-unsafely-without-email)
EMAIL="admin@sysadminskills.com"

# FQDN (tên miền đầy đủ) chính được dùng bởi Zimbra (vd: mail.example.com)
ZIMBRA_FQDN="$(hostname -f)"

# Thêm tên miền khác nếu Zimbra dùng nhiều hostname
# Ví dụ:
# EXTRA_DOMAINS=(-d alias1.example.com -d alias2.example.com)
EXTRA_DOMAINS=()

# Đường dẫn đến chứng chỉ Let’s Encrypt (mặc định của Certbot)
CERTBOT_LIVE_PATH="/etc/letsencrypt/live"

# Chuỗi chứng chỉ ưa thích từ Let’s Encrypt
LE_PREFERRED_CHAIN="ISRG Root X1"

# Thư mục lưu trữ các tệp chứng chỉ Let’s Encrypt trong Zimbra
ZIMBRA_LE_PATH="/opt/zimbra/ssl/letsencrypt"

# ---------------------------------------------------------------------

# Hàm xác định hệ điều hành và cài đặt Certbot
install_certbot() {
echo ">>> Đang phát hiện hệ điều hành và cài đặt Certbot..."

# Đọc /etc/os-release (nếu có)
if [[ -f /etc/os-release ]]; then
. /etc/os-release
DIST_ID="$ID"
DIST_VER="$VERSION_ID"
else
echo "Không thể phát hiện hệ điều hành. Vui lòng cài đặt Certbot thủ công."
return
fi

case "$DIST_ID" in
ubuntu|debian)
echo ">>> Cài đặt Certbot trên Debian/Ubuntu..."
apt-get update -y
# Sử dụng snap để có phiên bản Certbot mới nhất
apt-get install -y snapd
snap install --classic certbot
ln -s /snap/bin/certbot /usr/bin/certbot || true
;;
centos|rhel|rocky|almalinux)
echo ">>> Cài đặt Certbot trên RHEL/CentOS/AlmaLinux/Rocky..."
yum install -y epel-release
yum install -y certbot
;;
*)
echo "Hệ điều hành không được hỗ trợ: $DIST_ID. Vui lòng cài Certbot thủ công rồi chạy lại."
;;
esac

echo ">>> Hoàn tất cài đặt Certbot hoặc đã tồn tại sẵn."
certbot --version || echo "Cảnh báo: Không tìm thấy certbot trong PATH!"
}

# Hàm dừng dịch vụ proxy/mailboxd của Zimbra
stop_zimbra_services() {
echo ">>> Đang dừng dịch vụ proxy và mailboxd của Zimbra..."
sudo -u zimbra zmproxyctl stop || true
sudo -u zimbra zmmailboxdctl stop || true
}

# Hàm lấy chứng chỉ Let’s Encrypt
obtain_letsencrypt_cert() {
echo ">>> Đang lấy chứng chỉ Let’s Encrypt cho ${ZIMBRA_FQDN} ..."

# Xây dựng danh sách miền
local DOMAIN_ARGS=(-d "${ZIMBRA_FQDN}")
if [[ ${#EXTRA_DOMAINS[@]} -gt 0 ]]; then
DOMAIN_ARGS+=("${EXTRA_DOMAINS[@]}")
fi

# Nếu không muốn dùng email, thay bằng:
# --register-unsafely-without-email
if [[ -z "$EMAIL" ]]; then
echo ">>> Không có địa chỉ email, sử dụng --register-unsafely-without-email"
EMAIL_ARG="--register-unsafely-without-email"
else
EMAIL_ARG="-m $EMAIL"
fi

# Chạy certbot ở chế độ standalone (đảm bảo cổng 80/443 không bị chiếm dụng)
certbot certonly \
--standalone \
--preferred-chain "${LE_PREFERRED_CHAIN}" \
--force-renewal \
--preferred-challenges http \
--agree-tos \
-n \
${EMAIL_ARG} \
--keep-until-expiring \
--key-type rsa \
"${DOMAIN_ARGS[@]}"

echo ">>> Đã hoàn thành yêu cầu chứng chỉ. Kiểm tra thông báo từ certbot ở trên."
}

# Hàm chuẩn bị và triển khai chứng chỉ vào Zimbra
deploy_certificate_to_zimbra() {
echo ">>> Đang chuẩn bị và triển khai chứng chỉ Let’s Encrypt lên Zimbra..."

# Tạo thư mục nếu chưa tồn tại
mkdir -p "${ZIMBRA_LE_PATH}"

# Sao chép chứng chỉ Let’s Encrypt sang thư mục của Zimbra
cp -f "${CERTBOT_LIVE_PATH}/${ZIMBRA_FQDN}/"*.pem "${ZIMBRA_LE_PATH}/"

# Tạo file chain
echo ">>> Tạo tệp zimbra_chain.pem bằng cách nối thêm root CA của Let’s Encrypt..."
cat "${CERTBOT_LIVE_PATH}/${ZIMBRA_FQDN}/chain.pem" > "${ZIMBRA_LE_PATH}/zimbra_chain.pem"

# Tải xuống ISRG Root X1 và nối vào (nếu cần, hoặc có thể dùng bản local sẵn)
wget -O /tmp/ISRG-X1.pem https://letsencrypt.org/certs/isrgrootx1.pem.txt
cat /tmp/ISRG-X1.pem >> "${ZIMBRA_LE_PATH}/zimbra_chain.pem"
rm -f /tmp/ISRG-X1.pem

# Thiết lập quyền sở hữu và phân quyền
chown -R zimbra:zimbra "${ZIMBRA_LE_PATH}"
chmod 640 "${ZIMBRA_LE_PATH}"/*pem || true

echo ">>> Xác minh chứng chỉ vừa lấy có khớp với khoá riêng (private key) hay không..."
sudo -u zimbra /opt/zimbra/bin/zmcertmgr verifycrt comm \
"${ZIMBRA_LE_PATH}/privkey.pem" \
"${ZIMBRA_LE_PATH}/cert.pem" \
"${ZIMBRA_LE_PATH}/zimbra_chain.pem"

echo ">>> Sao lưu các chứng chỉ hiện tại của Zimbra..."
cp -a /opt/zimbra/ssl/zimbra /opt/zimbra/ssl/zimbra.$(date "+%Y%m%d-%H%M%S")

echo ">>> Sao chép private key sang commercial.key"
cp -f "${ZIMBRA_LE_PATH}/privkey.pem" /opt/zimbra/ssl/zimbra/commercial/commercial.key
chown zimbra:zimbra /opt/zimbra/ssl/zimbra/commercial/commercial.key
chmod 640 /opt/zimbra/ssl/zimbra/commercial/commercial.key

echo ">>> Triển khai chứng chỉ mới..."
sudo -u zimbra /opt/zimbra/bin/zmcertmgr deploycrt comm \
"${ZIMBRA_LE_PATH}/cert.pem" \
"${ZIMBRA_LE_PATH}/zimbra_chain.pem"
}

# Hàm khởi động lại Zimbra
restart_zimbra() {
echo ">>> Đang khởi động lại các dịch vụ Zimbra..."
sudo -u zimbra zmcontrol restart
}

# ---------------------- LUỒNG CHÍNH CỦA TẬP LỆNH -----------------------------
echo "----------------------------------------------------------------------"
echo " Tự động hoá lấy chứng chỉ Let’s Encrypt cho máy chủ Zimbra "
echo "----------------------------------------------------------------------"
echo "1) Cài đặt Certbot (nếu chưa có)"
install_certbot

echo
echo "2) Dừng các dịch vụ Zimbra (proxy & mailboxd)"
stop_zimbra_services

echo
echo "3) Lấy/gia hạn chứng chỉ Let’s Encrypt"
obtain_letsencrypt_cert

echo
echo "4) Triển khai chứng chỉ Let’s Encrypt lên Zimbra"
deploy_certificate_to_zimbra

echo
echo "5) Khởi động lại dịch vụ Zimbra"
restart_zimbra

echo
echo ">>> HOÀN TẤT! Máy chủ Zimbra của bạn giờ đã sử dụng chứng chỉ Let’s Encrypt."
echo ">>> Vui lòng kiểm tra bằng trình duyệt hoặc các công cụ kiểm tra SSL với tên miền: ${ZIMBRA_FQDN}."

Giải thích cách thức hoạt động

  1. Cài đặt Certbot
    • Xác định phiên bản hệ điều hành từ file /etc/os-release (chia thành hai nhóm chính: Debian/Ubuntu và RHEL/CentOS).
    • Cài đặt Certbot tương ứng (qua snap trên Ubuntu/Debian hoặc yum trên RHEL-based).
    • Nếu gặp hệ điều hành không hỗ trợ, script sẽ yêu cầu bạn cài Certbot thủ công.
  2. Dừng Proxy & Mailboxd trong Zimbra
    • Dịch vụ Zimbra cần dừng lắng nghe trên cổng 80/443 để Certbot có thể khởi tạo ở chế độ standalone.
  3. Lấy chứng chỉ Let’s Encrypt
    • Sử dụng lệnh certbot certonly --standalone với tùy chọn ép buộc gia hạn (--force-renewal).
    • Sửa các biến ở đầu file như EMAIL, ZIMBRA_FQDN, EXTRA_DOMAINS để phù hợp.
    • Nếu không dùng email, bạn có thể thay thế bằng --register-unsafely-without-email.
  4. Triển khai chứng chỉ vào Zimbra
    • Sao chép chứng chỉ lấy được từ /etc/letsencrypt/live/$ZIMBRA_FQDN/.
    • Tạo zimbra_chain.pem để kết hợp cả chain và root CA.
    • Dùng zmcertmgr verifycrt để xác thực chứng chỉ khớp với khoá riêng.
    • Sao lưu thư mục SSL hiện tại của Zimbra kèm timestamp.
    • Sao chép private key thành commercial.key của Zimbra.
    • Dùng zmcertmgr deploycrt comm để cài đặt và cấu hình chứng chỉ mới trong Zimbra.
  5. Khởi động lại Zimbra
    • Khởi động lại toàn bộ dịch vụ của Zimbra để áp dụng chứng chỉ mới.

Mẹo: Để tự động hoá gia hạn, bạn có thể lên lịch chạy kịch bản này (hoặc một phần) trong crontab hoặc thông qua systemd timer. Bạn cũng cần đảm bảo cổng 80/443 không bị chiếm trong lúc Certbot chạy hoặc có thể cân nhắc sử dụng chế độ webroot (nếu bạn có HTTP server đang chạy).

Cuối cùng, hãy luôn kiểm tra lại các cấu hình DNS, đặc biệt là bản ghi CAA, cũng như xác thực tên miền chính xác trỏ về máy chủ của bạn trước khi thực hiện yêu cầu chứng chỉ.

Chúc bạn triển khai thành công!

Để lại một bình luận

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *