代码之家  ›  专栏  ›  技术社区  ›  GriffoGoes

可用密码Web应用程序

  •  0
  • GriffoGoes  · 技术社区  · 6 年前

    这个Java应用程序需要使用SMTP和TLS发送电子邮件。

    邮件发送代码在独立Java应用程序(Java Mail Cube)和我们以前的环境中执行时很好,但是在Tomcat 8环境(Tomcat 8 AWS BeaBoST,OpenJDK 64位服务器VM(Bu建25.171-B10,混合模式))中执行失败。

    相关邮件发送代码(使用javax 1.6.1):

    Properties props = new Properties();
    props.put("mail.transport.protocol", "smtp");
    props.put("mail.smtp.host", smtpServerProperties.get(HOST_PROPERTY));
    props.put("mail.smtp.port", smtpServerProperties.get(PORT_PROPERTY));
    props.put("mail.smtp.auth", "true");
    props.put("mail.smtp.starttls.enable", "true");
    Authenticator auth = new Authenticator() {
        protected PasswordAuthentication getPasswordAuthentication() {
            return new PasswordAuthentication(smtpServerProperties.get(TLS_USER_PROPERTY), smtpServerProperties.get(TLS_PASSWORD_PROPERTY));
        }
    };
    Session session = Session.getInstance(props, auth);
    MimeMessage email = createEmail(session, smtpSender, recipients, subject, content);
    Transport transport = session.getTransport();
    transport.connect(smtpServerProperties.get(HOST_PROPERTY),smtpServerProperties.get(TLS_USER_PROPERTY), smtpServerProperties.get(TLS_PASSWORD_PROPERTY) );
    transport.sendMessage(email, email.getAllRecipients());
    

    我得到的错误:

    Caused by: java.io.EOFException: SSL peer shut down incorrectly
        at sun.security.ssl.InputRecord.read(InputRecord.java:505)
        at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:983)
        ... 13 more
    

    我怀疑问题在于,在运行“inside”Tomcat时,应用程序可用的密码是有限的,然后失败了。在SSL日志中,我可以看到“不支持的密码套件”的列表在应用程序和用于握手的初始TLS版本之间存在很大差异:

    在Tomcat内部:

    Ignoring unsupported cipher suite: TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384 for TLSv1
    Ignoring unsupported cipher suite: TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384 for TLSv1
    Ignoring unsupported cipher suite: TLS_RSA_WITH_AES_256_CBC_SHA256 for TLSv1
    Ignoring unsupported cipher suite: TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384 for TLSv1
    Ignoring unsupported cipher suite: TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384 for TLSv1
    Ignoring unsupported cipher suite: TLS_DHE_RSA_WITH_AES_256_CBC_SHA256 for TLSv1
    Ignoring unsupported cipher suite: TLS_DHE_DSS_WITH_AES_256_CBC_SHA256 for TLSv1
    Ignoring unsupported cipher suite: TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384
    Ignoring unsupported cipher suite: TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384
    Ignoring unsupported cipher suite: TLS_RSA_WITH_AES_256_CBC_SHA256
    Ignoring unsupported cipher suite: TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384
    Ignoring unsupported cipher suite: TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384
    Ignoring unsupported cipher suite: TLS_DHE_RSA_WITH_AES_256_CBC_SHA256
    Ignoring unsupported cipher suite: TLS_DHE_DSS_WITH_AES_256_CBC_SHA256
    Ignoring unsupported cipher suite: TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256
    Ignoring unsupported cipher suite: TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256
    Ignoring unsupported cipher suite: TLS_RSA_WITH_AES_128_CBC_SHA256
    Ignoring unsupported cipher suite: TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256
    Ignoring unsupported cipher suite: TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256
    Ignoring unsupported cipher suite: TLS_DHE_RSA_WITH_AES_128_CBC_SHA256
    Ignoring unsupported cipher suite: TLS_DHE_DSS_WITH_AES_128_CBC_SHA256
    Ignoring unsupported cipher suite: TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384
    Ignoring unsupported cipher suite: TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256
    Ignoring unsupported cipher suite: TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
    Ignoring unsupported cipher suite: TLS_RSA_WITH_AES_256_GCM_SHA384
    Ignoring unsupported cipher suite: TLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA384
    Ignoring unsupported cipher suite: TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384
    Ignoring unsupported cipher suite: TLS_DHE_RSA_WITH_AES_256_GCM_SHA384
    Ignoring unsupported cipher suite: TLS_DHE_DSS_WITH_AES_256_GCM_SHA384
    Ignoring unsupported cipher suite: TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
    Ignoring unsupported cipher suite: TLS_RSA_WITH_AES_128_GCM_SHA256
    Ignoring unsupported cipher suite: TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256
    Ignoring unsupported cipher suite: TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256
    Ignoring unsupported cipher suite: TLS_DHE_RSA_WITH_AES_128_GCM_SHA256
    Ignoring unsupported cipher suite: TLS_DHE_DSS_WITH_AES_128_GCM_SHA256
    %% No cached client session
    *** ClientHello, TLSv1
    

    外部:

    Ignoring unsupported cipher suite: TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384 for TLSv1
    Ignoring unsupported cipher suite: TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384 for TLSv1
    Ignoring unsupported cipher suite: TLS_RSA_WITH_AES_256_CBC_SHA256 for TLSv1
    Ignoring unsupported cipher suite: TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384 for TLSv1
    Ignoring unsupported cipher suite: TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384 for TLSv1
    Ignoring unsupported cipher suite: TLS_DHE_RSA_WITH_AES_256_CBC_SHA256 for TLSv1
    Ignoring unsupported cipher suite: TLS_DHE_DSS_WITH_AES_256_CBC_SHA256 for TLSv1
    Ignoring unsupported cipher suite: TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384 for TLSv1.1
    Ignoring unsupported cipher suite: TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384 for TLSv1.1
    Ignoring unsupported cipher suite: TLS_RSA_WITH_AES_256_CBC_SHA256 for TLSv1.1
    Ignoring unsupported cipher suite: TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384 for TLSv1.1
    Ignoring unsupported cipher suite: TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384 for TLSv1.1
    Ignoring unsupported cipher suite: TLS_DHE_RSA_WITH_AES_256_CBC_SHA256 for TLSv1.1
    Ignoring unsupported cipher suite: TLS_DHE_DSS_WITH_AES_256_CBC_SHA256 for TLSv1.1
    %% No cached client session
    *** ClientHello, TLSv1.2
    

    编辑

    在Tomcat中运行的同一个应用程序可以通过https(标准httpurlconnection)成功地与MongoDB服务器(mongo-java-driver-3.2.2)和其他Web应用程序通信,在这两种情况下,客户端hello都使用tlsv1.2。

    问题是:Tomcat环境如何限制/更改javax.mail的可用密码,即使它 (真的是这样) 是否使用相同的Java环境?

    2 回复  |  直到 6 年前
        1
  •  0
  •   Keyboardsoldier    6 年前

    当然可能是密码。当然,这是因为您的SSL握手失败了,但这有很多原因。

    因为在应用程序托管在Tomcat中之前,您没有看到这个问题,这表明您可能正在处理一个SSL信任存储问题。获取由SMTP服务器的SSL端点提供的SSL证书,并使用(Java/bin)键入工具将该证书导入到Tomcat的可信密钥存储库中。如果它已经在那里,您会收到一条消息,看起来像“它已经在这里,您想重新导入它吗?”

    重新导入不会造成伤害,但信任存储通常不会动态加载,因此在执行信任存储导入之后,应该重新启动Tomcat。您可以在没有参数的情况下键入(java/bin)键工具来获得帮助屏幕,但是导入命令看起来类似于此:

    keytool-导入-文件smtpcert.cer-keystore-tomcattrust

    您的文件名(.cer)和信任存储名称可能与上面的不同,如果提示您输入密码,我认为默认密码是changeit。

    祝你好运!

        2
  •  0
  •   GriffoGoes    6 年前

    TLDR公司 :完整的Web应用程序有一个依赖项,包括邮件类(1.4)的旧版本,但它不起作用。修复方法是在pom.file中添加排除:

    <dependency>
        <groupId>org.jboss.resteasy</groupId>
        <artifactId>resteasy-multipart-provider</artifactId>
        <version>2.2.1.GA</version>
        <exclusions>
            <exclusion>
                <groupId>javax.mail</groupId>
                <artifactId>mail</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
    

    原因是这比预计的要长:

    • 同一个Web应用程序在(完全)不同的环境中工作—Windows Server、Sun JDK8、Tomcat7
    • 电子邮件发送类位于“核心”项目中,该项目不包含任何其他邮件依赖项。
    • 最初的嫌疑犯是在“内部”和“外部”版本中使用了不同的类/实现,但它们是“相同的”(至少是名称)。

    用于查找的步骤:

    使用以下标志执行Java应用程序:

    -verbose:class
    -verbose:jni
    

    检查日志:

    • 独立应用程序(在运行“main”类时,我使用了web部署中的libs): [Loaded com.sun.mail.smtp.SMTPTransport from file:/var/lib/tomcat8/webapps/myapp/WEB-INF/lib/javax.mail-1.6.1.jar]
    • Web应用程序: [Loaded com.sun.mail.smtp.SMTPTransport from file:/var/lib/tomcat8/webapps/myapp/WEB-INF/lib/mail-1.4.jar]

    基于运行MVN依赖项的最终验证 mvn dependency:tree 并看到两个邮件依赖项:

    [INFO] +- com.my.company:my-core:jar:1.70:compile
    [INFO] |  \- com.sun.mail:javax.mail:jar:1.6.1:compile
    ...
    [INFO] +- org.jboss.resteasy:resteasy-multipart-provider:jar:2.2.1.GA:compile
    [INFO] |  +- javax.mail:mail:jar:1.4:compile