Cách check tình trạng ssl của tất cả domain trong server

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ả

Cách check tình trạng ssl của tất cả domain trong server
Cách check tình trạng ssl của tất cả domain trong server

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

0 0 đánh giá
Đánh giá bài viết
Theo dõi
Thông báo của
guest
0 Góp ý
Cũ nhất
Mới nhất Được bỏ phiếu nhiều nhất
Phản hồi nội tuyến
Xem tất cả bình luận