问题 :
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
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");