개발
[ApacheJames]JDKIM 적용과정 본문
DKIM
- DKIM (Domain Keys Identified Mail)스팸메일을 차단하기 위해 개발된 기술 중 하나 (발신자가 위조되지 않았는지 수신자 측에서 검증할수 있음)Dkim을 메일 헤더에 추가하여 사인이 맞을경우 메일의 컨텐츠가 수정/변경/손상이 없을을 신뢰할수 있게 해주는 기술
- 송신자의 사인과 수신자의 검증단계로 구성된 피싱 검출, 스팸 방지의 목적의 RFC 4871 기술로 Sendmail, Cisco Yahoo에서 만듬
- 메일 발송자의 도메인과 메일 내용의 무결성을 검증할 수 있는 기술
적용방법
- os에서 private, public key 생성
openssl genrsa -out dkim-private.pem 1024
openssl rsa -in dkim-private.pem -out dkim-public.pem -pubout
- 생성한 public key를 DNS에 등록해야한다.
- type = txt
- domain = selector._domainkey.domain.co.kr
- selector는 dkim사용 설정시 s= 에들어가는 내용과 맞춰줘야함.
- domain.co.kr은 본인의 도메인으로 설정
- value
- v=DKIM;k=rsa;p=개인키
- v (version)
- k(알고리즘)
- p=${public_key}
- dns에서 해당 레코드를 조회해 확인한다.
$ nslookup -type=txt default._domainkey.domain.co.kr *서버: cns3.bora.net Address: 000.000.00.00 "v=DKIM1;k=rsa;p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDOK1L..." 권한 없는 응답: default._domainkey.*domain.co.kr *text =
- mailetContainer.xml 설정
- 발송전에 DKIM관련 헤더를 작성하기 때문에 실제 RemoteDelivery mailet보다 위에 입력해야한다.
- s= 도메인에 등록한 셀렉터
- d= 실제 사용하는 도메인으로 입력해준다.
- privatekey 입력해준다.
-
<mailet match="All" class="org.apache.james.jdkim.mailets.ConvertTo7Bit"/> <mailet match="All" class="org.apache.james.jdkim.mailets.DKIMSign"> <signatureTemplate>v=1; s=default; d=domain.co.kr; c=relaxed/relaxed; h=Message-ID:Date:Subject:From:To:MIME-Version:Content-Type; a=rsa-sha256; bh=; b=;</signatureTemplate> <privateKey> privatekey 입력 </privateKey> </mailet>
서버구동
- ConvertTo7Bit ClassNotFoundException오류 발생
org.apache.mailet.MailetException: Could not load mailet (org.apache.james.jdkim.mailets.ConvertTo7Bit);
nested exception is:
java.lang.ClassNotFoundException: org.apache.james.jdkim.mailets.ConvertTo7Bit
at org.apache.james.container.spring.bean.factory.mailetcontainer.AbstractLoaderBeanFactory.loadFailed(AbstractLoaderBeanFactory.java:62)
at org.apache.james.container.spring.bean.factory.mailetcontainer.MailetLoaderBeanFactory.getMailet(MailetLoaderBeanFactory.java:52)
at org.apache.james.mailetcontainer.lib.AbstractStateMailetProcessor.parseConfiguration(AbstractStateMailetProcessor.java:357)
at org.apache.james.mailetcontainer.lib.AbstractStateMailetProcessor.init(AbstractStateMailetProcessor.java:118)
at org.apache.james.mailetcontainer.impl.camel.CamelMailetProcessor.init(CamelMailetProcessor.java:108)
at org.apache.james.mailetcontainer.impl.camel.CamelCompositeProcessor.createMailProcessor(CamelCompositeProcessor.java:110)
at org.apache.james.mailetcontainer.lib.AbstractStateCompositeProcessor.init(AbstractStateCompositeProcessor.java:160)
at org.apache.james.mailetcontainer.impl.camel.CamelCompositeProcessor.init(CamelCompositeProcessor.java:80)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor$LifecycleElement.invoke(InitDestroyAnnotationBeanPostProcessor.java:344)
at org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor$LifecycleMetadata.invokeInitMethods(InitDestroyAnnotationBeanPostProcessor.java:295)
at org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor.postProcessBeforeInitialization(InitDestroyAnnotationBeanPostProcessor.java:130)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyBeanPostProcessorsBeforeInitialization(AbstractAutowireCapableBeanFactory.java:396)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1507)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:519)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:456)
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:293)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:223)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:290)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:191)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:638)
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:942)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:482)
at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:139)
at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:93)
at org.apache.james.container.spring.context.JamesServerApplicationContext.<init>(JamesServerApplicationContext.java:40)
at org.apache.james.app.spring.JamesAppSpringMain.init(JamesAppSpringMain.java:56)
at org.apache.james.app.spring.JamesAppSpringMain.main(JamesAppSpringMain.java:42)
- apache-jdkim-mailets-0.2.jar 추가
- 의존성 에러
- apache-jdkim-library-0.2.jar 추가
- 의존성 에러
- not-yet-commons-ssl-0.3.9.jar 추가
- PKC8S 오류 발생
- 다음처럼 키를 설정해줘야한다. 최초 설정시 -----BEGIN RSA PRIVATE KEY-----,-----END RSA PRIVATE KEY-----누락
-
----BEGIN RSA PRIVATE KEY----- my privatekey ----END RSA PRIVATE KEY-----
- DNS설정 DKIM을 위한 SELECTOR validate check
- 위의 사이트에서 selector와 도메인을 넣고 dkim records validate check가 가능하다.
- 성공시 출력
- 💡 This seems to be a valid DKIM Record
- DKIM record Checker | Test your DKIM record - DMARC Analyzer
- 구글로 메일 발송후 구글에서 메일 조회 → 원문보기를 클릭하자
- 라고나오면 DKIM적용 성공.
DKIM: 'PASS'(도메인 domain.co.kr)
참고
공개키와 비밀키
공개키(Public Key) and 개인키( Private Key)
DKIM Selector
nslookup -typ=txt s20171208s20211105._domainkey.naver.com
Using DomainKeys and DKIM Selector
- ex) 네이버
nslookup -type=txt s20171208._domainkey.naver.com
DKIM
도메인 기반 이메일 인증 SPF / DKIM / DMARC
Configuring DKIM and SPF for Apache James Email Server
이메일 보안 강화 기능 소개 - 도메인 보호, DKIM, DMARC : NHN Cloud Meetup
MailTester(DKIM 적용여부 확인)
'Java > ApacheJames' 카테고리의 다른 글
| Apache James ERD (0) | 2020.11.15 |
|---|---|
| Apache James 모듈 추가하기 (0) | 2020.11.15 |
| Apache James 소스 빌드하기 (0) | 2020.11.15 |
Comments