Search code examples
javassltwitterssl-certificatetwitter4j

Unable to post twitter status updates with error "no trusted certificate found"


I have a java process that is using Twitter4J to post an update to twitter. I have all the appropriate tokens and keys. When I attempt to post the update I get this error. I have seen that Twitter has updated it's certificates last year and I have added Verisign's Class 3 G5 certificate to my cacerts file. But this does not seem to work. An extensive trawl of the web has not found a definitive procedure to add the right certificate to a cacerts file for the twitter api.

16/02/2015 11:53:13 PM :  com.ibm.jsse2.util.g: No trusted certificate found Relevant discussions can be found on the Internet at:  http://www.google.co.jp/search?q=2fc5b7cb or  http://www.google.co.jp/search?q=11613e17 Twitter
Exception{exceptionCode=[2fc5b7cb-11613e17 2fc5b7cb-11613ded 2fc5b7cb-11613ded], statusCode=-1, message=null, code=-1, retryAfter=-1, rateLimitStatus=null, version=4.0.1}
16/02/2015 11:53:13 PM :   at twitter4j.HttpClientImpl.handleRequest(HttpClientImpl.java:179)
16/02/2015 11:53:13 PM :   at twitter4j.HttpClientBase.request(HttpClientBase.java:53)
16/02/2015 11:53:13 PM :   at twitter4j.HttpClientBase.post(HttpClientBase.java:82)
16/02/2015 11:53:13 PM :   at twitter4j.TwitterImpl.post(TwitterImpl.java:2004)
16/02/2015 11:53:13 PM :   at twitter4j.TwitterImpl.updateStatus(TwitterImpl.java:251)
16/02/2015 11:53:13 PM :  Caused by: 
16/02/2015 11:53:13 PM :  javax.net.ssl.SSLHandshakeException: com.ibm.jsse2.util.g: No trusted certificate found
16/02/2015 11:53:13 PM :   at com.ibm.jsse2.n.a(n.java:36)
16/02/2015 11:53:13 PM :   at com.ibm.jsse2.sc.a(sc.java:442)
16/02/2015 11:53:13 PM :   at com.ibm.jsse2.gb.a(gb.java:18)
16/02/2015 11:53:13 PM :   at com.ibm.jsse2.gb.a(gb.java:205)
16/02/2015 11:53:13 PM :   at com.ibm.jsse2.hb.a(hb.java:46)
16/02/2015 11:53:13 PM :   at com.ibm.jsse2.hb.a(hb.java:57)
16/02/2015 11:53:13 PM :   at com.ibm.jsse2.gb.n(gb.java:285)
16/02/2015 11:53:13 PM :   at com.ibm.jsse2.gb.a(gb.java:146)
16/02/2015 11:53:13 PM :   at com.ibm.jsse2.sc.a(sc.java:88)
16/02/2015 11:53:13 PM :   at com.ibm.jsse2.sc.g(sc.java:437)
16/02/2015 11:53:13 PM :   at com.ibm.jsse2.sc.a(sc.java:544)
16/02/2015 11:53:13 PM :   at com.ibm.jsse2.sc.startHandshake(sc.java:124)
16/02/2015 11:53:13 PM :   at com.ibm.net.ssl.www2.protocol.https.c.afterConnect(c.java:48)
16/02/2015 11:53:13 PM :   at com.ibm.net.ssl.www2.protocol.https.d.connect(d.java:39)
16/02/2015 11:53:13 PM :   at sun.net.www.protocol.http.HttpURLConnection.getOutputStream(HttpURLConnection.java:899)
16/02/2015 11:53:13 PM :   at com.ibm.net.ssl.www2.protocol.https.b.getOutputStream(b.java:47)
16/02/2015 11:53:13 PM :   at twitter4j.HttpClientImpl.handleRequest(HttpClientImpl.java:137)
16/02/2015 11:53:13 PM :   ... 8 more
16/02/2015 11:53:13 PM :  Caused by: 
16/02/2015 11:53:13 PM :  com.ibm.jsse2.util.g: No trusted certificate found
16/02/2015 11:53:13 PM :   at com.ibm.jsse2.util.f.a(f.java:154)
16/02/2015 11:53:13 PM :   at com.ibm.jsse2.util.f.b(f.java:135)
16/02/2015 11:53:13 PM :   at com.ibm.jsse2.util.d.a(d.java:12)
16/02/2015 11:53:13 PM :   at com.ibm.jsse2.gc.a(gc.java:28)
16/02/2015 11:53:13 PM :   at com.ibm.jsse2.gc.checkServerTrusted(gc.java:16)
16/02/2015 11:53:13 PM :   at com.ibm.jsse2.gc.b(gc.java:82)
16/02/2015 11:53:13 PM :   at com.ibm.jsse2.hb.a(hb.java:308)
16/02/2015 11:53:13 PM :   ... 20 more

Solution

  • I managed to solve it. There are 2 certificate files. cacerts and jssecacerts and which file the JVM uses to find the certificate depends on a system property setting and the presence of either file. I had the right certificate, but was putting it into the cacerts file, when it should be in the jssecacerts file. More about the trustmanager and how it works with certificates is explained here