【发布时间】:2014-04-25 08:45:54
【问题描述】:
我需要通过 HTTPS 发送请求。我已经阅读了很多关于 SSL 的内容,并且 Google 上有很多关于 SSL 的内容,但没有从哪里开始。
我需要通过 HTTPS 连接到 Web 服务并发送和接收数据。我正在使用 HttpsUrlConnection 发送请求。 Web 服务提供商没有自签名证书,因为它会显示在 Internet Explorer 页面上。证书由 COMODA High-Assurance Secure Server CA 颁发,但不是自签名的。
如何使用 SSL 连接来连接、发送和接收数据?请看以下代码:
public class Sender {
public void send(String endpoint) {
URL url = new URL(endpoint);
HttpsURLConnection httpsUrlConnection = (HttpsURLConnection) url.openConnection();
httpsUrlConnection.setRequestMethod(new String("POST"));
httpsUrlConnection.setDoOutput(true);
httpsUrlConnection.setRequestProperty("Content-Type", "application/xml");
SSLContext sc = SSLContext.getInstance("SSL");
sc.init(null, getTrustManager(), new SecureRandom());
httpsUrlConnection.setSSLSocketFactory(sc.getSocketFactory());
httpsUrlConnection.connect();
OutputStreamWriter outputStreamWriter = new OutputStreamWriter(httpsUrlConnection.getOutputStream());
outputStreamWriter.write(""); // writes XML data
outputStreamWriter.flush();
outputStreamWriter.close();
InputStreamReader inputStreamReader = new InputStreamReader(httpsUrlConnection.getInputStream());
char i = (char) inputStreamReader.read();
System.out.println(i);
}
public TrustManager[] getTrustManager() {
TrustManager[] trustAllCerts = new TrustManager[] { new X509TrustManager() {
public void checkClientTrusted(X509Certificate[] xcs, String string) throws CertificateException {
}
public void checkServerTrusted(X509Certificate[] xcs, String string) throws CertificateException {
System.out.println("AuthType : " + " " + string);
for(int i = 0; i < xcs.length; i++) {
System.out.println("\t" + xcs[i].getIssuerX500Principal().getName());
System.out.println("\t" + xcs[i].getIssuerDN().getName());
}
}
public X509Certificate[] getAcceptedIssuers() {
return null;
}
}};
return trustAllCerts;
} }
我在http://wpengine.com/support/how-does-all-this-work-https-ssl-certificates-ca-public-and-private-keys-csrs/ 和http://www.instantssl.com/ssl-certificate-products/https.html 上阅读了有关 SSL 的信息。
正如我提到的,我没有自签名证书,但我使用了 InstallCert.java。
从上面,我在调用 httpsUrlConnection.getInputStream() 时收到以下异常
java.io.IOException: Server returned HTTP response code: 500 for URL: // the URL endpoint
java.io.IOException: Server returned HTTP response code: 500 for URL: https://webaddress.co.uk/Service/services/Service?wsdl // not actual address. I can't give this but this is a sample address
at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1459)
at sun.net.www.protocol.https.HttpsURLConnectionImpl.getInputStream(HttpsURLConnectionImpl.java:234)
at com.screening.listener.ConnectionListenerBean.send(ConnectionListenerBean.java:191)
at com.screening.listener.ConnectionListenerBean.processMessage(ConnectionListenerBean.java:129)
at com.screening.listener.ConnectionListenerBean.listen(ConnectionListenerBean.java:107)
at com.screening.listener.ConnectionListenerBean.init(ConnectionListenerBean.java:73)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at com.sun.ejb.containers.interceptors.BeanCallbackInterceptor.intercept(InterceptorManager.java:1006)
at com.sun.ejb.containers.interceptors.CallbackChainImpl.invokeNext(CallbackChainImpl.java:61)
at com.sun.ejb.containers.interceptors.CallbackInvocationContext.proceed(CallbackInvocationContext.java:109)
at com.sun.ejb.containers.interceptors.SystemInterceptorProxy.doCallback(SystemInterceptorProxy.java:133)
at com.sun.ejb.containers.interceptors.SystemInterceptorProxy.init(SystemInterceptorProxy.java:115)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at com.sun.ejb.containers.interceptors.CallbackInterceptor.intercept(InterceptorManager.java:961)
at com.sun.ejb.containers.interceptors.CallbackChainImpl.invokeNext(CallbackChainImpl.java:61)
at com.sun.ejb.containers.interceptors.InterceptorManager.intercept(InterceptorManager.java:390)
at com.sun.ejb.containers.interceptors.InterceptorManager.intercept(InterceptorManager.java:373)
at com.sun.ejb.containers.AbstractSingletonContainer.createSingletonEJB(AbstractSingletonContainer.java:518)
at com.sun.ejb.containers.AbstractSingletonContainer.access$100(AbstractSingletonContainer.java:74)
at com.sun.ejb.containers.AbstractSingletonContainer$SingletonContextFactory.create(AbstractSingletonContainer.java:693)
at com.sun.ejb.containers.AbstractSingletonContainer.instantiateSingletonInstance(AbstractSingletonContainer.java:444)
at org.glassfish.ejb.startup.SingletonLifeCycleManager.initializeSingleton(SingletonLifeCycleManager.java:213)
at org.glassfish.ejb.startup.SingletonLifeCycleManager.initializeSingleton(SingletonLifeCycleManager.java:174)
at org.glassfish.ejb.startup.SingletonLifeCycleManager.doStartup(SingletonLifeCycleManager.java:152)
at org.glassfish.ejb.startup.EjbApplication.start(EjbApplication.java:150)
at org.glassfish.internal.data.EngineRef.start(EngineRef.java:126)
at org.glassfish.internal.data.ModuleInfo.start(ModuleInfo.java:241)
at org.glassfish.internal.data.ApplicationInfo.start(ApplicationInfo.java:236)
at com.sun.enterprise.v3.server.ApplicationLifecycle.deploy(ApplicationLifecycle.java:339)
at org.glassfish.kernel.embedded.EmbeddedDeployerImpl.deploy(EmbeddedDeployerImpl.java:214)
at org.glassfish.kernel.embedded.EmbeddedDeployerImpl.deploy(EmbeddedDeployerImpl.java:144)
at org.glassfish.ejb.embedded.EJBContainerImpl.deploy(EJBContainerImpl.java:128)
at org.glassfish.ejb.embedded.EJBContainerProviderImpl.createEJBContainer(EJBContainerProviderImpl.java:120)
at javax.ejb.embeddable.EJBContainer.createEJBContainer(EJBContainer.java:102)
at com.screening.Container.createEJBContainer(Container.java:22)
at com.screening.listener.ConnectionListenerBeanTest.setUpClass(ConnectionListenerBeanTest.java:24)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:44)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:41)
at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:27)
at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:31)
at org.junit.runners.ParentRunner.run(ParentRunner.java:292)
at org.apache.maven.surefire.junit4.JUnit4Provider.execute(JUnit4Provider.java:252)
at org.apache.maven.surefire.junit4.JUnit4Provider.executeTestSet(JUnit4Provider.java:141)
at org.apache.maven.surefire.junit4.JUnit4Provider.invoke(JUnit4Provider.java:112)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.apache.maven.surefire.util.ReflectionUtils.invokeMethodWithArray(ReflectionUtils.java:189)
at org.apache.maven.surefire.booter.ProviderFactory$ProviderProxy.invoke(ProviderFactory.java:165)
at org.apache.maven.surefire.booter.ProviderFactory.invokeProvider(ProviderFactory.java:85)
at org.apache.maven.surefire.booter.ForkedBooter.runSuitesInProcess(ForkedBooter.java:115)
at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:75)
我做错了什么?有什么要补充的吗?
通过 getTrustManager() 在控制台中打印四个证书。
【问题讨论】:
-
您能否显示异常日志的其余部分,因为 500 并不能说明什么?
-
请参阅上面的编辑。
-
我有 2 个问题:如果您使用 HTTP 连接,它是否有效,如果您从浏览器请求,HTTPS 是否有效?
-
我认为它不适用于 HTTP,因为 Web 服务提供商是一家外部公司。 HTTPS 确实可以在浏览器中工作。看到的是 XML WSDL。