상세 컨텐츠

본문 제목

SSL 설정 (.pem과 .ca의 차이)

서버/Linux

by 라이언 칸 2025. 3. 27. 11:56

본문

갑자기 사이트에 문제가 발생했다.

그래서 확인해 보니 curl에서 문제가 발생하고 있었다. (codeigniter4에서 curl에서 문제가 발생해 기록된 로그 기록이다.

CRITICAL - 2025-03-20 12:09:34 --> cURL error 60: SSL certificate problem: certificate has expired (see https://curl.haxx.se/libcurl/c/libcurl-errors.html) for https://xxx_org/graphql

 

그래서 확인했더니, ssl 인증서가 만료되었었다. 그래서 새로이 ssl 인증서를 생성하고 난뒤 다시 지정했다.

이때 받은 파일 목록이다. (koreassl 에서 받은 파일이다.)

xxx_org.crt # 발급받은 서버 인증서 파일
xxx_org.csr # 서명 요청 파일(Certificate Signing Request)
xxx_org__rsa.key # 개인 키 파일
xxx_org__crt.pem # 중간 인증서(체인) 파일
xxx_org.ca # 체인 인증서 (추가로 전달 받음)

 

 

000-default.conf

<VirtualHost *:443>
	.....

  SSLEngine on
  SSLCertificateFile /etc/ssl/certs/xxx_org.crt
  SSLCertificateKeyFile /etc/ssl/private/xxx_org__rsa.key
  SSLCertificateChainFile /etc/ssl/certs/xxx_org__crt.pem
</VirtualHost>

 

이렇게 설정하고 브라우저상에서 접근할 경우에는 정상적인 것처럼 https가 붙어서 작동했다.

하지만 curl을 사용하는 곳에서는 아래처럼 오류를 발생시켰다. (pem파일을 ChainFile 로 지정했으나 발생한 오류)

 

CRITICAL - 2025-03-20 10:01:26 --> cURL error 60: SSL certificate problem: unable to get local issuer certificate (see https://curl.haxx.se/libcurl/c/libcurl-errors.html) for https://xxx_org/graphql

 

이는 xxx_org__crt.pem 파일에는 중간 인증 기관(Intermediate CA)의 인증서가 없거나 불완전했을 가능성이 높다.

그냥 ssl 발급기관(인증기관)의 신뢰도가 낮으면 pem을 사용하지 말고, ca 파일을 이용해서 구성해야 한다.

 

pem에 중간 인증기관의 인증서가 있으면 위 설정도 문제없이 작동할 것이다.

pem 파일을 열어봐서 여러 개의 ----BEGIN CERTIFICATE-----와 ----END CERTIFICATE----- 블록이 있다면 인증서와 체인이 포함된 파일이고, 하나만 있다면 인증서 블록만 있다면 단일 인증서 파일이라고 보면 된다.

 

 <VirtualHost *:443>
	.....
    SSLEngine on
    SSLCertificateFile /etc/ssl/cert/xxx_org.crt
    SSLCertificateKeyFile /etc/ssl/cert/xxx_org__rsa.key
    SSLCertificateChainFile /etc/ssl/cert/xxx_org.ca
</VirtualHost>

 

반면 xxx_org.ca 파일은 중간 인증 기관의 인증서를 올바르게 포함하고 있어 인증서 체인이 완성되어 정상적으로 작동하게 된다.

초기부터 ca 파일이 있으면 문제가 되지 않았는데, 클라이언트가 ca 파일은 없다고 해서 그냥 pem파일을 이용하면서 발생한 문제였다.