준호씨의 블로그

javamail 로 메일 발송 시 SSLv2Hello 이용해서 SSLv3 사용하기. ssl/tls 버전 지정하기. 본문

개발이야기/이메일시스템

javamail 로 메일 발송 시 SSLv2Hello 이용해서 SSLv3 사용하기. ssl/tls 버전 지정하기.

준호씨 2016.03.17 00:13
요지는 mail.smtp.ssl.protocols 에 "SSLv2Hello SSLv3" 를 지정하는 것이다. 아래 처럼 property 에 추가 하면 된다.
props.put("mail.smtp.ssl.protocols", "SSLv2Hello SSLv3");
만약 SSLv2Hello 를 하지 않고 처음부터 SSLv3 를 사용하려면 SSLv3 만 넣으면 된다.

실행 할 때 VM options 에 아래 내용을 추가 하면 Handshake 과정을 찍어 볼 수 있다.
-Djavax.net.debug=ssl,handshake

SSLv2 client hello message 를 날린 다음 SSLv3 Handshake 를 하고 있다.
main, WRITE: SSLv3 Handshake, length = 175
main, WRITE: SSLv2 client hello message, length = 98
main, READ: SSLv3 Handshake, length = 3558
*** ServerHello, SSLv3

대략 풀 소스는 다음과 같다.
        String host = "mail-host";
        String port = "25";
        String subject = "test subject";
        String body = "test message";

        String from = "junho85@daum.net";
        String to = "test@example.com";

        Properties props = System.getProperties();
        props.put("mail.smtp.starttls.enable", true);
        props.put("mail.smtp.host", host);
        props.put("mail.smtp.port", port);
        props.put("mail.smtp.ssl.protocols", "SSLv2Hello SSLv3"); // 이 부분이 중요!!

        Session session = Session.getDefaultInstance(props, null);
        session.setDebug(true);

        MimeMessage message = new MimeMessage(session);
        message.setFrom(new InternetAddress(from));

        InternetAddress toAddress = new InternetAddress(to);

        message.addRecipient(Message.RecipientType.TO, toAddress);

        message.setSubject(subject);
        message.setText(body);

        Transport transport = session.getTransport("smtp");

        transport.connect();

        transport.sendMessage(message, message.getAllRecipients());
        transport.close();

http://security.stackexchange.com/questions/34827/why-clients-offer-handshaking-with-ssl-2-0-protocol 의 댓글에 의하면 일단 SSLv2Hello 를 했지만 SSLv3 사용이 가능 하면 SSLv3 를 사용한다고 한다.

참고로 Java 는 SSLv2 자체는 지원하지 않고 SSLv2Hello 까지만 지원한다. 실제 통신은 SSLv3 로 하는데 Hello 만 SSLv2 로 하는 것이다.

JDK 버전에 따라 기본적으로 활성화 되어 있는 Protocol 의 버전이 다르기 때문에 미리 좀 확인 해 볼 필요는 있다.
현재 java 에서는 SSLv3, SSLv2Hello, TLSv1, TLSv1.1, TLSv1.2 를 지원하고 있는데 JDK 마다 지원하는 버전이 다르고 최근에는 SSLv3 는 기본적으로 비활성화 되어 있기도 하다.

참고
0 Comments
댓글쓰기 폼