개발

[ApacheJames]JDKIM 적용과정 본문

Java/ApacheJames

[ApacheJames]JDKIM 적용과정

Dev.hs 2021. 11. 17. 16:46

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

참고

공개키와 비밀키

공개키(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 적용여부 확인)

Newsletters spam test by mail-tester.com

'Java > ApacheJames' 카테고리의 다른 글

Apache James ERD  (0) 2020.11.15
Apache James 모듈 추가하기  (0) 2020.11.15
Apache James 소스 빌드하기  (0) 2020.11.15
Comments