APT 업데이트 오류 해결: Sury GPG 키 갱신

데비안에서 APT 업데이트 중 Sury 저장소의 EXPKEYSIG 오류가 발생하면 서명 검증에 사용하는 GPG 공개키를 확인해야 한다. 기존 저장소 설정과 키 파일의 위치를 확인하고, Sury 공식 키링 패키지를 직접 내려받아 설치한 뒤 signed-by 옵션으로 사용할 키링을 지정한다. 전역 신뢰 키링과 저장소별 키 지정 방식의 차이부터 패키지 목록 갱신의 정상화 확인까지 실제 복구 과정을 설명한다.

APT 업데이트가 안 된다

데비안 계열 리눅스 시스템에서 특정한 기능을 설치할 때는 흔히 APT를 사용한다. 본 필자가 데비안을 사용하는 큰 이유 중 하나이기도 한데, APT의 패키지 관리 기능은 참 편리하다.

하지만 언제나 모든 작업이 한 방에 끝나는 것은 아니다. 본 필자가 가동하던 데비안 리눅스 서버에 패키지를 설치하는 과정에서 다음과 같은 에러 메시지를 만나게 되었다. 데비안의 편리함에 길들여진 상태에서 이런 메시지를 만나면 일단 당황하기 마련이다.

debian@eqmaker:~$ sudo apt-get update
Hit:1 http://deb.debian.org/debian bookworm InRelease
Hit:2 http://deb.debian.org/debian bookworm-updates InRelease                                 
Hit:3 http://security.debian.org/debian-security bookworm-security InRelease                  
Get:4 https://packages.sury.org/php bookworm InRelease [6,136 B]                              
Err:4 https://packages.sury.org/php bookworm InRelease
  The following signatures were invalid: EXPKEYSIG B188E2B695BD4743 DEB.SURY.ORG Automatic Signing Key <deb@sury.org>
Reading package lists... Done
W: An error occurred during the signature verification. The repository is not updated and the previous index files will be used. GPG error: https://packages.sury.org/php bookworm InRelease: The following signatures were invalid: EXPKEYSIG B188E2B695BD4743 DEB.SURY.ORG Automatic Signing Key <deb@sury.org>
W: Failed to fetch https://packages.sury.org/php/dists/bookworm/InRelease  The following signatures were invalid: EXPKEYSIG B188E2B695BD4743 DEB.SURY.ORG Automatic Signing Key <deb@sury.org>
W: Some index files failed to download. They have been ignored, or old ones used instead.
debian@eqmaker:~$

문제의 원인

하지만 대부분의 경우 에러 메시지를 잘 읽는 것만으로도 바로 원인 파악이 가능하다. 문제의 핵심 원인은 아래의 한 줄에 잘 나타나 있다.

The following signatures were invalid: EXPKEYSIG B188E2B695BD4743 DEB.SURY.ORG Automatic Signing Key <deb@sury.org>

즉, APT가 Sury 리포지토리(Repository, 패키지 저장소)의 서명을 검증하는 데 실패했다는 이야기다. Debian의 APT는 업데이트 목록을 받아 올 때 GPG(GNU Privacy Guard) 키를 이용해 리포지토리의 서명을 검증하고, 검증 과정에 문제가 생기면 해당 저장소의 목록을 거부한다.

본 필자가 서버를 처음 설치한 이후로 몇 차례 Sury 리포지토리의 키가 업데이트되었고, 서버에는 업데이트 전의 키 정보가 저장되어 있었다. 결국 키가 맞지 않아 검증에 실패하고 APT 패키지 목록 갱신이 막힌 것이다.

문제의 해결 방법

원인을 찾았으니 해결 방법은 간단하다. 만료된 GPG 공개키를 유효한 키로 갱신해 주면 된다. 가장 간단한 방법은 새로운 공개키를 서버의 전역 신뢰 키링에 등록하는 것이다. 실제로도 이런 방식을 많이 사용한다.

하지만 이 방법에는 단점이 존재한다. 시스템의 전역 신뢰 키링에 등록된 공개키는 특정 리포지토리에만 사용하도록 제한되지 않기 때문에, 다른 패키지의 서명 검증에도 사용될 수 있다는 점이다. 예를 들어 Sury용 공개키를 전역 신뢰 키링에 등록하면 APT는 이 키를 Sury에만 한정하지 않고 다른 리포지토리의 서명 검증에도 사용할 수 있게 된다.

때문에 APT 저장소의 GPG 키를 별도로 지정할 수 있는 signed-by 옵션을 이용해 키링에 등록해 주기로 한다.

GPG 공개키 갱신 절차

Step1. 현재 키링 환경 확인

일단 내 서버의 어디에 Sury의 키가 있는지 그 위치와, 키가 어떤 방식으로 등록되어 있는지부터 확인해야 한다. APT의 저장소 목록은 /etc/apt/sources.list와 /etc/apt/sources.list.d/에 들어 있다.


debian@eqmaker:~$ grep -R -n -E 'packages\.sury\.org|signed-by|Signed-By' /etc/apt/sources.list /etc/apt/sources.list.d/
/etc/apt/sources.list.d/sury-php.list:1:deb https://packages.sury.org/php/ bookworm main

뒤져보니 /etc/apt/sources.list.d/sury-php.list에 sury가 등록되어 있고, signed-by이 붙어 있지 않아 별도의 전용 키링은 사용하지 않는 상태이다. 다음으로 sury의 키 파일을 찾아본다.

debian@eqmaker:~$ ls -l /usr/share/keyrings/*sury* /etc/apt/trusted.gpg.d/*sury*
-rw-r--r-- 1 root root 1769 Feb  5  2024  /etc/apt/trusted.gpg.d/sury.gpg

/etc/apt/trusted.gpg.d/ 에 GPG 파일이 있는 것을 찾았다. 결론적으로 별도의 Sury 전용 키링을 지정하지 않고 시스템의 전역 키링을 사용하고 있는 것이다.

Step2. Sury 키 설치

다음 차례로 현재 사용 중인 Sury의 키를 가져와야 한다. Sury의 공식 키링 패키지인 debsuryorg-archive-keyring를 설치하면 되는데 당장은 APT를 사용할 수 없기 때문에 직접 다운로드해 주어야 한다.

debian@eqmaker:~$ curl -fSL -o /tmp/debsuryorg-archive-keyring.deb https://packages.sury.org/debsuryorg-archive-keyring.deb
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  7180  100  7180    0     0   170k      0 --:--:-- --:--:-- --:--:--  171k
debian@eqmaker:~$

다운로드받은 패키지 파일을 dpkg 명령을 이용해 설치해 준다.

debian@eqmaker:~$ sudo dpkg -i /tmp/debsuryorg-archive-keyring.deb
Selecting previously unselected package debsuryorg-archive-keyring.
(Reading database ... 106853 files and directories currently installed.)
Preparing to unpack .../debsuryorg-archive-keyring.deb ...
Unpacking debsuryorg-archive-keyring (2025.11.18) ...
Setting up debsuryorg-archive-keyring (2025.11.18) ...
debian@eqmaker:~$

Step3. Sury 키 변경

Sury 키링 패키지를 설치하면 Sury에서 제공하는 여러 패키지들에 대한 GPG 파일들이 생겨난다.

debian@eqmaker:~$ ls -l /usr/share/keyrings/*sury*
	-rw-r--r-- 1 root root 3182 Nov 18  2025 /usr/share/keyrings/deb.sury.org-apache2.gpg
	-rw-r--r-- 1 root root 3182 Nov 18  2025 /usr/share/keyrings/debsuryorg-archive-keyring.gpg
	-rw-r--r-- 1 root root 3182 Nov 18  2025 /usr/share/keyrings/deb.sury.org-bind-dev.gpg
	-rw-r--r-- 1 root root 3182 Nov 18  2025 /usr/share/keyrings/deb.sury.org-bind-esv.gpg
	-rw-r--r-- 1 root root 3182 Nov 18  2025 /usr/share/keyrings/deb.sury.org-bind.gpg
	-rw-r--r-- 1 root root 3182 Nov 18  2025 /usr/share/keyrings/deb.sury.org-nginx.gpg
	-rw-r--r-- 1 root root 3182 Nov 18  2025 /usr/share/keyrings/deb.sury.org-nginx-mainline.gpg
	-rw-r--r-- 1 root root 3182 Nov 18  2025 /usr/share/keyrings/deb.sury.org-php.gpg
	debian@eqmaker:~$
deb.sury.org-apache2.gpg
Sury의 Apache2 패키지 저장소 서명 검증용 키링.
debsuryorg-archive-keyring.gpg
Sury에서 제공하는 패키지 저장소의 서명 검증에 사용하는 통합 키링.
deb.sury.org-bind-dev.gpg
BIND DNS 서버의 개발 버전 패키지 저장소 서명 검증용 키링.
deb.sury.org-bind-esv.gpg
BIND DNS 서버의 ESV(Extended Support Version, 확장 지원 버전) 패키지 저장소 서명 검증용 키링.
deb.sury.org-bind.gpg
Sury의 일반 BIND DNS 서버 패키지 저장소 서명 검증용 키링.
deb.sury.org-nginx.gpg
Sury의 Nginx 웹 서버 패키지 저장소 서명 검증용 키링.
deb.sury.org-nginx-mainline.gpg
Sury의 Nginx Mainline 버전 패키지 저장소 서명 검증용 키링.
deb.sury.org-php.gpg
Sury의 PHP 패키지 저장소 서명 검증용 키링.

각 목적에 맞는 파일을 이용해 등록해 주면 된다. 본 필자는 sury에 대한 통합 키인 debsuryorg-archive-keyring.gpg를 사용했다.

위에서 확인한 sury의 GPG 키 설정이 들어 있는 /etc/apt/sources.list.d/sury-php.list 파일을 에디터로 연다.

sudo nano /etc/apt/sources.list.d/sury-php.list

기존 GPG 등록 정보를 수정해 준다. 본 필자의 경우 수정 전에는 deb https://packages.sury.org/php/ bookworm main의 형태였다. 이를 다음과 같이 수정해 준다.

deb [signed-by=/usr/share/keyrings/debsuryorg-archive-keyring.gpg] https://packages.sury.org/php/ bookworm main

수정을 마치고 파일을 저장해 준다.

Step4. APT 업데이트 정상화 확인

apt-get update를 실행하여 저장소의 패키지 목록이 정상적으로 갱신되는지 확인한다.

debian@eqmaker:~$ sudo apt-get update
	Get:1 https://packages.sury.org/php bookworm InRelease [6,136 B]
	Get:2 https://packages.sury.org/php bookworm/main amd64 Packages [290 kB]
	Hit:3 http://security.debian.org/debian-security bookworm-security InRelease
	Hit:4 http://deb.debian.org/debian bookworm InRelease
	Hit:5 http://deb.debian.org/debian bookworm-updates InRelease
	Fetched 290 kB in 3s (105 kB/s)
	Reading package lists... Done
	debian@eqmaker:~$

앞서 발생했던 EXPKEYSIG B188E2B695BD4743 오류가 사라졌으며, Sury 저장소의 InRelease와 Packages 파일도 정상적으로 다운로드되었다.

특히 Reading package lists... Done 메시지와 함께 별도의 경고 없이 명령이 종료된 것을 확인할 수 있다. 새로운 GPG 키링을 통한 서명 검증이 정상적으로 이루어졌으며, APT의 패키지 목록 갱신 기능이 복구된 것이다.

마무리

데비안 계열의 APT는 정말 편리한 도구이다. 명령줄 하나만 적어주면 의존성을 알아서 확인해서 필요한 패키지들을 한 번에 싹 설치해 준다. 하지만 반대로 너무 익숙해지면 어.. 왜 안되.. 이거 뭐야…하면서 당황해할 수 있다. (그렇다. 본 필자 이야기다.)

APT의 리포지토리 인증키 갱신은 종종 발생한다. 문제는 오랜만의 업데이트에 이런 메시지를 만나게 되면 당황하게 되는 경우가 있다는 것이다. 그렇다고 패키지 업데이트에 손을 놔 버리면 결국 내 서버는 침략자들의 좋은 먹잇감이 되어 광활한 인터넷 환경 한복판에 덩그러니 놓이게 된다.

적절한 키 관리 방법을 적용해 서버를 언제나 최신 상태로 유지하고, 보안 문제를 미연에 방지할 수 있어야 두 발을 뻗고 잠을 잘 수 있을 것이다.

FAQ

GPG 키와 키링은 무엇이 다른가?
키는 전자서명을 생성하거나 검증하는 데 사용하는 암호화 정보이며, APT는 공개키를 사용해 저장소의 서명을 검증한다. 키링은 이러한 키를 담아 관리하는 파일이나 저장 공간으로, 하나의 키링에 여러 공개키를 포함할 수 있다. 즉, 키링 파일은 공개키를 담는 그릇이고, signed-by는 해당 저장소의 서명 검증에 사용할 키링을 지정하는 옵션이다.
APT 업데이트 중 EXPKEYSIG 오류가 발생하는 이유는?
EXPKEYSIG는 저장소 서명에 사용된 키가 만료되었음을 나타낸다. 서버에 저장된 공개키가 오래된 상태라면 서명 검증에 실패할 수 있으므로, 공식 키링 패키지로 공개키를 갱신하고 해당 저장소가 사용할 키링을 확인해야 한다.
APT에서 서명 검증에 실패하면 모든 패키지를 설치할 수 없는가?
반드시 그런 것은 아니다. 문제가 발생한 저장소의 최신 패키지 목록을 받아오지 못하고, 기존 목록이 있으면 이를 계속 사용할 수 있다. 다른 정상적인 저장소까지 모두 사용할 수 없게 되는 것은 아니지만, 오류가 발생한 저장소의 최신 패키지 정보를 신뢰할 수 있는 상태로 갱신하려면 서명 검증 문제를 해결해야 한다.
Sury GPG 공개키는 어떻게 갱신하는가?
Sury에서 제공하는 debsuryorg-archive-keyring 패키지를 다운로드해 dpkg -i로 설치한다. 이후 APT 저장소 설정의 signed-by 옵션에 설치된 키링 파일의 경로를 지정하고, sudo apt-get update를 실행해 정상적으로 갱신되는지 확인한다.
debsuryorg-archive-keyring 패키지는 왜 직접 다운로드해 설치하는가?
서명 검증 오류로 Sury 저장소의 최신 패키지 목록을 받아오지 못하면, 기존 목록의 상태에 따라 APT를 통한 키링 패키지 설치나 갱신이 원활하지 않을 수 있다. 이 글에서는 저장소 목록 갱신에 의존하지 않고 공개키를 갱신하기 위해 curl로 공식 키링 패키지를 직접 다운로드하고 dpkg로 설치했다.
APT 저장소 설정의 signed-by 옵션은 어떤 역할을 하는가?
해당 저장소의 서명을 검증하는 데 사용할 키링을 지정한다. 이 글에서는 Sury 저장소 설정에 키링 파일의 경로를 명시하여, 해당 파일에 포함된 공개키로 저장소의 서명을 검증하도록 설정했다.
전역 신뢰 키링 대신 signed-by 옵션을 사용하는 이유는?
전역 신뢰 키링인 /etc/apt/trusted.gpg.d/에 등록한 키는 signed-by로 검증 키를 제한하지 않은 다른 저장소의 서명 검증에도 사용될 수 있다. 저장소별로 signed-by를 지정하면 각 저장소에서 신뢰할 키의 범위를 제한하여, 특정 저장소용 키를 다른 저장소에서도 신뢰하게 되는 문제를 줄일 수 있다.
Sury 키링 패키지를 설치하면 저장소 설정도 자동으로 변경되는가?
키링 패키지 설치와 기존 저장소 설정의 변경은 별도로 확인해야 한다. 이 글에서는 패키지 설치 후 /etc/apt/sources.list.d/sury-php.list를 직접 수정하여 signed-by 옵션과 사용할 키링 파일의 경로를 지정했다.
Sury GPG 키 갱신이 정상적으로 완료되었는지 확인하는 방법은?
sudo apt-get update를 실행하여 기존의 EXPKEYSIG 오류와 서명 검증 경고가 사라졌는지 확인한다. Sury 저장소의 패키지 목록을 정상적으로 받아오고, 별도의 오류나 경고 없이 명령이 종료되면 목록 갱신이 복구된 것으로 판단할 수 있다.