2014-12-01 3 views
0


현재 Grizzly 프레임 워크를 기반으로 작성한 SMTP 서버의 자체 구현을 테스트하고 있으며 이제는 JavaMail의 도움으로 SMTPS 지원을 확인하는 중에 문제가 발생합니다.
나는 핸드 쉐이크와 함께 similar problem을 찾았지만 잘하면 (또는 나를 위해) Grizlly SSLEngineConfigurator에 클라이언트 모드를 사용하지 않기 때문에 문제의 근본이 달라야한다고 생각합니다.JavaMail (SMTPS) + Grizzly, 핸드 셰이크 실패

try (InputStream keystoreStream = TransportEncryptionIT.class.getResourceAsStream("server_keystore.jks")) { 
    SSLContextConfigurator sslCon = new SSLContextConfigurator(); 
    sslCon.setSecurityProtocol("TLSv1.2"); 
    sslCon.setKeyStoreType("JKS"); 
    sslCon.setKeyStoreBytes(IOUtils.toByteArray(keystoreStream)); 
    sslCon.setKeyStorePass(""); 
    sslConf = new SSLEngineConfigurator(sslCon, false, false, false); 
} 

나는 또한 (서버 SSL 설정과) FilterChain에 SSLFilter를 설치 immidiatly를 한 후 (체인의 첫 번째 필터입니다) TransportFilter : (통합 테스트에서) 그리 즐 SSL 구성 초기화
내 코드는 다음과 같습니다.

filterChainBuilder.add(new SSLFilter(sslConf , null)); 

그리고 다음과 같은 방법으로 SMTPS을 위해있는 javamail을 구성 핸드 셰이크의

Properties properties = new Properties(); 
properties.setProperty("mail.transport.protocol", "smtps"); 
properties.setProperty("mail.smtps.host", ${host}); 
properties.setProperty("mail.smtps.port", ${port}); 
//need this since i'm using self signed certificate which is not added to truststore 
properties.setProperty("mail.smtps.ssl.trust", "*"); 

결과 (SSL 디버그 서버) : 핸드 셰이크의

[Raw read]: length = 163 
0000: 01 00 00 9F 03 01 54 7C D5 30 98 30 CA 59 39 D7 ......T..0.0.Y9. 
0010: B0 4A B6 FC 8F 8D E9 BD 4B 88 D6 BF EE E8 F9 FF .J......K....... 
0020: 8A EB 28 CF 98 AB 00 00 38 C0 0A C0 14 00 35 C0 ..(.....8.....5. 
0030: 05 C0 0F 00 39 00 38 C0 09 C0 13 00 2F C0 04 C0 ....9.8...../... 
0040: 0E 00 33 00 32 C0 07 C0 11 00 05 C0 02 C0 0C C0 ..3.2........... 
0050: 08 C0 12 00 0A C0 03 C0 0D 00 16 00 13 00 04 00 ................ 
0060: FF 01 00 00 3E 00 0A 00 34 00 32 00 17 00 01 00 ....>...4.2..... 
0070: 03 00 13 00 15 00 06 00 07 00 09 00 0A 00 18 00 ................ 
0080: 0B 00 0C 00 19 00 0D 00 0E 00 0F 00 10 00 11 00 ................ 
0090: 02 00 12 00 04 00 05 00 14 00 08 00 16 00 0B 00 ................ 
00A0: 02 01 00           ... 
Grizzly-worker(1), READ: TLSv1 Handshake, length = 163 
Grizzly-worker(2), fatal error: 80: problem unwrapping net record 
javax.net.ssl.SSLProtocolException: Handshake message sequence violation, 1 
Grizzly-worker(2), SEND TLSv1.2 ALERT: fatal, description = internal_error 
Grizzly-worker(2), WRITE: TLSv1.2 Alert, length = 2 

결과 (SSL 디버그 클라이언트) :

[Raw read]: length = 249 
0000: 01 00 00 F5 03 03 54 7C D5 30 6E 1C E7 B3 36 DE ......T..0n...6. 
0010: A6 26 73 78 2B 66 D1 D1 E8 C4 94 CA 63 34 22 BF .&sx+f......c4". 
0020: 60 9D 13 03 59 1F 00 00 70 C0 24 C0 28 00 3D C0 `...Y...p.$.(.=. 
0030: 26 C0 2A 00 6B 00 6A C0 0A C0 14 00 35 C0 05 C0 &.*.k.j.....5... 
0040: 0F 00 39 00 38 C0 23 C0 27 00 3C C0 25 C0 29 00 ..9.8.#.'.<.%.). 
0050: 67 00 40 C0 09 C0 13 00 2F C0 04 C0 0E 00 33 00 [email protected]/.....3. 
0060: 32 C0 07 C0 11 00 05 C0 02 C0 0C C0 2C C0 2B C0 2...........,.+. 
0070: 30 00 9D C0 2E C0 32 00 9F 00 A3 C0 2F 00 9C C0 0.....2...../... 
0080: 2D C0 31 00 9E 00 A2 C0 08 C0 12 00 0A C0 03 C0 -.1............. 
0090: 0D 00 16 00 13 00 04 00 FF 01 00 00 5C 00 0A 00 ............\... 
00A0: 34 00 32 00 17 00 01 00 03 00 13 00 15 00 06 00 4.2............. 
00B0: 07 00 09 00 0A 00 18 00 0B 00 0C 00 19 00 0D 00 ................ 
00C0: 0E 00 0F 00 10 00 11 00 02 00 12 00 04 00 05 00 ................ 
00D0: 14 00 08 00 16 00 0B 00 02 01 00 00 0D 00 1A 00 ................ 
00E0: 18 06 03 06 01 05 03 05 01 04 03 04 01 03 03 03 ................ 
00F0: 01 02 03 02 01 02 02 01 01      ......... 
main, READ: TLSv1.2 Handshake, length = 249 
main, handling exception: javax.net.ssl.SSLProtocolException: Handshake message sequence  violation, 1 
main, SEND TLSv1.2 ALERT: fatal, description = unexpected_message 
main, WRITE: TLSv1.2 Alert, length = 2 
[Raw write]: length = 7 
0000: 15 03 03 00 02 02 0A        ....... 
main, called closeSocket() 

이상하게 생각하는 것은 SMTP + StartTLS가 내 서버와 완벽하게 작동하며 핸드 셰이크가 성공적으로 완료되었으며 SSL 디버그를 통해 확인했습니다.

확실하지 않은 유일한 것은 truststore에 추가되지 않은 자체 생성 된 인증서를 사용하고 있다는 것입니다. Java 메일 옵션 "mail. $ {protocol} .ssl.trust"가 SMTP + StartTLS에서 작동하지만 SMTPS에서 작동하지 않을 수 있습니까?
또한 MailSSLSocketFactory을 사용하여 javamail이 서버 인증서를 신뢰하도록했지만, 호출되지 않은 것 같습니다 (디버거로 확인).

JavaMail에 버전 1.4.7
그리 즐 업데이트

2.3.17


마지막으로 나는 소스 코드의 차이, JavaMail에 대해 아무것도하지만, 그리 즐 프레임 워크 내 사용 없을 것으로 보인다 발견 FilterChain에 SSLFilter를 설치합니다. 서버를 SMTPS 나는 서버를 시작하면 , 필터는 다음과 같은 방법으로 설치됩니다

FilterChain securedFilterChain = new DefaultFilterChain(defaultChain); 
    int transportFilterindex = defaultChain.indexOfType(TransportFilter.class); 
    // Add connection security layer to the chain 
    securedFilterChain.add(transportFilterindex + 1, sslFilter); 

이를 :

filterChainBuilder.add(new TransportFilter()); 

    if (configuration.getSslConfig() != null) { 
     sslFilter = new SSLFilter(configuration.getSslConfig(), null); 
     if (configuration.isSmtpsEnabled()) { 
      filterChainBuilder.add(sslFilter); 
     } 
    } 

    smtpLineCodecFilter = new SmtpLineCodecFilter(); 
    filterChainBuilder.add(smtpLineCodecFilter); 

그러나 (클라이언트가 전송 암호화 인상을 요청할 수 있으므로)가 다른 방식으로 이루어집니다 StartTLS를위한

차이가 설치 될 다른 필터로 연결되므로 필터 체인은 다음과 같이 표시됩니다.
첫 번째 경우 - SSLBaseFilter.SSLTransportFilterWrapper -> SSLFilter
두 번째 경우 - TransportFilter -> SSLFilter

이제 어느 것이 적절한 방법인지는 모르겠지만 최소한 두 번째 사례는 저에게 효과적입니다.
내가보기 엔 그리 즐 전문가 답변 부탁드립니다 :)

+0

당신이 소스를 공유하는 경우 (GitHub의에 말) - 내가 – alexey

+0

안녕 알렉세이 도움을 시도 할 수 있습니다, 감사는 응답을, 나는 이렇게 여기에 포스트 링크됩니다. – Grigory

답변