本文介绍了Websphere 7 javax.mail.MessagingException:SSLSocketFactory为空的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试使用SSL在Websphere 7上连接到邮件服务器.我将代码作为独立的测试主方法运行没有问题,一切正常.我在Websphere上运行代码也没有问题-连接到邮件服务器(例如imap.seznam.cz),但是当我不使用SSL时.如果我想使用SSL,则会引发如下异常:

I am trying to connect to mail server using SSL, running on Websphere 7. I have no problem running the code as a standalone test main method, everything goes fine.I have also no problem running the code on Websphere - connecting to mail server (example imap.seznam.cz), but when I do not use SSL. In case I want to use SSL, exception is thrown like this:

javax.net.ssl.SSLException:SSLSocketFactory为null.如果调用javax.net.ssl.SSLSocketFactory.getDefault()创建一个 未设置socket和javax.net.ssl.*属性.

javax.net.ssl.SSLException: SSLSocketFactory is null. This can occur if javax.net.ssl.SSLSocketFactory.getDefault() is called to create a socket and javax.net.ssl.* properties are not set.

在com.sun.mail.imap.IMAPStore.protocolConnect(IMAPStore.java:571)

at com.sun.mail.imap.IMAPStore.protocolConnect(IMAPStore.java:571)

在javax.mail.Service.connect(Service.java:288)

at javax.mail.Service.connect(Service.java:288)

这是代码的一部分:

Properties imapProps = new Properties();
System.out.println(imapProps);
imapProps.setProperty("mail.imap.ssl.enable", ssl ? "true" : "false");
if(ssl) {
    imapProps.setProperty("mail.imap.starttls.enable", "true");
}

imapProps.setProperty("javax.net.ssl.trustStore", "c:/Program Files/IBM/WebSphere/AppServer/profiles/AppSrv01/config/cells/T431sNode03Cell/nodes/T431sNode03/trust.p12");
imapProps.setProperty("javax.net.ssl.trustStorePassword", "WebAS");
imapProps.setProperty("javax.net.ssl.trustStoreType", "PKCS12");
imapProps.setProperty("javax.net.ssl.keyStore", "c:/Program Files/IBM/WebSphere/AppServer/profiles/AppSrv01/config/cells/T431sNode03Cell/nodes/T431sNode03/key.p12");
imapProps.setProperty("javax.net.ssl.keyStorePassword", "WebAS");

imapProps.setProperty("mail.debug", "true");
Session session = Session.getInstance(imapProps, null);
session.setDebug(true);

System.out.println("--------------------------------------------------------------------------------------------");
System.out.println(imapProps.toString());
System.out.println("--------------------------------------------------------------------------------------------");

SSLSocketFactory sslsocketfactory = (SSLSocketFactory) SSLSocketFactory.getDefault();
System.out.println(sslsocketfactory);

// connect
try {
    store = session.getStore(ssl ? "imaps" : "imap");
    store.connect(imapServer, imapPort, login, password);
    return true;
} catch(NoSuchProviderException ex) {
    ex.printStackTrace();
    return false;
} catch (MessagingException e) {
    e.printStackTrace();
    return false;
}

参数取自属性文件...

Parameters are taken from properties file...

ssl是,imapServer imap.seznam.cz,imapPort 993

ssl true, imapServer imap.seznam.cz, imapPort 993

这只是检查SSLSocketFactory是否为空,代码中不需要

This is only to check whether SSLSocketFactory is null or not, not needed in code

我可以看到sslsocketfactory不为null,并且类型为:com.ibm.websphere.ssl.protocol.SSLSocketFactory

I can see that sslsocketfactory is not null ans is of type: com.ibm.websphere.ssl.protocol.SSLSocketFactory

我尝试过的是:

  • 我有来自邮件服务器的证书,该证书存储在Websphere的受信任存储中(使用管理控制台,从服务器的端口读取,我在那里可以看到它)
  • 我在Websphere服务器的属性以及代码中设置了一些javax.net.ssl.*属性-如您所见-但我认为这不是必需的
  • 我假设Websphere正在从信任存储位置读取证书,如管理控制台中所示:$ {CONFIG_ROOT}/cells/T431sNode03Cell/nodes/T431sNode03/trust.p12

任何Websphere专家都可以帮助我解决此问题吗?我正在尝试修复几天,但没有成功:-(

Can any Websphere expert help me with this problem? I am trying to fix it a couple of days with no success :-(

正如我提到的,当不使用SSL时,它可以在Websphere上运行,但是对于同一邮件服务器(例如imap.seznam.cz,也可以是imap.gmail.com)使用SSL时,它不能运行.在Websphere外部作为独立的Java应用程序运行时使用SSL.

As I mentioned, it is working on Websphere when not using SSL, but not running when using SSL for the same mail server (for example imap.seznam.cz, also imap.gmail.com) and it is working fine with SSL when running outside Websphere as a standalone java apllication.

谢谢大家!

感谢Gas向我指出了如何在Websphere中配置邮件的正确方法.所以我做到了,我使用的是内置邮件提供程序,并且只创建了2个邮件会话

Thanks Gas to pointing me to the right way how to configure mail in Websphere. So I did it, I am using Built-in Mail Provider and only created 2 mail sessions

  • 使用"imaps"提供商提供SSL支持的人
  • 另一个没有使用"imap"提供程序的SSL支持的人

两个会话都定义了相同的服务器并启用了调试.

Both sessions have the same server defined and debug enabled.

在Java代码中,我正在这样做:

In java code I am doing this:

Context context = new InitialContext();
Session session = null;
if(ssl) {
    session = (Session) context.lookup("mail/exchangeSSL");
} else {
    session = (Session) context.lookup("mail/exchange");
}

store = session.getStore();
store.connect(login, password);

有趣的是,结果是完全一样的.当我使用非SSL会话时,一切正常,但是当我使用SSL会话时,出现此异常:

And interesting think, the result is exactly the same. When I am using non SSL session, everything goes fine, but when I use SSL session, got this exception:

[25.6.14 16:35:19:615 SELČ] 00000023 SystemOut     O *** In SessionFactory.getObjectInstance, session properties:
[25.6.14 16:35:19:615 SELČ] 00000023 SystemOut     O    mail.store.protocol=imaps
[25.6.14 16:35:19:615 SELČ] 00000023 SystemOut     O    mail.imaps.class=com.sun.mail.imap.IMAPSSLStore
[25.6.14 16:35:19:615 SELČ] 00000023 SystemOut     O    mail.debug=true
[25.6.14 16:35:19:615 SELČ] 00000023 SystemOut     O    mail.pop3s.class=com.sun.mail.pop3.POP3SSLStore
[25.6.14 16:35:19:615 SELČ] 00000023 SystemOut     O    mail.smtp.class=com.sun.mail.smtp.SMTPTransport
[25.6.14 16:35:19:615 SELČ] 00000023 SystemOut     O    mail.imaps.host=imap.seznam.cz
[25.6.14 16:35:19:616 SELČ] 00000023 SystemOut     O    mail.smtps.class=com.sun.mail.smtp.SMTPSSLTransport
[25.6.14 16:35:19:616 SELČ] 00000023 SystemOut     O    mail.imap.class=com.sun.mail.imap.IMAPStore
[25.6.14 16:35:19:616 SELČ] 00000023 SystemOut     O    mail.mime.address.strict=false
[25.6.14 16:35:19:616 SELČ] 00000023 SystemOut     O    mail.pop3.class=com.sun.mail.pop3.POP3Store
[25.6.14 16:35:19:616 SELČ] 00000023 SystemOut     O DEBUG: mail.imaps.class property exists and points to com.sun.mail.imap.IMAPSSLStore
[25.6.14 16:35:19:617 SELČ] 00000023 SystemOut     O DEBUG: mail.imap.fetchsize: 16384
[25.6.14 16:35:19:618 SELČ] 00000023 SystemErr     R javax.mail.MessagingException: SSLSocketFactory is null. This can occur if javax.net.ssl.SSLSocketFactory.getDefault() is called to create a socket and javax.net.ssl.* properties are not set.;
nested exception is:
javax.net.ssl.SSLException: SSLSocketFactory is null. This can occur if javax.net.ssl.SSLSocketFactory.getDefault() is called to create a socket and javax.net.ssl.* properties are not set.
[25.6.14 16:35:19:618 SELČ] 00000023 SystemErr     R    at com.sun.mail.imap.IMAPStore.protocolConnect(IMAPStore.java:479)
[25.6.14 16:35:19:618 SELČ] 00000023 SystemErr     R    at javax.mail.Service.connect(Service.java:275)

UPDATE2:

我从此示例创建了一个新的新项目:

UPDATE2:

I created a new fresh project from this example:

我只向控制器添加了与邮件会话相关的代码:

I only added mail session related code to the controller:

try {
    Context context = new InitialContext();
    Session session = (Session) context.lookup("mail/exchangeSSL");

    Store store = session.getStore();
    store.connect("<user>", "<password>");
} catch (NamingException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
} catch (NoSuchProviderException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
} catch (MessagingException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}

当我部署此新的Web应用程序并调用它时,出现相同的错误.在WEB-INF/lib中,只有与spring和commons日志记录相关的jars:

And when I deploy this new web app and invoke it, the same error. In WEB-INF/lib there are only jars related to spring and commons logging:

aopalliance-1.0.jar
commons-logging-1.1.1.jar
spring-aop-3.0.5.RELEASE.jar
spring-asm-3.0.5.RELEASE.jar
spring-beans-3.0.5.RELEASE.jar
spring-context-3.0.5.RELEASE.jar
spring-context-support-3.0.5.RELEASE.jar
spring-core-3.0.5.RELEASE.jar
spring-expression-3.0.5.RELEASE.jar
spring-web-3.0.5.RELEASE.jar
spring-webmvc-3.0.5.RELEASE.jar

所以我认为这与服务器设置有关?我使用的是Websphere 7.0.0.31.我在管理控制台(从端口读取)中将邮件服务器证书添加到NodeDefaultTrustStore中,在那里可以看到它.

So I think this has something to do with server settings? I use Websphere 7.0.0.31. I added mail server certificate to NodeDefaultTrustStore in admin console (read from port) and I can see it there.

这是我们在项目中使用的jar的清单:

And here is the listing of jars we are using in our project:

ant-1.7.1.jar
ant-launcher-1.7.1.jar
antlr-2.7.7.jar
aopalliance-1.0.jar
asm-3.3.1.jar
aspectjrt-1.7.4.jar
aspectjweaver-1.7.4.jar
avalon-framework-api-4.3.1.jar
avalon-framework-impl-4.2.0.jar
avalon-framework-impl-4.3.1.jar
barcode4j-2.1.jar
batik-anim-1.7.jar
batik-awt-util-1.7.jar
batik-bridge-1.7.jar
batik-css-1.7.jar
batik-dom-1.7.jar
batik-ext-1.7.jar
batik-extension-1.7.jar
batik-gvt-1.7.jar
batik-js-1.7.jar
batik-parser-1.7.jar
batik-script-1.7.jar
batik-svg-dom-1.7.jar
batik-svggen-1.7.jar
batik-transcoder-1.7.jar
batik-util-1.7.jar
batik-xml-1.7.jar
bcmail-jdk16-1.45.jar
bcprov-jdk16-1.45.jar
bctsp-jdk16-1.45.jar
bsh-2.0b4.jar
c3p0-0.9.1.1.jar
cglib-2.2.2.jar
commons-beanutils-1.9.1.jar
commons-cli-1.0.jar
commons-codec-1.9.jar
commons-collections-3.2.1.jar
commons-io-1.4.jar
commons-lang-2.6.jar
commons-logging-1.1.3.jar
core-1.0-SNAPSHOT.jar
core-interface-1.0-SNAPSHOT.jar
cxf-api-2.7.5.jar
cxf-rt-bindings-soap-2.7.5.jar
cxf-rt-core-2.7.5.jar
cxf-rt-databinding-jaxb-2.7.5.jar
cxf-rt-frontend-jaxws-2.7.5.jar
cxf-rt-frontend-simple-2.7.5.jar
cxf-rt-transports-http-2.7.5.jar
cxf-rt-ws-security-2.7.5.jar
cz.dalvi.commons.common-0.1.jar
cz.dalvi.commons.crypto-0.1.jar
cz.dalvi.commons.xml-0.1.jar
dom4j-1.6.1.jar
ehcache-core-2.5.1.jar
filenet-client-1.0-SNAPSHOT.jar
flexjson-2.0.jar
fontbox-1.8.5.jar
fop-1.1.jar
hibernate-commons-annotations-4.0.4.Final.jar
hibernate-core-4.3.5.Final.jar
hibernate-entitymanager-4.3.5.Final.jar
hibernate-jpa-2.1-api-1.0.0.Final.jar
iba-commons-core-1.5.jar
iba-commons-util-1.5.jar
ibm.filenet-stax-api-1.0.jar
ini4j-0.5.1.jar
ISDSClient-1.0-SNAPSHOT.jar
isds-client-1.0-SNAPSHOT.jar
Jace-1.0.jar
jackson-annotations-2.0.5.jar
jackson-core-2.0.5.jar
jackson-databind-2.0.5.jar
jandex-1.1.0.Final.jar
javassist-3.18.1-GA.jar
javax.xml.stream-stax-api-1.0.jar
jaxb-api-2.1.jar
jaxb-impl-2.1.11.jar
jaxws-api-2.1.jar
jaxws-rt-2.1.7.jar
jboss-logging-3.1.3.GA.jar
jboss-logging-annotations-1.2.0.Beta1.jar
jboss-transaction-api_1.2_spec-1.0.0.Final.jar
jcl-over-slf4j-1.7.1.jar
jcommander-1.27.jar
jempbox-1.8.5.jar
joda-time-2.3.jar
jstl-1.2.jar
log4j-1.2.17.jar
mimepull-1.3.jar
mimepull-1.7.jar
opensaml-2.5.1-1.jar
openws-1.4.2-1.jar
pdfbox-1.8.5.jar
quartz-2.2.1.jar
resolver-20050927.jar
saaj-impl-1.3.18.jar
slf4j-api-1.7.1.jar
slf4j-log4j12-1.7.6.jar
spring-aop-4.0.3.RELEASE.jar
spring-beans-4.0.3.RELEASE.jar
spring-context-4.0.3.RELEASE.jar
spring-context-support-4.0.3.RELEASE.jar
spring-core-4.0.3.RELEASE.jar
spring-expression-4.0.3.RELEASE.jar
spring-jdbc-4.0.3.RELEASE.jar
spring-ldap-core-1.3.2.RELEASE.jar
spring-orm-4.0.3.RELEASE.jar
spring-security-config-3.2.4.RELEASE.jar
spring-security-core-3.2.4.RELEASE.jar
spring-security-ldap-3.2.4.RELEASE.jar
spring-security-web-3.2.4.RELEASE.jar
spring-tx-4.0.3.RELEASE.jar
spring-web-4.0.3.RELEASE.jar
spring-webmvc-4.0.3.RELEASE.jar
sta-client-1.0-SNAPSHOT.jar
stax2-api-3.1.1.jar
stax-api-1.0.1.jar
stax-ex-1.2.jar
streambuffer-0.9.jar
testng-6.8.8.jar
usertype.core-3.1.0.GA.jar
usertype.spi-3.1.0.GA.jar
velocity-1.7.jar
woodstox-core-asl-4.2.0.jar
ws-api-1.0-SNAPSHOT.jar
wsdl4j-1.6.3.jar
wss4j-1.6.10.jar
wstx-asl-3.2.3.jar
xalan-2.6.0.jar
xercesImpl-2.11.0.jar
xlxpScanner-1.0.jar
xlxpScannerUtils-1.0.jar
xml-apis-1.4.01.jar
xml-apis-ext-1.3.04.jar
xmlgraphics-commons-1.5.jar
xmlsec-1.5.4.jar
xmlschema-core-2.0.3.jar
xmltooling-1.3.2-1.jar
xpp3_min-1.1.4c.jar
xstream-1.3.1.jar

从WAS上的java.security设置中,我认为这也可能有所帮助:

I think this could also be helpful, from java.security setting on my WAS:

# Default JSSE socket factories
#ssl.SocketFactory.provider=com.ibm.jsse2.SSLSocketFactoryImpl
#ssl.ServerSocketFactory.provider=com.ibm.jsse2.SSLServerSocketFactoryImpl
# WebSphere socket factories (in cryptosf.jar)
ssl.SocketFactory.provider=com.ibm.websphere.ssl.protocol.SSLSocketFactory
ssl.ServerSocketFactory.provider=com.ibm.websphere.ssl.protocol.SSLServerSocketFactory

推荐答案

需要将javax.net.ssl.*属性设置为System属性,而不是JavaMail Session属性.尽管我希望如果根本不设置它们,那么将使用一些合理的默认值.

The javax.net.ssl.* properties need to be set as System properties, not JavaMail Session properties. Although I would hope that if they weren't set at all some reasonable defaults would be used.

这篇关于Websphere 7 javax.mail.MessagingException:SSLSocketFactory为空的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

06-09 12:36