Dẹp bỏ cảnh báo ‘Not Secure’: Cách cài Let’s Encrypt cho VMware ESXi bằng ACME

VMware tutorial - IT technology blog
VMware tutorial - IT technology blog

Tại sao phải sống chung với cảnh báo đỏ lòm trên trình duyệt?

Dùng ESXi lâu năm, chắc hẳn anh em đã quá quen với cái ổ khóa gạch chéo đỏ lòm mỗi khi đăng nhập. Nhìn thì quen mắt, nhưng lỗi NET::ERR_CERT_AUTHORITY_INVALID cực kỳ phiền phức khi làm automation hoặc tích hợp hệ thống giám sát. Hồi mới quản lý cụm 8 host ESXi, mình hay tặc lưỡi bỏ qua vì nghĩ mạng nội bộ thì an toàn. Tuy nhiên, chứng chỉ tự ký (self-signed) chính là kẽ hở cho các cuộc tấn công Man-in-the-Middle (MitM) nếu mạng LAN bị xâm nhập.

Các trình duyệt hiện đại ngày càng khắt khe với vấn đề bảo mật. Một chứng chỉ “xịn” giúp hệ thống chuyên nghiệp và hỗ trợ gọi API mượt mà hơn. Thay vì chi vài trăm USD mua chứng chỉ từ các CA lớn, mình sẽ hướng dẫn anh em dùng ACME protocol để lấy Let’s Encrypt hoàn toàn miễn phí. Mọi thứ sẽ được tự động hóa từ khâu cấp phát đến gia hạn.

Chuẩn bị công cụ

ESXi chạy trên nền tảng BusyBox nên việc cài script trực tiếp lên host là ý tưởng tồi. Script có thể bị xóa sạch sau mỗi lần cập nhật firmware hoặc reboot. Giải pháp tốt nhất là dùng một máy trung gian (VM Ubuntu hoặc Debian) để chạy script lấy chứng chỉ, sau đó đẩy lên ESXi qua SSH.

1. Cài đặt ACME.sh trên máy quản lý

Trên máy Linux trung gian, anh em cài đặt acme.sh. Đây là công cụ nhẹ và mạnh nhất để làm việc với Let’s Encrypt hiện nay.

curl https://get.acme.sh | sh -s [email protected]
source ~/.bashrc

2. Mở cửa cho ESXi

Trước tiên, hãy bật SSH trên host ESXi. Bạn vào Manage > Services > TSM-SSH và nhấn Start. Đừng quên trỏ một bản ghi DNS (A record) về IP của host, ví dụ: esxi01.yourdomain.com.

Cấu hình cấp phát và triển khai chứng chỉ

Do host ESXi thường nằm trong vùng an toàn và không mở port 80, chúng ta sẽ dùng DNS-01 Challenge. Cách này xác thực quyền sở hữu tên miền qua bản ghi TXT, vừa nhàn vừa bảo mật.

Bước 1: Kết nối API DNS Provider

Mình ưu tiên dùng Cloudflare vì tốc độ cập nhật bản ghi rất nhanh. Nếu dùng GoDaddy hay Namecheap, anh em hãy tra cứu biến môi trường tương ứng. Với Cloudflare, hãy chạy lệnh export thông tin sau:

export CF_Token="your_cloudflare_api_token"
export CF_Account_ID="your_account_id"

Bước 2: Request chứng chỉ mới

Chạy lệnh sau để lấy chứng chỉ. Hãy thay tên domain bằng địa chỉ thực tế của bạn.

acme.sh --issue --dns dns_cf -d esxi01.yourdomain.com

Sau khi hoàn tất, file chứng chỉ sẽ nằm tại thư mục ~/.acme.sh/esxi01.yourdomain.com/.

Bước 3: Đẩy chứng chỉ lên host ESXi

ESXi lưu SSL tại /etc/vmware/ssl/ với hai file: rui.crtrui.key. Hãy backup file cũ trước khi ghi đè để tránh rủi ro.

# Backup nhanh trên ESXi
ssh root@esxi-ip "cp /etc/vmware/ssl/rui.crt /etc/vmware/ssl/rui.crt.bak && cp /etc/vmware/ssl/rui.key /etc/vmware/ssl/rui.key.bak"

Tiến hành copy file mới từ máy trung gian sang:

# Copy cert và key
scp ~/.acme.sh/esxi01.yourdomain.com/fullchain.cer root@esxi-ip:/etc/vmware/ssl/rui.crt
scp ~/.acme.sh/esxi01.yourdomain.com/esxi01.yourdomain.com.key root@esxi-ip:/etc/vmware/ssl/rui.key

Bước 4: Áp dụng thay đổi

Để ESXi nhận chứng chỉ mới mà không cần reboot cả server, anh em chỉ cần restart dịch vụ quản trị. Việc này không làm gián đoạn các máy ảo đang chạy.

ssh root@esxi-ip "/sbin/services.sh restart"

Giao diện web sẽ mất kết nối khoảng 30 giây. Sau đó, bạn có thể đăng nhập lại bình thường.

Kiểm tra kết quả và Tự động hóa

Hãy tải lại trang quản trị ESXi. Nếu thấy ổ khóa màu xanh và thông tin từ Let’s Encrypt, bạn đã thành công. Tuy nhiên, chứng chỉ này chỉ có hạn 90 ngày.

Bí kíp ở đây là tạo một script nhỏ và đặt cronjob chạy hàng tháng. Script sẽ tự động issue lại certificate và scp lên host.

# Script mẫu renew-esxi.sh
#!/bin/bash
acme.sh --renew -d esxi01.yourdomain.com
scp ~/.acme.sh/esxi01.yourdomain.com/fullchain.cer [email protected]:/etc/vmware/ssl/rui.crt
scp ~/.acme.sh/esxi01.yourdomain.com/esxi01.yourdomain.com.key [email protected]:/etc/vmware/ssl/rui.key
ssh [email protected] "/sbin/services.sh restart"

Kinh nghiệm của mình là luôn dùng DNS-01 challenge vì nó cực kỳ ổn định. Bạn không cần bận tâm đến việc mở port firewall hay cấu hình NAT phức tạp. Nếu quản lý hàng chục host, hãy dùng Ansible để đẩy hàng loạt, sẽ tiết kiệm được rất nhiều thời gian.

Share: