使用java.ext.dirs出现的问题

白诗秀儿 关注

收藏于 : 2017-04-23 16:29   被转藏 : 1   

最近在做网络爬虫,由于要用到HTTPS协议,在eclipse运行没有问题,但离开IDE手动运行时就会出现问题
运行java -Djava.ext.dirs="/xxx/xxx/lib" xxx.xxx.MainClass
报错问题如下:
javax.net.ssl.SSLKeyException: RSA premaster secret error
        at sun.security.ssl.RSAClientKeyExchange.<init>(RSAClientKeyExchange.java:87)
        at sun.security.ssl.ClientHandshaker.serverHelloDone(ClientHandshaker.java:912)
        at sun.security.ssl.ClientHandshaker.processMessage(ClientHandshaker.java:348)
        at sun.security.ssl.Handshaker.processLoop(Handshaker.java:1026)
        at sun.security.ssl.Handshaker.process_record(Handshaker.java:961)
        at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:1062)
        at sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1375)
        at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1403)
        at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1387)
        at org.apache.http.conn.ssl.SSLConnectionSocketFactory.createLayeredSocket(SSLConnectionSocketFactory.java:290)
        at org.apache.http.conn.ssl.SSLConnectionSocketFactory.connectSocket(SSLConnectionSocketFactory.java:259)
        at org.apache.http.impl.conn.HttpClientConnectionOperator.connect(HttpClientConnectionOperator.java:125)
        at org.apache.http.impl.conn.PoolingHttpClientConnectionManager.connect(PoolingHttpClientConnectionManager.java:319)
        at org.apache.http.impl.execchain.MainClientExec.establishRoute(MainClientExec.java:363)
        at org.apache.http.impl.execchain.MainClientExec.execute(MainClientExec.java:219)
        at org.apache.http.impl.execchain.ProtocolExec.execute(ProtocolExec.java:195)
        at org.apache.http.impl.execchain.RetryExec.execute(RetryExec.java:86)
        at org.apache.http.impl.execchain.RedirectExec.execute(RedirectExec.java:108)
        at org.apache.http.impl.client.InternalHttpClient.doExecute(InternalHttpClient.java:184)
        at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:82)
        at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:106)
       
        at java.lang.Thread.run(Thread.java:745)
Caused by: java.security.NoSuchAlgorithmException: SunTls12RsaPremasterSecret KeyGenerator not available
        at javax.crypto.KeyGenerator.<init>(KeyGenerator.java:169)
        at javax.crypto.KeyGenerator.getInstance(KeyGenerator.java:223)
        at sun.security.ssl.JsseJce.getKeyGenerator(JsseJce.java:251)
        at sun.security.ssl.RSAClientKeyExchange.<init>(RSAClientKeyExchange.java:78)
        ... 22 more

跟踪了一下源码,发现他娘的java_home/jre/lib/security/java.security这个文件
只看关键位置
#
# List of providers and their preference orders (see above):
#
security.provider.1=sun.security.provider.Sun
security.provider.2=sun.security.rsa.SunRsaSign
security.provider.3=sun.security.ec.SunEC
security.provider.4=com.sun.net.ssl.internal.ssl.Provider
security.provider.5=com.sun.crypto.provider.SunJCE
security.provider.6=sun.security.jgss.SunProvider
security.provider.7=com.sun.security.sasl.Provider
security.provider.8=org.jcp.xml.dsig.internal.dom.XMLDSigRI
security.provider.9=sun.security.smartcardio.SunPCSC
security.provider.10=sun.security.mscapi.SunMSCAPI

#
# Sun Provider SecureRandom seed source.

我这人比较懒,跟踪到这里不想跟下去了,直接百度得了
百度解决方法如下:
把java_home/jre/lib/ext目录下的sunjce_provider.jar复制到自己的lib目录即可解决

但是问题到此还没有结束,加上sunjce_provider.jar后上面问题没有了,但新的问题又来了,由于项目中要调用外部JS,直接运行java  xxx.xxx.MainClass可以可以正常运行,但指定java.ext.dirs后又不正常了
ScriptEngineManager manager = new ScriptEngineManager();
ScriptEngine engine = manager.getEngineByName("JavaScript");

运行上面的代码,发现engine为null,获取不了JS引擎,tnn的,问题还真多,又百度了一下,结果万能的百度也不顶用了,怎么办,自己脑筋急转弯了一下下,应该和上面的问题一样,但不确定缺少的是哪个jar包,跟踪了一下源码,发现缺少nashorn.jar这个包,这个也是在ava_home/jre/lib/ext目录下面,  这个是1.8的,其他低版本的是哪个我就不晓得了,因为Nashorn是1.8才加进来的,恩恩,问题解决了,其他版本自己慢慢去找了^_^
 阅读文章全部内容  
点击查看
文章点评
相关文章
白诗秀儿 关注

文章收藏:1308

TA的最新收藏