🔥 패키지 컬렉션 서명으로 안전하게 보호하기

298자
5분

만약 여러분이 패키지 컬렉션을 만들었다면, 누군가 내용을 함부로 바꾸지 못하도록 서명할 수 있어요. SwiftPM은 서명된 컬렉션을 가져오기 전에 서명이 유효한지 꼭 확인해요. 만약 다음 조건 중 하나라도 맞지 않으면 오류 메시지를 보여준답니다:

  • 서명을 제외한 파일 내용이 서명을 만들 때 사용된 것과 똑같아야 해요. 쉽게 말해서 서명한 후에 컬렉션 내용이 변경되지 않았는지 확인하는 거죠.
  • 서명에 사용된 인증서가 모든 요구사항을 만족해야 해요.
$ swift package-collection add <https://www.example.com/bad-packages.json>
컬렉션의 서명이 유효하지 않습니다. 계속 진행하려면 '--skip-signature-check' 옵션을 추가해 명령을 다시 실행하세요.
shell

서명 오류가 발생해도 사용자는 --skip-signature-check 옵션을 추가해서 컬렉션을 추가할 수 있어요:

$ swift package-collection add <https://www.example.com/packages.json> --skip-signature-check
shell

웹에 호스팅된 패키지 컬렉션의 경우, 제작자는 SwiftPM에게 서명을 필수로 요구하도록 할 수 있어요. 만약 서명이 필요한 패키지 컬렉션에 서명이 없다면, 사용자는 다음과 같은 오류 메시지를 보게 될 거예요:

$ swift package-collection add <https://www.example.com/bad-packages.json>
필수 서명이 없는 컬렉션입니다. 내용이 변조되었을  있어요.
shell

이런 경우에는 패키지 컬렉션을 추가하면 안돼요!

신뢰할 수 있는 루트 인증서

컬렉션 서명을 만들려면 인증서가 필요하죠. 그래서 서명을 검증할 때는 인증서와 인증서 체인도 함께 확인하고, 루트 인증서가 신뢰할 만한지도 살펴봐요.

애플 플랫폼에서는 OS에 기본 설치된 모든 루트 인증서를 자동으로 신뢰해요. 추가로 신뢰할 인증서가 있다면 ~/.swiftpm/config/trust-root-certs 디렉터리에 넣으면 됩니다.

애플 이외의 플랫폼에서는 기본적으로 신뢰하는 루트 인증서가 없어요. 인증서 고정(certificate-pinning ) 설정에 포함된 것 말고는 말이죠. 오직 ~/.swiftpm/config/trust-root-certs에 있는 인증서만 신뢰한답니다. 그래서 trust-root-certs 디렉터리를 설정하지 않으면 서명 검증은 항상 실패해요.

$ swift package-collection add <https://www.example.com/packages.json>
설정이 없어서 컬렉션 서명을 검증할  없습니다.
shell

사용자는 제작자의 루트 인증서를 받아서 ~/.swiftpm/config/trust-root-certs에 저장하면, 그 제작자와 제작자가 만든 모든 컬렉션을 명시적으로 신뢰할 수 있어요. 루트 인증서는 DER로 인코딩되어야 합니다. SwiftPM은 루트 아래의 모든 인증서 체인을 신뢰하기 때문에, 설치된 루트에 따라 일부 제작자는 이미 암묵적으로 신뢰되고 있을 수도 있답니다. 그럴 때는 사용자가 일일이 지정해줄 필요가 없겠죠?

이렇게 패키지 컬렉션 서명으로 우리의 Swift 프로젝트를 더 안전하게 관리할 수 있습니다.