您的位置:首页 > 编程语言 > Java开发

SSLSocketFactory is null. This can occur if javax.net.ssl.SSLSocketFactory.getDefault() is called t

2015-03-13 11:37 609 查看
问题 :

tmcat运行正常,移植到was上时报: 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.

代码如下:

LdapContext ctx;

    public test1() {

        Hashtable<String, String> env = new Hashtable<String, String>();

        try {

            // 设置信任证书

            System.setProperty("javax.net.ssl.trustStore",System.getProperty("java.home")+"/lib/security/cacerts");

            System.setProperty("javax.net.ssl.trustStorePassword", "changeit");

            env.put(Context.SECURITY_PROTOCOL, "ssl");

            env.put(Context.INITIAL_CONTEXT_FACTORY,"com.sun.jndi.ldap.LdapCtxFactory");

            env.put(Context.PROVIDER_URL, "ldaps://10.0.7.5:636");

            env.put(Context.SECURITY_AUTHENTICATION, "simple");

            env.put(Context.SECURITY_PRINCIPAL,"CN=*,OU=*,DC=sinokorealife,DC=*");

            env.put(Context.SECURITY_CREDENTIALS, "Sinokorealife_AD");

            ctx = new InitialLdapContext(env, null);

            System.out.println("管理员连接成功");

            String password="123456";

            String username="test";

            ModificationItem[] mods = new ModificationItem[1];

            String newQuotedPassword = "\"" + password + "\"";

            byte[] newUnicodePassword = newQuotedPassword.getBytes("UTF-16LE");

            mods[0] = new ModificationItem(DirContext.REPLACE_ATTRIBUTE,new BasicAttribute("unicodePwd",newUnicodePassword));

            ctx.modifyAttributes("CN="+username+",OU=SINOKOREALIFE,DC=sinokorealife,DC=biz", mods);    

            ctx.close();

            if(check(username,password))

            {

                System.out.println("成功");

            }

        } catch (NamingException e) {

            e.printStackTrace();

        }

        catch (UnsupportedEncodingException e) {

            e.printStackTrace();

        }     

在       ctx = new InitialLdapContext(env, null); 报SLLSocketFactory is null

原因判定:

1 .在tomcat采用sun的jvm,而在was上则采用的是ibm的jvm,两者功能上大体相同,但是细节方面还是有略微差异,所以可能是兼容性的问题导致System.setProperty()没有  被读取。

解决方法:

System.setProperty("javax.net.ssl.trustStore",System.getProperty("java.home")+"/lib/security/cacerts");

System.setProperty("javax.net.ssl.trustStorePassword", "changeit");

更换为

env.put("javax.net.ssl.trustStore","System.getProperty("java.home")+"/lib/security/cacerts"");

env.put("javax.net.ssl.trustStorePassword", "changeit");

另外

env.put(Context.SECURITY_PROTOCOL, "ssl");与

env.put(Context.PROVIDER_URL, "ldaps://10.0.7.5:636");冲突

修改为

env.put(Context.SECURITY_PROTOCOL, "ssl");

env.put(Context.PROVIDER_URL, "ldap://10.0.7.5:636");
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐