개발노트

고즐의 개발 및 서버 개발 노트

서버에서 SSL 활성 여부와 남은 기간 자동 표시하기

# SSL # 무료인증서 # PHP개발 # 서버보안 # fullchainpem

PHP 2025.12.03 47 회 읽음
PHP 2일 전 47 회 읽음


Let’s Encrypt? 

공짜인데도 보안성 자체는 유료 인증서와 사실상 동일이다. 

HTTPS 암호화 강도 자체는 Let’s Encrypt가 유료 SSL과 똑같다. TLS 프로토콜, 공개키 암호화, 암호화 수준 전부 동일하게 적용된다. 

즉 사용자 브라우저와 서버 사이를 누가 까보는 건 똑같이 불가능하다.

단 구형 브라우저 사용자에게는 작동하지 않을 수 있으니 주의 가 필요하다.

보안 약한 인증서인 거 절대 아니다.


PHP로 Let’s Encrypt 인증서 정보 출력하기

서버에서 SSL 인증서의 활성 여부와 만료일을 PHP로 직접 읽어 표시하고 싶어 이번 작업을 진행했다. 인증서 파일 fullchain.pem은 root 권한으로만 읽기 가능해 초기에는 PHP 접근이 불가능했지만, 권한 수정과 certbot 갱신 훅을 설정해 자동화까지 완성했다.


fullchain.pem 접근 권한 문제 해결

Let’s Encrypt 인증서는 /etc/letsencrypt/live/ 경로에 위치하지만 실제 파일은 archive 폴더 아래에 심볼릭 링크로 연결된다. 따라서 권한을 live 폴더가 아닌 archive 폴더에 부여해야 PHP가 정상적으로 읽을 수 있다.

실제 파일 위치

/etc/letsencrypt/archive/goz.kr/fullchain1.pem

권한 확인

ls -l /etc/letsencrypt/archive/goz.kr/

fullchain.pem 읽기 권한 부여

sudo chmod 644 /etc/letsencrypt/archive/goz.kr/fullchain*.pem

디렉토리 접근 권한 설정

sudo chmod 755 /etc/letsencrypt/archive
sudo chmod 755 /etc/letsencrypt/archive/goz.kr
sudo chmod 755 /etc/letsencrypt/live
sudo chmod 755 /etc/letsencrypt/live/goz.kr


certbot 갱신 시 권한 자동 유지하기

Let’s Encrypt 인증서는 갱신될 때마다 새 fullchain.pem 파일이 생성되고, 기본 권한이 다시 root-only로 설정된다. 이를 해결하기 위해 renewal-hooks/deploy 스크립트에 권한 재설정을 추가해 자동화했다.

갱신 훅 스크립트 생성

sudo nano /etc/letsencrypt/renewal-hooks/deploy/sslfix.sh

스크립트 내용

#!/bin/bash

ARCHIVE="/etc/letsencrypt/archive/goz.kr"

chmod 644 $ARCHIVE/fullchain*.pem
chmod 755 /etc/letsencrypt/archive
chmod 755 /etc/letsencrypt/archive/goz.kr
chmod 755 /etc/letsencrypt/live
chmod 755 /etc/letsencrypt/live/goz.kr

실행 권한 설정

sudo chmod +x /etc/letsencrypt/renewal-hooks/deploy/sslfix.sh


PHP에서 인증서 정보 읽기

fullchain.pem이 읽기 가능해지면 openssl_x509_parse로 인증서 정보를 쉽게 파싱할 수 있다. 발급자, 시작일, 만료일, 남은 일수까지 모두 계산해 UI에 표시할 수 있다.

PHP 코드 예시

$path = "/etc/letsencrypt/live/goz.kr/fullchain.pem";
$cert = openssl_x509_parse(file_get_contents($path));

$issuer = $cert['issuer']['O'] ?? '';
$start  = date('Y-m-d', $cert['validFrom_time_t']);
$end    = date('Y-m-d', $cert['validTo_time_t']);
$days   = floor(($cert['validTo_time_t'] - time()) / 86400);

echo "SSL: Let’s Encrypt 활성 · 유효기간: {$start} ~ {$end} · 남은 {$days}일";


구현 완료 후 느낀 점

SSL 인증서 정보를 웹에서 직접 확인할 수 있게 되면서 관리 효율이 크게 향상되었다. 특히 만료일까지 남은 기간을 자동으로 노출함으로써 운영 리스크를 줄일 수 있다. 권한 문제 해결과 갱신 자동화는 복잡해 보이지만, 한 번 설정해두면 유지보수 부담이 거의 없다.


앞으로 다른 도메인에도 동일한 구조를 적용하고, 관리자 페이지에 SSL 만료 알림 기능까지 확장해볼 계획이다.