Domain key 는 MS 의 Sender ID 와 비슷한 기술로써 메일의 위변조를 막기 위해 야후에서 개발한 기술입니다. 현재 dreamwiz, yahoo, gmail 등에서 사용되고 있습니다.
http://kr.antispam.yahoo.com/domainkeys
공개키, 비밀키를 이용하는 방식으로 dns 의 text 영역에 공개키를 넣어두고, 메일 본문과 헤더는 비밀키를 이용해서 디지털 사이닝 하는 방식으로 동작하기 때문에 dns 와 smtp server 에서 모두 지원을 해야 사용이 가능합니다.
디지털 사인에는 메일의 본문과 헤더가 모두 사용되기 때문에, 중간에 메일을 가로채서 변조를 하는 것이 불가능하며 역시 마찬가지 이유로 디지털 사인만을 따로 떼어내서 사용하는 것도 불가능합니다. (디지털 사인을 할 때 헤더는 일부만 사용될 수도 있습니다.)
Domain key 가 사용된 경우 메일 헤더에서 다음과 같은 걸 볼 수 있습니다. 🙂
[spoiler ‘simple”unfix.net 의 경우”숨기기’]
1 2 3 |
DomainKey-Signature: a=rsa-sha1; s=key; d=mytears.org; c=nofws; q=dns; b=ECTz+bZpm9kl8KWl7yIB0fwfUeZgu1kIsM0TQwoF7w+3cOzBpVzRK9nJdni1zCsqH ZSLTxq1ocmURWpvNjad1Q== |
[/spoiler]
[spoiler ‘simple”yahoo.co.jp 의 경우”숨기기’]
1 2 3 4 |
DomainKey-Signature: a=rsa-sha1; q=dns; c=nofws; s=yj20050223; d=yahoo.co.jp; h=Message-ID:Received:Date:From:Subject:To:MIME-Version:Content-Type; b=VuHI8UPM5dzPTZrlbZ8Z3oDw1gP/mtJIvTaS2xTme591dKFapb/b95VSdyHP5IuyHBXburlsalXBzw4tTWmLeOKiKPZMlrOgNifQtrp9wQSx7L70TSCmZo7uKPOmblVj ; |
[/spoiler]
DomainKey-Signature 뒤에 나오는 값들은 아래와 같은 의미를 가집니다.
- a: 서명을 만드는데 사용한 알고리즘
- q: 공개키를 가져오기 위한 수단
- c: canonicalization 알고리즘
- s: 공개키가 있는 도메인 명 (selector)
- d: 서명 도메인 명
- h: 서명 알고리즘에 사용된 헤더들
- b: base64 처럼 인코딩된 디지털 서명
이제 제가 테스트를 위해 저 자신에게 보낸 이메일을 가지고 어떤 식으로 검증을 할 수 있는지를 살펴보겠습니다.
[spoiler ‘simple”mail 원본”숨기기’]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
Return-Path: <imma0125 @yahoo.co.jp> DomainKey-Signature: a=rsa-sha1; q=dns; c=nofws; s=yj20050223; d=yahoo.co.jp; h=Message-ID:Received:Date:From:Subject:To:MIME-Version:Content-Type; b=VuHI8UPM5dzPTZrlbZ8Z3oDw1gP/mtJIvTaS2xTme591dKFapb/b95VSdyHP5IuyHBXburlsalXBzw4tTWmLeOKiKPZMlrOgNifQtrp9wQSx7L70TSCmZo7uKPOmblVj ; Message-ID: <20060924081009.40521.qmail@web2908.mail.tnz.yahoo.co.jp> Received: from [220.230.37.86] by web2908.mail.tnz.yahoo.co.jp via HTTP; Sun, 24 Sep 2006 17:10:09 JST Date: Sun, 24 Sep 2006 17:10:09 +0900 (JST) From: <imma0125 @yahoo.co.jp> Subject: From Yahoo Japan!! To: master@mytears.org MIME-Version: 1.0 Content-Type: text/plain; charset=iso-2022-jp hehe How yahoo.jp's domain key works? on more -------------------------------------- [10th Anniversary] special auction campaign now! http://pr.mail.yahoo.co.jp/auction/ |
[/spoiler]
서명을 확인해보면 selector 가 yj20050223 이고 도메인은 yahoo.co.jp 라는 것을 알 수 있습니다. 이제 selector 와 domain 을 알고 있으니 아래와 같은 커맨드를 통해 간단하게 공개키를 가져올 수 있습니다.
1234 aqua@Macintosh aqua $ nslookup> set q=txt> yj20050223._domainkey.yahoo.co.jpyj20050223._domainkey.yahoo.co.jp text = "k=rsa\; t=y\; p=MHwwDQYJKoZIhvcNAQEBBQADawAwaAJhALU/r+4Oj3BEIwGokMgz7qnnGmy41zaMcxlTeSZshJzB9n3eqJjGwywcB0/0HpwldMgI121DDtEfXSWc2p+2YGxePO/50uQZzJ3Y38wszEjGJ7r50J+jSPQ/ir5j0WVQlwIDAQAB\; n=A 768 bit key\;"
여기까지 해서 signature 와 public key, canonical algorithm 등을 얻어냈으니, 이제 canonical algorithm 에 따라 본문을 살짝 수정해서 verify 를 하면 되지만, canonical algorithm 에 따라 수정하는 부분은 제가 정확하게 몰라서 보여드릴 수가 없겠습니다. 😀 (웃음으로 떼울 일이 아닌가 -_-)
관심있으신 분은 Domain key 관련 draft 문서 3.4 절을 참고하셔서 메시지 가공 후 ‘openssl dgst -verify publickeyfile -sha1 -signature signaturefile < tmp.eml' 정도의 커맨드를 사용하면 verification fail / success 와 같은 메시지를 볼 수 있겠습니다.
p.s) 혹시나 오해하실 분들이 있어 미리 얘기하자면 위의 내용들은 실제론 손으로 저렇게 한 스텝 한 스텝 밟아가야 하는게 아니라 dk-milters 등을 이용할 경우 알아서 처리되는 것들입니다.
Similar Posts:
- exim 에 spf, srs 적용하기
- 유용한 procmail 용 rule!!
- 오묘한 procmail 세상…
- Sender Policy Framework
- exim 으로 메일 서버 구성하기…