본문 바로가기
Spring

[Spring 오류] SSLHandshakeException / Could not convert socket to TLS

by nomeleon 2022. 4. 25.
반응형

 

안녕하세요!

개발 중인 Spring 프로젝트에서 발생한 오류의 원인과 해결방법을 기록해 보려고 합니다!

 

로그인 시 전송되는 인증 메일이 전송되지 않고 아래와 같은 오류가 났습니다.

SEVERE: 경로 []의 컨텍스트 내의 서블릿 [dispatcher]을(를) 위한 Servlet.service() 호출이, 근본 원인(root cause)과 함께, 예 [Request processing failed; nested exception is org.springframework.mail.MailSendException: Mail server connection failed; nested exception is javax.mail.MessagingException: Could not convert socket to TLS;

  nested exception is: 
javax.net.ssl.SSLHandshakeException: PKIX path building failed: 
sun.security.provider.certpath.SunCertPathBuilderException: 
unable to find valid certification path to requested target. 
Failed messages: 
javax.mail.MessagingException: Could not convert socket to TLS;

  nested exception is: 
javax.net.ssl.SSLHandshakeException: PKIX path building failed: 
sun.security.provider.certpath.SunCertPathBuilderException: 
unable to find valid certification path to requested target; message exceptions (1) are:
Failed message 1: 
javax.mail.MessagingException: Could not convert socket to TLS;

  nested exception is:
   javax.net.ssl.SSLHandshakeException: 
PKIX path building failed: 
sun.security.provider.certpath.SunCertPathBuilderException: 
unable to find valid certification path to requested target]을(를) 발생시켰습니다.

 

첫번째로 오류 메시지에서 원인인 SSLHandshakeException 을 확인했습니다.

그리고 찾아보니 Server와  Client 간 사용하려고 하는 SSL/TLS 버전이 상이한 경우 위 오류가 난다는 것을 알아냈습니다.

그래서 mailSender 객체를 선언하는 servlet-context.xml 파일에서 props 속성 코드를 추가했습니다.

 

1. 원래 코드

<bean id="mailSender" class="org.springframework.mail.javamail.JavaMailSenderImpl">
        <property name="host" value="smtp.gmail.com" />
        <property name="port" value="587" />
        <property name="username" value="메일주소@gmail.com"/>
        <property name="password" value="비밀번호" />
        <property name="defaultEncoding" value="utf-8" />
        <property name="javaMailProperties">
            <props>
                <prop key="mail.transport.protocol">smtp</prop>
                <prop key="mail.smtp.auth">true</prop>
                <prop key="mail.smtp.starttls.enable">true</prop>
                <prop key="mail.debug">true</prop>
            </props>
        </property>
    </bean>

 

2. 추가한 코드

<prop key="mail.smtp.ssl.trust">smtp.gmail.com</prop>
<prop key="mail.smtp.ssl.protocols">TLSv1.2</prop>

 

3. 최종 코드

<bean id="mailSender" class="org.springframework.mail.javamail.JavaMailSenderImpl">
        <property name="host" value="smtp.gmail.com" />
        <property name="port" value="587" />
        <property name="username" value="메일주소@gmail.com"/>
        <property name="password" value="비밀번호" />
        <property name="defaultEncoding" value="utf-8" />
        <property name="javaMailProperties">
            <props>
                <prop key="mail.transport.protocol">smtp</prop>
                <prop key="mail.smtp.auth">true</prop>
                <prop key="mail.smtp.starttls.enable">true</prop>
                <prop key="mail.debug">true</prop>
                <prop key="mail.smtp.ssl.trust">smtp.gmail.com</prop>
				<prop key="mail.smtp.ssl.protocols">TLSv1.2</prop>
            </props>
        </property>
    </bean>

 

그 후 모두 종료했다가 다시 재시작하니 정상적으로 메일이 전송되었습니다!!

'Spring' 카테고리의 다른 글

[Spring/MVC] 로컬 저장소의 이미지 웹에 띄우기  (0) 2022.04.22

댓글