我在尝试连接服务器的SMTP邮件服务器的服务器上有一个java方法,我收到此错误:
stack trace: org.apache.commons.mail.EmailException: Sending the email
to the following server failed : mail.mycompanyname.com:465
检索完整的堆栈跟踪后,我注意到以下行,重复3次/次尝试:
nested exception is:
javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException:
PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException:
unable to find valid certification path to requested target
服务器在Apache Server上安装了证书。但是,我使用GlassFish作为访问java方法的Web应用程序(在客户端)的app服务器,而GlassFish位于Apache Server之后。我没有为GlassFish调整此证书。
我看到其他一些问题和答案类似于此处,但我不明白如何实现它:
PKIX path building failed: unable to find valid certification path to requested target
此外,还有这个,但在适当情况下,我不知道如何在我的情况下使用它:
Unable to find valid certification path to requested target - error even after cert imported
所以我的问题是,从Java的角度来看,我需要做些什么来清除这个错误?
我是否只需要创建一个属性文件,如下所示?:
Which is the default location for keystore/truststore of Java applications?
或者,我是否还需要设置TrustStore?
我是否需要在GlassFish上设置任何内容?
希望有人可以帮助我完成基础知识。提前感谢您的任何意见。
更新:
好的,终于在Hiro2K的帮助下找到了它。缺少的只是将Apache Webserver的SMTP邮件服务器使用的证书导入GlassFish。 Hiro2k的命令工作正常,但我的麻烦是找到合适的证书。
使用WHM,我可以看到邮件服务器,在我的情况下是Exim,引用到host1.mycompany.com,所以我自然而然地选择了自签名的认证名称host1.mycompany.com.crt。但是,此证书已过期,因此无效。我不得不进入Exim的配置文件,找到它的名为exim.crt的证书,并将其导入GlassFish。然后它奏效了。
另请注意,服务器上有许多证书,包括imap(例如imapd.pem)和pop3(pop3.pem)等等。非常令人困惑。
答案 0 :(得分:3)
因此SMTP SSL使用端口465,这意味着为了使客户端连接到服务器,它必须信任服务器的证书。 Java和Glassfish有一个默认的信任库,适用于任何大型Cetificate机构(Thawt,Verisign等)签署的任何证书,因为它不能正常工作,这使我相信你的服务器正在使用自己签署SSL证书。
这不是问题,并且很多内部应用程序都不支持这些证书。问题是GlassFish不知道该自签名证书,因此您必须将其导入默认的glassfish信任库。你可以在$ GLASFISH_INSTALL_DIR $ / domains / domain1 / config / cacerts.jks找到它
要导入证书,您可以使用java附带的keytool。
keytool -importcert -v -noprompt -alias smtp.server.name -file
/path/to/smtp.server.der -keystore
$GLASFISH_INSTALL_DIR$/domains/domain1/config/cacerts.jks -storepass changeit
您唯一需要注意的是证书的格式。 Keytool只支持二进制DER格式,许多Linux服务器使用名为PEM的OpenSSL文本格式。使用OpenSSL很容易从一个转换为另一个。
openssl x509 -in input.crt -inform PEM –out output.der -outform DER