是否可以使用HTTPS协议以URL“http://”开头的网站

我有一个站点,其URL以“http://”开头,但这给了我一个例外消息 – 不支持的协议:https。 该站点是否可能使用HTTPS协议,其URL仍以“http://”开头,而不是“https://”。

public ActionForward executeAction(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { ActionForward forward = mapping.findForward(Constants.SUCCESS); String link = "http://abc.fgh.jkl.mno"; URL thisURL; HttpURLConnection conn = null; try { thisURL = new URL(link); conn = (HttpURLConnection) thisURL.openConnection(); System.out.println(conn.getResponseCode()); System.out.println(conn.getResponseMessage()); } catch (Exception ex) { ex.printStackTrace(); } return forward; } 

堆栈跟踪

 java.net.ProtocolException: Unsupported protocol: https' at weblogic.net.http.HttpClient.openServer(HttpClient.java:342) at weblogic.net.http.HttpClient.New(HttpClient.java:238) at weblogic.net.http.HttpURLConnection.connect(HttpURLConnection.java:172) at weblogic.net.http.HttpURLConnection.followRedirect(HttpURLConnection.java:643) at weblogic.net.http.HttpURLConnection.getInputStream(HttpURLConnection.java:422) at weblogic.net.http.SOAPHttpURLConnection.getInputStream(SOAPHttpURLConnection.java:36) at weblogic.net.http.HttpURLConnection.getResponseCode(HttpURLConnection.java:947) at com.cingular.cscape.da.struts.action.thisAction.executeAction(thisAction.java:56) at com.cingular.cscape.da.struts.action.BaseAction.execute(BaseAction.java:300) at org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:421) at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:226) at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1164) at org.apache.struts.action.ActionServlet.doGet(ActionServlet.java:397) at javax.servlet.http.HttpServlet.service(HttpServlet.java:707) at javax.servlet.http.HttpServlet.service(HttpServlet.java:820) at weblogic.servlet.internal.StubSecurityHelper$ServletServiceAction.run(StubSecurityHelper.java:227) at weblogic.servlet.internal.StubSecurityHelper.invokeServlet(StubSecurityHelper.java:125) at weblogic.servlet.internal.ServletStubImpl.execute(ServletStubImpl.java:292) at weblogic.servlet.internal.TailFilter.doFilter(TailFilter.java:26) at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:42) at org.extremecomponents.table.filter.AbstractExportFilter.doFilter(AbstractExportFilter.java:53) at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:42) at weblogic.servlet.internal.WebAppServletContext$ServletInvocationAction.run(WebAppServletContext.java:3496) at weblogic.security.acl.internal.AuthenticatedSubject.doAs(AuthenticatedSubject.java:321) at weblogic.security.service.SecurityManager.runAs(Unknown Source) at weblogic.servlet.internal.WebAppServletContext.securedExecute(WebAppServletContext.java:2180) at weblogic.servlet.internal.WebAppServletContext.execute(WebAppServletContext.java:2086) at weblogic.servlet.internal.ServletRequestImpl.run(ServletRequestImpl.java:1406) at weblogic.work.ExecuteThread.execute(ExecuteThread.java:201) at weblogic.work.ExecuteThread.run(ExecuteThread.java:173) 

您是否注意到exception消息中的不匹配撇号?

 java.net.ProtocolException: Unsupported protocol: https' ^ 

更新:看起来这个撇号只是WebLogic HttpClient如何打印此exception的一个怪癖。

在聊天会话中发现了 Asker的根问题:他正在访问一个http:// URL,将他重定向到https:// URL。 该https地址的Web服务器正在提供他的JRE / HttpClient不信任的证书。

实际的exception应该是SSLKeyException。 我认为WebLogic HttpClient错误地将此问题误报为不受支持的协议问题。 我认为核心问题是:

javax.net.ssl.SSLKeyException: [Security:090477] Certificate chain received from www.X.com - nnn.nnn.nnn.nnn was not trusted causing SSL handshake failure.

这是Asker在直接访问https:// URL时看到的消息(而不是通过重定向链)。

默认情况下,Java的Http [s] URLConnection会自动且安静地跟踪重定向。 如果您对重定向到的位置感到好奇,请尝试以下代码:

 connection.setInstanceFollowRedirects(false); String location = connection.getHeaderField("Location"); System.out.println("Redirected to: " + location); 

请注意,您重定向到的URL也可能会将您重定向到其他地方以及其他地方,直到http.maxRedirects次。 重定向可能以这种方式“链接”。 如果他们确实链接,您将需要继续关注重定向,直到您找到不发出重定向的url。 这是在setInstanceFollowRedirects(true)时URL连接最终完成的地方。

另外,我在sun.net.www.protocol.http.HttpURLConnection中找到了一些代码,似乎表明HttpURLConnection可能不支持切换协议(HTTP – > HTTPS)作为其自动重定向遵循逻辑的一部分

 private boolean followRedirect() throws IOException { // ... [snip] ... if (!url.getProtocol().equalsIgnoreCase(locUrl.getProtocol())) { return false; // ... [snip] ... 

WebLogic有自己的(不同的)HttpURLConnection实现,但它可能包含类似的逻辑以防止协议切换。 因此,即使Asker解决了他的证书信任问题,他仍然可能无法使用HttpURLConnection自动遵循从HTTP到HTTPS的重定向链。 解决方法是使用setInstanceFollowRedirects(false)并手动跟踪重定向。 或直接访问HTTPS站点。

HTTP是一种在TCP / IP上运行的协议。 HTTPS是安全套接字上的HTTP(SSL或更新的TLS)。 现在,什么是URL? 它是一个标识资源的字符串,看起来大致如下:

 scheme://host:port/path/to/resource 

请注意,有时我们不指定端口号,因为某些protcols具有关联的已知端口号。 对于HTTP为80,对于HTTPS为443,因此隐含了这些数字。 但是,请注意,您可以在任何端口上绑定服务器套接字:如果您告诉HTTP服务器程序将其套接字绑定到localhost上的端口8273,它将很乐意这样做。

说,在您的情况下,消息显示“不支持的协议: https ”。 我们可以在这里猜测,但我认为您传递给URL的字符串不是您想要的字符串。

另一种可能性是HTTP地址响应对HTTPS URL的3xx重定向响应,客户端尝试遵循该URL,但不支持。 您可以通过tcpdump或wireshark捕获网络流量。

有很多Java HTTP客户端库支持HTTPS,为什么不切换到其中一个?