使用HttpClient通过HTTPS信任所有证书(Trusting all certificates using HttpClient over HTTPS)
最近发布了一个关于
HttpClient
over Https的问题( 在这里找到 )。 我已经取得了一些进展,但是我遇到了新的问题。 与我最后一个问题一样,我似乎无法找到适合我的任何地方的例子。 基本上,我希望我的客户端接受任何证书(因为我只指向一个服务器),但是我不断得到一个javax.net.ssl.SSLException: Not trusted server certificate exception.
所以这就是我所拥有的
public void connect() throws A_WHOLE_BUNCH_OF_EXCEPTIONS { HttpPost post = new HttpPost(new URI(PROD_URL)); post.setEntity(new StringEntity(BODY)); KeyStore trusted = KeyStore.getInstance("BKS"); trusted.load(null, "".toCharArray()); SSLSocketFactory sslf = new SSLSocketFactory(trusted); sslf.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER); SchemeRegistry schemeRegistry = new SchemeRegistry(); schemeRegistry.register(new Scheme ("https", sslf, 443)); SingleClientConnManager cm = new SingleClientConnManager(post.getParams(), schemeRegistry); HttpClient client = new DefaultHttpClient(cm, post.getParams()); HttpResponse result = client.execute(post); }
这是我得到的错误:
W/System.err( 901): javax.net.ssl.SSLException: Not trusted server certificate W/System.err( 901): at org.apache.harmony.xnet.provider.jsse.OpenSSLSocketImpl.startHandshake(OpenSSLSocketImpl.java:360) W/System.err( 901): at org.apache.http.conn.ssl.AbstractVerifier.verify(AbstractVerifier.java:92) W/System.err( 901): at org.apache.http.conn.ssl.SSLSocketFactory.connectSocket(SSLSocketFactory.java:321) W/System.err( 901): at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:129) W/System.err( 901): at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:164) W/System.err( 901): at org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:119) W/System.err( 901): at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:348) W/System.err( 901): at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:555) W/System.err( 901): at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:487) W/System.err( 901): at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:465) W/System.err( 901): at me.harrisonlee.test.ssl.MainActivity.connect(MainActivity.java:129) W/System.err( 901): at me.harrisonlee.test.ssl.MainActivity.access$0(MainActivity.java:77) W/System.err( 901): at me.harrisonlee.test.ssl.MainActivity$2.run(MainActivity.java:49) W/System.err( 901): Caused by: java.security.cert.CertificateException: java.security.InvalidAlgorithmParameterException: the trust anchors set is empty W/System.err( 901): at org.apache.harmony.xnet.provider.jsse.TrustManagerImpl.checkServerTrusted(TrustManagerImpl.java:157) W/System.err( 901): at org.apache.harmony.xnet.provider.jsse.OpenSSLSocketImpl.startHandshake(OpenSSLSocketImpl.java:355) W/System.err( 901): ... 12 more W/System.err( 901): Caused by: java.security.InvalidAlgorithmParameterException: the trust anchors set is empty W/System.err( 901): at java.security.cert.PKIXParameters.checkTrustAnchors(PKIXParameters.java:645) W/System.err( 901): at java.security.cert.PKIXParameters.<init>(PKIXParameters.java:89) W/System.err( 901): at org.apache.harmony.xnet.provider.jsse.TrustManagerImpl.<init>(TrustManagerImpl.java:89) W/System.err( 901): at org.apache.harmony.xnet.provider.jsse.TrustManagerFactoryImpl.engineGetTrustManagers(TrustManagerFactoryImpl.java:134) W/System.err( 901): at javax.net.ssl.TrustManagerFactory.getTrustManagers(TrustManagerFactory.java:226)W/System.err( 901): at org.apache.http.conn.ssl.SSLSocketFactory.createTrustManagers(SSLSocketFactory.java:263) W/System.err( 901): at org.apache.http.conn.ssl.SSLSocketFactory.<init>(SSLSocketFactory.java:190) W/System.err( 901): at org.apache.http.conn.ssl.SSLSocketFactory.<init>(SSLSocketFactory.java:216) W/System.err( 901): at me.harrisonlee.test.ssl.MainActivity.connect(MainActivity.java:107) W/System.err( 901): ... 2 more
Recently posted a question regarding the
HttpClient
over Https (found here). I've made some headway, but I've run into new issues. As with my last problem, I can't seem to find an example anywhere that works for me. Basically, I want my client to accept any certificate (because I'm only ever pointing to one server) but I keep getting ajavax.net.ssl.SSLException: Not trusted server certificate exception.
So this is what I have:
public void connect() throws A_WHOLE_BUNCH_OF_EXCEPTIONS { HttpPost post = new HttpPost(new URI(PROD_URL)); post.setEntity(new StringEntity(BODY)); KeyStore trusted = KeyStore.getInstance("BKS"); trusted.load(null, "".toCharArray()); SSLSocketFactory sslf = new SSLSocketFactory(trusted); sslf.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER); SchemeRegistry schemeRegistry = new SchemeRegistry(); schemeRegistry.register(new Scheme ("https", sslf, 443)); SingleClientConnManager cm = new SingleClientConnManager(post.getParams(), schemeRegistry); HttpClient client = new DefaultHttpClient(cm, post.getParams()); HttpResponse result = client.execute(post); }
And here's the error I'm getting:
W/System.err( 901): javax.net.ssl.SSLException: Not trusted server certificate W/System.err( 901): at org.apache.harmony.xnet.provider.jsse.OpenSSLSocketImpl.startHandshake(OpenSSLSocketImpl.java:360) W/System.err( 901): at org.apache.http.conn.ssl.AbstractVerifier.verify(AbstractVerifier.java:92) W/System.err( 901): at org.apache.http.conn.ssl.SSLSocketFactory.connectSocket(SSLSocketFactory.java:321) W/System.err( 901): at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:129) W/System.err( 901): at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:164) W/System.err( 901): at org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:119) W/System.err( 901): at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:348) W/System.err( 901): at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:555) W/System.err( 901): at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:487) W/System.err( 901): at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:465) W/System.err( 901): at me.harrisonlee.test.ssl.MainActivity.connect(MainActivity.java:129) W/System.err( 901): at me.harrisonlee.test.ssl.MainActivity.access$0(MainActivity.java:77) W/System.err( 901): at me.harrisonlee.test.ssl.MainActivity$2.run(MainActivity.java:49) W/System.err( 901): Caused by: java.security.cert.CertificateException: java.security.InvalidAlgorithmParameterException: the trust anchors set is empty W/System.err( 901): at org.apache.harmony.xnet.provider.jsse.TrustManagerImpl.checkServerTrusted(TrustManagerImpl.java:157) W/System.err( 901): at org.apache.harmony.xnet.provider.jsse.OpenSSLSocketImpl.startHandshake(OpenSSLSocketImpl.java:355) W/System.err( 901): ... 12 more W/System.err( 901): Caused by: java.security.InvalidAlgorithmParameterException: the trust anchors set is empty W/System.err( 901): at java.security.cert.PKIXParameters.checkTrustAnchors(PKIXParameters.java:645) W/System.err( 901): at java.security.cert.PKIXParameters.<init>(PKIXParameters.java:89) W/System.err( 901): at org.apache.harmony.xnet.provider.jsse.TrustManagerImpl.<init>(TrustManagerImpl.java:89) W/System.err( 901): at org.apache.harmony.xnet.provider.jsse.TrustManagerFactoryImpl.engineGetTrustManagers(TrustManagerFactoryImpl.java:134) W/System.err( 901): at javax.net.ssl.TrustManagerFactory.getTrustManagers(TrustManagerFactory.java:226)W/System.err( 901): at org.apache.http.conn.ssl.SSLSocketFactory.createTrustManagers(SSLSocketFactory.java:263) W/System.err( 901): at org.apache.http.conn.ssl.SSLSocketFactory.<init>(SSLSocketFactory.java:190) W/System.err( 901): at org.apache.http.conn.ssl.SSLSocketFactory.<init>(SSLSocketFactory.java:216) W/System.err( 901): at me.harrisonlee.test.ssl.MainActivity.connect(MainActivity.java:107) W/System.err( 901): ... 2 more
原文:https://stackoverflow.com/questions/2642777
最满意答案
现在做什么???
您现在可以像这样调用
carObj
上的方法:Method method = carObj.getClass().getMethod(methodName); method.invoke(carObj);
也可以看看:
What to do now???
You can now call the method on your
carObj
like this:Method method = carObj.getClass().getMethod(methodName); method.invoke(carObj);
See also:
相关问答
更多-
下列中不属于面向对象的编程语言的是?[2022-05-30]
a -
在Java中的另一种方法中将方法结果作为查询参数传递(Passing method result as a query parameter in another method in java)[2022-10-10]
您可以将getMaxDate()的结果分配给String,如下所示: String result = getMaxDate(); 然后在get_account_balance()中使用结果,如下所示: get_account_balance(result) 如果您在将结果作为参数传递时遇到问题,则只需更改方法的签名,如下所示: get_account_balance(String MemberNo, String result) 您也可以从方法中调用getMaxDate(),如下所示: .setPar ... -
在Java中通过类型参数作为通用方法的类型参数传递类(Passing a class with type parameter as type parameter for generic method in Java)[2022-01-01]
这实际上可以在Java中使用一些“技巧”。 不要屈服于C#狂热分子的压力! (J / K) “窍门”是创建一个扩展通用类型的类,并通过.getGenericSuperclass()或.getGenericInterfaces()返回的类型访问父类的type参数的值。 这很麻烦 为了简化我们的生活,Google已经为我们编写了大部分无聊的代码,并通过Guava提供了可用性。 检查TypeToken类,它完全符合你想要的。 例如: TypeToken- > stringListTok = ...
-
通过将类名和方法名作为参数传递来运行java方法(Run a java method by passing class name and method name as parameter)[2022-02-21]
现在做什么??? 您现在可以像这样调用carObj上的方法: Method method = carObj.getClass().getMethod(methodName); method.invoke(carObj); 也可以看看: Method.invoke What to do now??? You can now call the method on your carObj like this: Method method = carObj.getClass().getMethod(methodN ... -
如何将特定类的方法名称作为另一个方法的参数传递(How to pass in a method name of a particular class as a parameter of another method)[2022-04-26]
我相信这样的事情会起作用: private static void RunInThreads(int numOfThreads, JObject object, ActionfunctionToRun) { int chunks = object.Count() / numOfThreads; List threads = new List (); for (i ... -
假设您正在使用REngine API,您想构建对函数的调用,并对其进行评估: // get a reference to the function REXP fn = eng.parseAndEval("function(x) x ^ 3 - x ^ 2 - 4 * x + 2", null, false); // create a call and evaluate it REXP res = eng.eval(new REXPLanguage(new RList( new REXP[] { ...
-
将方法作为参数传递(Passing a method as a parameter)[2022-04-16]
def bob(jeff) puts "hi #{jeff}" end def mary(meth, params) meth.call(params) end mary(method(:bob), 'yo') => hi yo def bob(jeff) puts "hi #{jeff}" end def mary(meth, params) meth.call(params) end mary(method(:bob), 'yo') => hi yo -
如何将实际方法作为参数传递给Java中的另一个方法?(How can you pass in an actual method as a parameter to another method in Java?)[2020-01-19]
直接在Java中没有一流的功能支持。 两种选择: 传递方法的名称,并使用反射来获取它 创建一个包含单个成员的类型,如下所示: public interface Function{ Out apply(In input); } 然后你可以使用匿名内部类,如下所示: joinOnMethod(", ", someList, new Function () { @Override public String apply(T inp ... -
Callable接口的call方法返回类型为T的值。 你的lambda只是简单的调用方法,同样应该返回一个T值。 任何满足FunctionalInterface要求的接口都可以用lambda表达式代替。 这样的接口将有一个抽象方法,一个没有默认实现 。 对于您的问题,接口是Callable ,抽象方法是call 。 然后,lambda表达式在该接口的匿名实现中充当该抽象方法的主体。 我们以方法doStuff(Callable
stuff)为例。 要满足此接口,您可以提供一个匿名类: doS ... -
JAVA:调用未知对象类方法并传递它的参数(JAVA: Calling Unknown Object Class Method and Passing it's Parameters)[2021-12-02]
我想你只是错过了一个事实,即你可以传入参数来invoke ,作为一个Object[] : Object result = methods[i].invoke(object, new Object[] { word }); 或者使用varargs,如果您愿意: Object result = methods[i].invoke(object, word); (以上两个电话相同。) 有关更多详细信息,请参阅Method.invoke的文档。 I think you're just missing the f ...