이 포스트에서는 사설 IP(예: 192.168.0.2) 환경에서 Nextcloud 서버에 자가 서명 인증서를 설정하고, 80번 포트를 제거하여 443번 포트(HTTPS)만 사용하는 방법을 설명합니다. 또한, 인증서 만료를 방지하기 위한 자동 갱신 스크립트를 설정하는 과정도 포함합니다.
1. 자가 서명 인증서 생성
OpenSSL을 사용하여 인증서와 개인 키를 생성합니다.
sudo mkdir -p /etc/ssl/certs /etc/ssl/private
sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 \
-keyout /etc/ssl/private/nextcloud.key \
-out /etc/ssl/certs/nextcloud.crt \
-subj "/C=KR/ST=Seoul/L=Seoul/O=MyOrg/OU=IT/CN=192.168.0.2"
sudo chmod 644 /etc/ssl/certs/nextcloud.crt
sudo chmod 600 /etc/ssl/private/nextcloud.key
위 명령은 1년 유효한 인증서를 생성하며, CN은 서버의 사설 IP(192.168.0.2)로 설정합니다.
2. Apache 설정 (80번 포트 제거, 443번 포트 사용)
Apache에서 80번 포트를 비활성화하고 443번 포트만 사용하도록 설정합니다.
2.1. ports.conf 수정
sudo nano /etc/apache2/ports.conf
내용을 다음과 같이 설정하여 중복 Listen 지시어를 제거:
Listen 443
2.2. 가상 호스트 설정
Nextcloud의 DocumentRoot가 /var/www/html/nextcloud에 있다고 가정하고 설정 파일을 수정:
sudo nano /etc/apache2/sites-available/nextcloud-ssl.conf
<VirtualHost *:443>
ServerName 192.168.0.2
DocumentRoot /var/www/html/nextcloud
SSLEngine on
SSLCertificateFile /etc/ssl/certs/nextcloud.crt
SSLCertificateKeyFile /etc/ssl/private/nextcloud.key
<Directory /var/www/html/nextcloud>
Options +FollowSymlinks
AllowOverride All
Require all granted
</Directory>
ErrorLog ${APACHE_LOG_DIR}/nextcloud_error.log
CustomLog ${APACHE_LOG_DIR}/nextcloud_access.log combined
</VirtualHost>
설정을 활성화하고 Apache를 재시작:
sudo a2enmod ssl headers
sudo a2ensite nextcloud-ssl
sudo a2dissite 000-default
sudo systemctl restart apache2
2.3. ServerName 경고 해결
FQDN 경고를 제거하기 위해 전역 ServerName 설정:
sudo nano /etc/apache2/apache2.conf
파일 끝에 추가:
ServerName 192.168.0.2
3. Nextcloud 설정
Nextcloud가 HTTPS를 사용하도록 설정:
sudo nano /var/www/html/nextcloud/config/config.php
<?php
$CONFIG = array (
'trusted_domains' =>
array (
0 => 'localhost',
1 => '192.168.0.2',
2 => 'nextcloud.local',
),
'overwriteprotocol' => 'https',
);
?>
HTTPS 강제:
sudo -u www-data php /var/www/html/nextcloud/occ config:system:set overwriteprotocol --value="https"
4. 인증서 자동 갱신
인증서 만료를 방지하기 위해 자동 갱신 스크립트를 설정합니다.
sudo nano /usr/local/bin/renew-self-signed-cert.sh
#!/bin/bash
# Configuration
CERT_DIR="/etc/ssl/certs"
KEY_DIR="/etc/ssl/private"
CERT_FILE="$CERT_DIR/nextcloud.crt"
KEY_FILE="$KEY_DIR/nextcloud.key"
DAYS_VALID=365
SUBJECT="/C=KR/ST=Seoul/L=Seoul/O=MyOrg/OU=IT/CN=192.168.0.2"
WEB_SERVER="apache2"
DAYS_THRESHOLD=30
# Function to check certificate expiration
check_cert_expiry() {
if [ ! -f "$CERT_FILE" ]; then
echo "Certificate does not exist. Generating new one."
return 1
fi
EXPIRY_DATE=$(openssl x509 -enddate -noout -in "$CERT_FILE" | cut -d= -f2)
EXPIRY_EPOCH=$(date -d "$EXPIRY_DATE" +%s)
CURRENT_EPOCH=$(date +%s)
DAYS_LEFT=$(( (EXPIRY_EPOCH - CURRENT_EPOCH) / 86400 ))
if [ "$DAYS_LEFT" -le "$DAYS_THRESHOLD" ]; then
echo "Certificate expires in $DAYS_LEFT days. Renewing..."
return 1
else
echo "Certificate is valid for $DAYS_LEFT days. No renewal needed."
return 0
fi
}
# Function to generate new certificate
generate_cert() {
echo "Generating new self-signed certificate..."
sudo openssl req -x509 -nodes -days "$DAYS_VALID" -newkey rsa:2048 \
-keyout "$KEY_FILE" -out "$CERT_FILE" -subj "$SUBJECT"
if [ $? -eq 0 ]; then
echo "Certificate generated successfully."
else
echo "Failed to generate certificate."
exit 1
fi
}
# Function to reload web server
reload_web_server() {
if [ "$WEB_SERVER" = "apache2" ]; then
sudo systemctl reload apache2
elif [ "$WEB_SERVER" = "nginx" ]; then
sudo systemctl reload nginx
else
echo "Unsupported web server: $WEB_SERVER"
exit 1
fi
echo "Web server reloaded."
}
# Main logic
check_cert_expiry
if [ $? -eq 1 ]; then
generate_cert
reload_web_server
fi
스크립트 실행 권한 부여:
sudo chmod +x /usr/local/bin/renew-self-signed-cert.sh
Cron 작업으로 매주 갱신 확인:
sudo crontab -e
0 0 * * 1 /usr/local/bin/renew-self-signed-cert.sh >> /var/log/cert-renewal.log 2>&1
로그 파일 생성:
sudo touch /var/log/cert-renewal.log
sudo chmod 644 /var/log/cert-renewal.log
5. 방화벽 설정
80번 포트를 차단하고 443번 포트만 허용:
sudo ufw deny 80
sudo ufw allow 443
sudo ufw reload
6. 테스트
설정 후 다음 명령어로 테스트:
# Apache 상태 확인
sudo systemctl status apache2
# 인증서 확인
openssl x509 -in /etc/ssl/certs/nextcloud.crt -text -noout
# HTTPS 접속 테스트
curl -k https://192.168.0.2
브라우저에서 https://192.168.0.2로 접속하여 확인. "안전하지 않은 연결" 경고 시 "고급" → "계속 진행" 선택.
7. 추가 팁
- HSTS 활성화: HTTPS를 강제하기 위해
nextcloud-ssl.conf에 추가:Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains"sudo a2enmod headers sudo systemctl restart apache2 - 브라우저 경고 제거: 인증서를 클라이언트에 설치:
sudo cp /etc/ssl/certs/nextcloud.crt /tmp/nextcloud.crt - 로컬 DNS: 공유기가 NAT 루프백을 지원하지 않으면 Pi-hole로
nextcloud.local을192.168.0.2로 매핑.
결론
이 과정을 통해 사설 IP 환경에서 Nextcloud를 HTTPS로 안전하게 설정하고, 인증서 자동 갱신을 구현했습니다. 문제가 발생하면 Apache 오류 로그(/var/log/apache2/nextcloud_error.log)를 확인하세요.
'리눅스 리뷰 > ubuntu' 카테고리의 다른 글
| 우분투에서 NetworkManager 설치 및 이더넷 인터페이스 연동 (0) | 2025.08.19 |
|---|---|
| ZFS를 활용한 Proxmox NVMe 디스크 설정 및 Nextcloud 연동 가이드 (0) | 2025.06.01 |
| Proxmox에 Ubuntu 경량 설치 가이드 (0) | 2025.05.31 |