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
