이번에 리멤버 Windows 데스크톱 버전을 개발하면서 처음으로 exe 파일로 설치 파일을 만들고 웹에 배포해 보았습니다. 이 글에서는 처음으로 설치 파일을 웹에 배포하는 과정 그리고 예상하지 못했던 난관에 대하여 설명해보려 합니다.
앱 개발을 완성하고 설치 파일까지 만들었다고 모든 것이 끝났다고 생각하시면 안됩니다. 별 생각 없이 설치 파일을 웹에 게시하고 웹페이지에서 다운을 받으면 다음과 같은 화면들을 만나게 됩니다.
만약 사용자들이 이런 메시지를 본다면 기껏 열심히 만들어 놓은 앱이 악성 프로그램 취급받게 될 것입니다. 자, 앱 개발은 끝났을 지라도 앱 배포는 이제부터 시작입니다. 이 배포에 걸리는 시간은 생각하는 것보다 오래 걸립니다.
전자 서명
배포를 하기 위하여 제일 먼저 해야할 것은 전자 서명입니다. 전자 서명의 원리 설명은 네이버 개발자 블로그에 친절하고 자세히 나와 있습니다. 간략하게 설명을 하자면, 코드 서명 인증서(Code Signing Certificate)를 가지고 서명한 파일은 내가 만든 파일임을 인증해주는 원산지 표시와 비슷합니다. 예를 들어 해커들이 리멤버와 똑같이 생긴 악성 설치파일을 만들어서 리멤버인 것처럼 배포를 하여도 드라마앤컴퍼니가 만들었다는 인증서가 없으므로 사용자들은 위험한 파일임을 알 수 있습니다.
전자 서명을 하기 위해서 처음으로 해야 할 일은 코드 서명 인증서를 구하는 일입니다. 아쉽게도 전자 서명은 무료가 아니라 유료로 Symantec과 같은 인증서 발급 업체에서 회사 혹은 개인 정보를 인증받고 코드 서명 인증서(Code signing certificate)를 구매해야 합니다.
인증서 종류도 표준(Standard)과 EV로 두 가지 종류가 있습니다. MSDN에서 표준과 EV 인증서의 차이, 그리고 구매 방법들에 대하여 읽어보실 수 있습니다. EV 인증서가 가격이 더 비싸며 대부분의 경우에는 표준을 사용하셔도 무방합니다.
이제 구매한 인증서와 MS에서 제공하는 SignTool.exe를 가지고 우리가 만든 프로그램을 서명합시다. SignTool에서는 다양한 인자들을 제공하는데 API 문서를 읽어 보시고 필요한 부분들을 사용하시면 됩니다. 저의 경우에는 다음 인자들을 사용했습니다.
>./Signtool.exe sign /a /f "{인증서 경로}" /p "{인증서 비밀번호}" /t "{인증서에 따른 Timestamp 서버 주소 예) http://timestamp.verisign.com/scripts/timestamp.dll}"
이렇게 서명을 완료하면 다음과 같이 뭔가 부족해 보이던 설치파일이
다음과 같이 든든하게 변합니다.
<올.바.른. 인증서입니다.>
그렇다고 이제 끝일까요? 저도 여기서 끝이라고 생각했습니다.. 이렇게 파일을 다시 서버에 올려서 다운 받아도 마찬가지로 IE와 Chrome은 여전히 우리의 파일을 위험하다고 얘기합니다. 서명이 잘못되었나.. 설마 비싼 인증서 잘못 구매한 건가.. 하루 종일 구글링을 하고 이곳 저곳에 수소문해봐도 명쾌한 답이 나오지 않았습니다. 그러다 결국은 설마 했던 ‘명성이 부족하다’라는 결론을 내리게 되었습니다.
명성치
MS의 SmartScreen filter는 인증서들에 대한 자체적인 white list DB를 관리하며 해당 인증서가 안전한지 아닌지 판단합니다. 새로 등록된 인증서로 만들어진 파일이 일정 횟수 이상, 일정 기간 이상 동안, 일정 사용자들에게 다운로드 되고, 신고 건수가 없어야 안전한 파일로 white list에 등록합니다(SmartScreen filter는 원래 IE에 존재하던 기능이었다가 Windows 8부터는 OS 자체 기능으로도 추가되었습니다). Google의 Chrome도 이와 비슷한 로직을 가지고 있습니다.
즉, 일정 수준을 명성을 쌓기 전까지는 위험한 프로그램 취급을 하여 사용자들에게 경고 메시지를 보여 줍니다. 하지만 여기서 답답한 부분은 필요한 ‘다운로드 수’, ‘다운로드 인원’, ‘처리되는 기간’ 등 중요한 정보들이 공개 되어있지 않다는 것입니다.
저희는 회사 직원(약 25명)에게 Chrome과 IE로 다운로드 요청을 몇차례에 걸쳐서 했습니다. IE의 SmartScreen은 처음 전사원이 받은 후 이틀 뒤에 통과됐습니다. 그리고 다시 전사원이 다운로드를 받았고 약 1주일 뒤에 Chrome에서 통과했습니다. 그 이후로는 일부 사용자들에게 미리 공개를 하여 받게 했습니다. Windows 8 이상부터 생긴 OS자체의 ScreenFilter는 꽤 오랜 시간이 걸렸던 것 같습니다. 확실한 방법과 시간은 알 수 없지만 여유롭게 약 2~3주간 소수의 베타 테스터들에게 뿌려야 하는 시간을 염두해야 할 것 같습니다(누군가 위험판 프로그램이라고 신고를 하지 않는다는 가정하에).
마무리
주위에 Windows 개발자 분들도 찾기 힘들지만 ‘최초로 인증서를 발급받아 배포를 경험’해본 분은 더더욱 찾기 힘들어서 많은 애를 먹었습니다. 사실 아직도 불확실한 시간에 무작정 기다려야 한다는 것 자체가 매우 마음에 들지는 않습니다. 그리고 인증서가 만료되어 새로운 인증서를 발급받으면 이 과정을 똑같이 한 번 더 거쳐야 하므로 이왕이면 유효기간이 긴 인증서를 사용하지 게 좋을 것 같습니다. 마지막으로 저희는 이렇게 인증을 받았지만, 이 방법을 제가 잘못 알고 있는 것이라면 꼭 알려주시면 감사하겠습니다 🙂 (개인적으로는 꼭 더 효율적인 방법이 있었으면 합니다).
참고 링크
MSDN 블로그의 스마트 스크린과 코드 서명 이야기
http://blogs.msdn.com/b/ie/archive/2012/08/14/microsoft-smartscreen-amp-extended-validation-ev-code-signing-certificates.aspx
‘Chrome도 몇 일 기다리면 된다’ 라는 토의 thread
http://blogs.msdn.com/b/ie/archive/2012/08/14/microsoft-smartscreen-amp-extended-validation-ev-code-signing-certificates.aspx
많은 도움이 되었습니다
감사합니다
윈도우 데스크탑 프로그램 배포시 디지털 서명 때문에 고생중인데
먼저 시행착오를 겪은 내용을 알려주셔서 고맙습니다.
정말 좋은 정보 감사합니다.
블로그에 좀 퍼가겠습니다. (출처 작성자 모두 밝힘)
감사합니다.
감사합니다 도움이 많이 됐네요 글좀 퍼가겠습니다. 감사합니다
관련 글들이 적어서 정보찾기가 어려웠는데 자세히 적어주셔서 감사합니다. 만약 프로그램을 수정하여 재 배포를 해야 할 경우에는 위와 같은 방법으로 한번 샀던 인증서로 다시 서명을 하면 되는건가요?? 답변주시면 감사하겠습니다 🙂
공인인증서 사용 가능한가요?
죄송하지만 꼭 드리고 싶은말씀이 있어요.
공부를 많이하시거나, 기초이론을 마스터 하신후 해당 글을 작성하는게 좋을것 같아요. 윈도우를 얼마나 하셨는지는 모르겠지만 드라이버 개발자 입장에서 볼때는 일정부분만 알고 작성한 글로 보여지네요. 인증서 부분은 드라이버 개발자에게는 기초과정에 포함되어있죠. 화이팅하세요.
전 그렇게 생각하지 않습니다. 시행착오 과정을 알게 되었다는 것만으로도 배우는 입장에선 방향이라도 잡을 수 있어요. 정상윤 님은 인증서 부분은 드라이버 개발자로서 기초과정이라고 표현하셨는데 정상윤님이 그 기초 부분 여기 써 주실건 아니잖아요? 댓글로 이 글의 잘못된 부분을 지적해주시거나 보강하는 내용을 쓰셨다면 별 말 안 드렸을텐데 그것도 아니고 잘 모르면 글을 쓰지 말라는 늬앙스에 눈살이 찌푸려지네요. 저도 화이팅 하세요.
2017년 10월 20일 at 8:50 오후 – 응답
정말 좋은 정보 감사합니다.
블로그에 좀 퍼가겠습니다. (출처 작성자 모두 밝힘)
감사합니다.
기분이 나쁘셨다면 너무 죄송합니다. 그렇게 말씀드리려고 한게 아닙니다.
그리고 누구에게나 잘하는 부분이 있습니다. 절대 무시하지 않습니다.
단지 그것이 진실이라면 그것에 대한 문제점도 작성하는 편이 좋을 것 같아서! 조금 나쁘게 표현된
것 같아 죄송합니다. 사람들은 그것을 믿고, 수행하겠지만 그것에 따른 피해를 본다면 어떻게 될까요?
잘 아시다시피 서명부분은 함부로 작성하기가 더 어렵게 느껴지더라구요 ^^
사실 저도 블로그에 작성한 글이 많았습니다. 하지만 드라이버 개발을 하면서 좀더 겸손해 지더라구요, 글을 함부로 작성할 수가 없어지더라구요. 어떠한 문제가 발생했을 때 논리적이지 못했을때, 모순이 생기더라구요. 그래서 문제가 생기면 반드시 문제를 유발하는 녀석까지 반드시 논리적으로 설명했을 때 그 가치가 있다라고 판단이 들더라구요. 즉 MS의 SmartScreen filter 는 신빙성이 있냐는 뜻이죠?
한가지 예를 들어 본다면
기존에 유명한 대기업의 .exe, .sys 등 서명된 인증서를 해킹하여, 대기업 인증서로 .exe 서명하여, 재배포시 SmartScreen filter 는 그것을 white list 로 생각할까요? 아직 실험은 안해봤지만 Pass가 나올 수도 있을 것 같아요. 그래서 저의 개인적인 생각은 SmartScreen filter도 인증서도 모두 안정하다고 볼 수 없다는 말이죠. 그것은 노출의 가능성이 높다는 겁니다.
그리고 .sys 커널 드라이버도 모두 신임할 수 없습니다. 그럼 응용프로그램은 더 신임할 수 없다는 말이 되겠죠.
기분나쁘셨다면 너무 죄송하구요, 저의 마음을 알아주신다면 조금 이해가 될꺼라 믿습니다.
제가 최근에 만든 블로그 인데요. 내용은 별로 없습니다. 나중에 예전에 작성한 카페글 모순글 모두 제거 후 내용 업데이트 할께요. 서로 궁금한거 공유하시죠. ^^
감사합니다.
으아 이러지맙시다 ㅜㅜ 나중에 이불킥차요 저도 윈도플랫폼만 20년가까이 개발중인데 마소의 온갖 인증서관련 가이드들은 대부분 쓰잘데기 없는 그들만의 리그에요 코드서명에 대한 원론적인 개념은 글쓴이 정도만 이해하고 있으면 충분합니다 (그래도 혹시 모르죠 마소플랫폼 달달 외우고 있으면 코드서명의 달인이라 불러줄지)
좋은 내용감사합니다. 이 글로 인해서 관련 내용을 검색하는데 도움이 되었습니다.
보다 자세한 정보를 원하시면 “스마트스크린 평판” 또는 “Application Reputation”으로 검색하시면
많은 내용이 있습니다.
시마텍에서는 이런 문제 때문에 관련 상품도 판매하고 있는 것 같네요.
EV 인증서를 사용하면 기본 평판(?)이 좀 높은 것 같네요.
하지만 정확한 기준이 발표되지 않아서 신뢰하기는 힘듭니다.
좋은 정보 잘 읽고 갑니다. 이것 때문에 많은 자료를 찾고 있었는데. 저에게 많은 도움이 되었습니다.
감사합니다.
글 잘일고 갑니다. 내용이 잘 작성한것 같습니다. 저는 많은 도움이 되었습니다.
개인적으로 이런 글이 많은 사람들에게 도움되는 글이라고 생각합니다.
좋은하루 보내세요
저는 업무에서 사용할 진짜 간단한 프로그램 만들었는데 이걸 회사 팀원들에게 공유하려니까 윈도우 디펜더가 막아버리네요 ㅜㅜ 뭐 제가 전문개발자도 아니고 프로그램도 파이썬으로 끽해야 30줄 이내라…. 인증서 구매해서 하는 것도 좀 오바같고 어떻게 해야할지 고민입니다. 일단 회사 IT부서랑 연락은 하고 있는데 별것도 아닌걸로 귀찮게 해드리는 거 같기도 하네요 하하 ;
글 잘 읽었습니다. 저희 회사에도 처음으로 인증서를 도입하려고 하는데 도움이 많이 되었습니다.
좋은 게시물 감사합니다. 사회복무요원으로 복무 중 근무지를 위한 프로그램을 만들었는데.. 못 믿으실 분들이 있어 해당 링크 걸어 놓았습니다. 원치 않으시면 꼭 알려주시기 바랍니다! 감사합니다.
인증서는 기본적으로 해쉬입니다. 수정하면 해쉬값이 틀려집니다.
단 한바이트만 수정되어도 인증서가 깨지기 때문에. 도용은 거의 불가능합니다.
private key 없이 인증서를 짜맞추는 건 현존하는 모든 컴퓨팅파워를 동원해도 몇 백년 걸릴테니 불가능하다는 게 맞죠.
각설하고, EV Code sign을 했는데 크롬에서 블락을 하네요. 완전히 블락은 아니고, 위험할 수 있다는 경고가 나옵니다.
일단 Google search console에 사이트를 등록하고 보안문제를 해결했다고 검토요청을 한 상태입니다.
EV code signning으로도 끝은 아니었습니다. ㅋㅋㅋ
구글 일처리가 빠르네요.
Google Search Console 보안문제에 해명하기를 눌러 Ev Code sign을 했고, VirusTotal에 0/72 clean 판정을 받았다고 하니 바로 해제가 되었습니다.(한 두시간 걸렸나?)
GV,DV,OV,EV code sign 이 있는 데, 저희 회사는 EV Code Sign만 해봤기 때문에 EV(Extended Validation) 기준으로 2줄 요약
1. code sign을 하면 바이러스나 멀웨어로 판독되는 경우가 줄지만, 완전히 없어지진 않음. 똥이 더러워서 피해야 하니, 백신들이 시비거는 행동은 피해야 함. virustotal 에서 0/72 받기 쉽지 않았음.(나만 어려웠나? ㅋㅋㅋ)
2. 배포 site의 신뢰성도 중요함. 그렇지 않으면 , EV Code sign이고 Virustotal 0/72 고 나발이고 간에 야 이거 니 컴퓨터에 위험할 수도 있어. 그래도 받을거야? 라고 크롬은 처물음.
그러면 뭐 할 수 있나? Google Search Console로 허겁지겁 뛰어가서 , 급한 놈이 우물을 파야함.
EV Code Sign USB를 FedEx로 받고 Site에서 크롬,파폭,에지등에서 시비안걸리고 다운받게 하는 데 약 7시간 걸림.구글링해보니 2020년에는 2주넘게 걸렸다고 하던 데, 요즘은 많이 빨라진듯. 그게 EV code sign의 힘인지는 잘모르겠음.
ps.중간에 약간 말투가 거칠어진 것은 실무자로서 고생한거 고려해서 양해부탁드림.