【问题标题】:Java SSL Client No Self Signed CertificateJava SSL 客户端无自签名证书
【发布时间】: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。

标签: java ssl https ejb


【解决方案1】:

如果您收到任何描述的 HTTP 错误代码,则证明 SSL 部分工作正常。

这里的问题是 500,它表示服务您的请求的服务器错误,这与 SSL 无关。您将不得不查看服务器日志以找出导致它的原因。

【讨论】:

  • 您必须查看服务器日志。 500 的全部意义在于它不会泄露有关问题所在的信息。
  • 我不知道。这是你的环境,不是我的。询问运行服务器的人员。
猜你喜欢
  • 2011-06-11
  • 2011-05-24
  • 2021-11-17
  • 2010-11-13
  • 1970-01-01
  • 2012-02-15
  • 2014-06-07
  • 1970-01-01
  • 2018-09-21
相关资源
最近更新 更多