Spring
[Spring 오류] SSLHandshakeException / Could not convert socket to TLS
nomeleon
2022. 4. 25. 14:04
반응형
안녕하세요!
개발 중인 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>
그 후 모두 종료했다가 다시 재시작하니 정상적으로 메일이 전송되었습니다!!
