Nay rảnh rổi admin xin chia sẻ cách check tình trạng ssl của tất cả domain trong server .domain nào còn ssl , hết ssl và còn bao nhiêu ngày rồi xuất ra file thống kê sau nay mình xin chia sẻ cách làm như sau
Bước 1 : Tạo file check_ssl.sh
nano /root/check_ssl.sh
rồi dán đoạn code dưới vào
#!/bin/bash # Script kiểm tra toàn diện SSL cho tất cả domain trên DirectAdmin # Tạo file: /root/check_ssl.sh # Cấp quyền: chmod +x /root/check_ssl.sh # Thiết lập màu sắc cho output terminal RED='\033[0;31m' YELLOW='\033[1;33m' GREEN='\033[0;32m' BLUE='\033[0;34m' NC='\033[0m' # No Color # Tạo thư mục lưu báo cáo REPORT_DIR="/root/ssl_reports" mkdir -p $REPORT_DIR REPORT_DATE=$(date +%Y%m%d_%H%M%S) REPORT_FILE="$REPORT_DIR/ssl_report_$REPORT_DATE.txt" HTML_REPORT="$REPORT_DIR/ssl_report_$REPORT_DATE.html" echo -e "${BLUE}=== BÁO CÁO KIỂM TRA SSL $(date) ===${NC}" | tee -a $REPORT_FILE echo "" | tee -a $REPORT_FILE # Khởi tạo file HTML cat > $HTML_REPORT << EOF <!DOCTYPE html> <html lang="vi"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Báo Cáo SSL - $(date +"%d/%m/%Y")</title> <style> body { font-family: Arial, sans-serif; margin: 20px; line-height: 1.6; } h1 { color: #2c3e50; text-align: center; } table { width: 100%; border-collapse: collapse; margin: 20px 0; } th, td { padding: 12px 15px; border: 1px solid #ddd; text-align: left; } th { background-color: #3498db; color: white; position: sticky; top: 0; } tr:nth-child(even) { background-color: #f2f2f2; } .expired { background-color: #ffcccc !important; color: #cc0000; font-weight: bold; } .warning { background-color: #fff4cc !important; color: #856404; } .valid { background-color: #d4edda !important; color: #155724; } .no-ssl { background-color: #e2e3e5 !important; color: #383d41; } .summary { margin-top: 30px; padding: 15px; background-color: #f8f9fa; border-radius: 5px; border: 1px solid #ddd; } .footer { margin-top: 30px; text-align: center; font-size: 0.8em; color: #6c757d; } </style> </head> <body> <h1>Báo Cáo Kiểm Tra Chứng Chỉ SSL</h1> <p><strong>Ngày tạo:</strong> $(date "+%d/%m/%Y %H:%M:%S")</p> <p><strong>Máy chủ:</strong> $(hostname -f)</p> <table> <thead> <tr> <th style="width: 5%;">STT</th> <th style="width: 45%;">Tên Miền</th> <th style="width: 50%;">Số Ngày Đến Hạn SSL</th> </tr> </thead> <tbody> EOF # Lấy danh sách domain từ DirectAdmin echo -e "${BLUE}Đang lấy danh sách domain từ DirectAdmin...${NC}" # Phương pháp 1: Từ thư mục user DOMAINS=() for USER_DIR in /usr/local/directadmin/data/users/*; do if [ -d "$USER_DIR" ]; then USER=$(basename "$USER_DIR") # Bỏ qua tài khoản hệ thống if [[ "$USER" != "admin" && "$USER" != "reseller" ]]; then if [ -f "$USER_DIR/domains.list" ]; then while read domain; do DOMAINS+=("$domain") done < "$USER_DIR/domains.list" fi fi fi done # Phương pháp 2: Từ cấu hình Apache (nếu phương pháp 1 không đủ) if [ ${#DOMAINS[@]} -eq 0 ]; then echo -e "${YELLOW}Không tìm thấy domain từ DirectAdmin, đang thử phương pháp khác...${NC}" | tee -a $REPORT_FILE # Lấy từ thư mục vhosts for VHOST in /etc/httpd/conf/vhosts/*; do if [ -d "$VHOST" ]; then domain=$(basename "$VHOST") DOMAINS+=("$domain") fi done fi # Nếu vẫn không tìm thấy domain nào, thử phương pháp cuối cùng if [ ${#DOMAINS[@]} -eq 0 ]; then echo -e "${YELLOW}Vẫn không tìm thấy domain, đang thử phương pháp cuối...${NC}" | tee -a $REPORT_FILE # Lấy từ document root for DIR in /var/www/html/*; do if [ -d "$DIR" ]; then domain=$(basename "$DIR") DOMAINS+=("$domain") fi done fi # Loại bỏ các domain trùng lặp UNIQUE_DOMAINS=($(echo "${DOMAINS[@]}" | tr ' ' '\n' | sort -u | tr '\n' ' ')) echo -e "${GREEN}Tìm thấy ${#UNIQUE_DOMAINS[@]} domain để kiểm tra.${NC}" | tee -a $REPORT_FILE echo "" | tee -a $REPORT_FILE # Đếm số lượng TOTAL_DOMAINS=${#UNIQUE_DOMAINS[@]} VALID_SSL=0 EXPIRED_SSL=0 EXPIRING_SOON=0 NO_SSL=0 INVALID_CHAIN=0 # Kiểm tra từng domain COUNT=1 for domain in "${UNIQUE_DOMAINS[@]}"; do echo -e "${BLUE}Đang kiểm tra: ${domain}${NC}" | tee -a $REPORT_FILE # Tìm đường dẫn chứng chỉ SSL SSL_PATHS=( "/etc/httpd/conf/ssl/${domain}.crt" "/etc/httpd/conf/ssl.crt/${domain}.crt" "/usr/local/directadmin/data/users/*/domains/${domain}.cert" "/etc/letsencrypt/live/${domain}/cert.pem" ) SSL_PATH="" for path in "${SSL_PATHS[@]}"; do # Sử dụng find để hỗ trợ wildcard found_path=$(find ${path%/*} -name "${path##*/}" 2>/dev/null | head -n 1) if [ -n "$found_path" ]; then SSL_PATH=$found_path break fi done if [ -n "$SSL_PATH" ]; then # Kiểm tra ngày hết hạn if ! EXPIRY_DATE=$(openssl x509 -in "$SSL_PATH" -noout -enddate 2>/dev/null | cut -d= -f2); then echo -e " ${RED}[LỖI] Không thể đọc chứng chỉ SSL${NC}" | tee -a $REPORT_FILE # Thêm vào báo cáo HTML - Không thể đọc SSL echo "<tr class=\"no-ssl\">" >> $HTML_REPORT echo " <td>$COUNT</td>" >> $HTML_REPORT echo " <td>$domain</td>" >> $HTML_REPORT echo " <td>Lỗi: Không thể đọc chứng chỉ SSL</td>" >> $HTML_REPORT echo "</tr>" >> $HTML_REPORT NO_SSL=$((NO_SSL+1)) COUNT=$((COUNT+1)) continue fi EXPIRY_EPOCH=$(date -d "$EXPIRY_DATE" +%s) CURRENT_EPOCH=$(date +%s) DAYS_LEFT=$(( ($EXPIRY_EPOCH - $CURRENT_EPOCH) / 86400 )) if [ $DAYS_LEFT -lt 0 ]; then echo -e " ${RED}[LỖI] Chứng chỉ SSL đã hết hạn ($DAYS_LEFT ngày)${NC}" | tee -a $REPORT_FILE # Thêm vào báo cáo HTML - SSL hết hạn echo "<tr class=\"expired\">" >> $HTML_REPORT echo " <td>$COUNT</td>" >> $HTML_REPORT echo " <td>$domain</td>" >> $HTML_REPORT echo " <td>Đã hết hạn ($DAYS_LEFT ngày)</td>" >> $HTML_REPORT echo "</tr>" >> $HTML_REPORT EXPIRED_SSL=$((EXPIRED_SSL+1)) elif [ $DAYS_LEFT -lt 30 ]; then echo -e " ${YELLOW}[CẢNH BÁO] Chứng chỉ SSL sắp hết hạn (còn $DAYS_LEFT ngày)${NC}" | tee -a $REPORT_FILE # Thêm vào báo cáo HTML - SSL sắp hết hạn echo "<tr class=\"warning\">" >> $HTML_REPORT echo " <td>$COUNT</td>" >> $HTML_REPORT echo " <td>$domain</td>" >> $HTML_REPORT echo " <td>Sắp hết hạn (còn $DAYS_LEFT ngày)</td>" >> $HTML_REPORT echo "</tr>" >> $HTML_REPORT EXPIRING_SOON=$((EXPIRING_SOON+1)) else echo -e " ${GREEN}[OK] Chứng chỉ SSL còn hạn (còn $DAYS_LEFT ngày)${NC}" | tee -a $REPORT_FILE # Thêm vào báo cáo HTML - SSL hợp lệ echo "<tr class=\"valid\">" >> $HTML_REPORT echo " <td>$COUNT</td>" >> $HTML_REPORT echo " <td>$domain</td>" >> $HTML_REPORT echo " <td>Còn hạn ($DAYS_LEFT ngày)</td>" >> $HTML_REPORT echo "</tr>" >> $HTML_REPORT VALID_SSL=$((VALID_SSL+1)) fi else echo -e " ${YELLOW}[THÔNG TIN] Không tìm thấy chứng chỉ SSL cho domain này${NC}" | tee -a $REPORT_FILE # Thêm vào báo cáo HTML - Không có SSL echo "<tr class=\"no-ssl\">" >> $HTML_REPORT echo " <td>$COUNT</td>" >> $HTML_REPORT echo " <td>$domain</td>" >> $HTML_REPORT echo " <td>Không tìm thấy chứng chỉ SSL</td>" >> $HTML_REPORT echo "</tr>" >> $HTML_REPORT NO_SSL=$((NO_SSL+1)) fi echo -e "${BLUE}----------------------------${NC}" | tee -a $REPORT_FILE COUNT=$((COUNT+1)) done # Hoàn thành file HTML với thông tin tóm tắt cat >> $HTML_REPORT << EOF </tbody> </table> <div class="summary"> <h2>Tóm Tắt Báo Cáo</h2> <p><strong>Tổng số domain kiểm tra:</strong> ${TOTAL_DOMAINS}</p> <p><strong>SSL hợp lệ:</strong> ${VALID_SSL}</p> <p><strong>SSL sắp hết hạn:</strong> ${EXPIRING_SOON}</p> <p><strong>SSL đã hết hạn:</strong> ${EXPIRED_SSL}</p> <p><strong>Không có SSL:</strong> ${NO_SSL}</p> </div> <div class="footer"> <p>Báo cáo được tạo tự động bởi Script Kiểm Tra SSL</p> <p>Ngày tạo: $(date "+%d/%m/%Y %H:%M:%S")</p> </div> </body> </html> EOF # Tóm tắt báo cáo trên terminal echo "" | tee -a $REPORT_FILE echo -e "${BLUE}=== TÓM TẮT BÁO CÁO ===${NC}" | tee -a $REPORT_FILE echo -e "Tổng số domain kiểm tra: ${TOTAL_DOMAINS}" | tee -a $REPORT_FILE echo -e "${GREEN}SSL hợp lệ: ${VALID_SSL}${NC}" | tee -a $REPORT_FILE echo -e "${YELLOW}SSL sắp hết hạn: ${EXPIRING_SOON}${NC}" | tee -a $REPORT_FILE echo -e "${RED}SSL đã hết hạn: ${EXPIRED_SSL}${NC}" | tee -a $REPORT_FILE echo -e "${YELLOW}Không có SSL: ${NO_SSL}${NC}" | tee -a $REPORT_FILE echo "" | tee -a $REPORT_FILE echo -e "${GREEN}Báo cáo văn bản đã được lưu tại: ${REPORT_FILE}${NC}" echo -e "${GREEN}Báo cáo HTML đã được lưu tại: ${HTML_REPORT}${NC}"
Bước 2 : chmod ,đánh lệnh chmod +x /root/check_ssl.sh
chmod +x /root/check_ssl.sh
Bước 3 : chạy nó
bash /root/check_ssl.sh
Thành quả

chúc các bạn thành công