以下是我的GWT Web应用程序中的web.xml配置的片段
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE web-app
PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd">
<web-app>
<servlet>
<servlet-name>firstServlet</servlet-name>
<servlet-class>com.test.server.First</servlet-class>
</servlet>
<servlet>
<servlet-name>secondServlet</servlet-name>
<servlet-class>com.test.server.Second</servlet-class>
</servlet>
<servlet>
<servlet-name>thirdServlet</servlet-name>
<servlet-class>com.test.server.Third</servlet-class>
</servlet>
</web-app>
让我们说:
问题:
1 - 我可以为secondServlet和thirdServlet使用不同的SSL证书(可能是自签名的),而不会影响firstServlet吗? (这意味着firstServlet将接受http查询,secondServlet和thirdServlet将只接受httpS查询)。
2 - 我该怎么做? (web.xml中相关Servlet所需的语法等)
谢谢,
答案 0 :(得分:1)
传统上,单个IP上只有一个证书。因此,如果您可以使您的Web服务器在其自己的IP地址(也就是另一个主机名)上处理每个servlet,您就可以执行此操作。示例:您在servlet1.example.com上有一台服务器,在servlet2.example.com上有另一台服务器,并且两台服务器都有不同的IP地址,那么您可以在每台服务器上使用不同的servlet和不同的证书,或者您也可以有一个没有证书的服务器。
使用服务器名称指示,同一IP地址上可以有多个主机名,每个主机名都可以拥有自己的证书。但是,没有证书就不可能拥有任何主机名,因为它们的Web服务器将侦听相同的IP /端口以进行SSL连接,并且只有在从客户端获得将要提供证书的初始Hello之后才能确定。因此,如果您只有很少的IP地址,但每个servlet可以拥有一个唯一的主机名,则可以使用SNI。但是,任何没有证书的servlet都需要从不同的IP地址和https servlet提供服务。示例:如果您有servlet1.example.com,servlet2.example.com共享相同的IP地址,而不是每个服务器都有不同的证书,如果客户端支持SNI(所有最近的浏览器都支持,但IE8不支持)。但是你不能把servlet1.example.com变成SSL,而servlet2.example.com也不能,只要它们共享相同的IP地址。
不可能拥有特定于URL路径的证书,因为该路径仅在SSL握手后才知道,例如证书提供后。示例:https://www.example.com/servlet1
和https://www.example.com/servlet2
无法使用不同的证书,因为它们共享相同的主机名,并且仅与URL的路径不同。
答案 1 :(得分:0)
实现这一目标的一种方法是应用程序和Web服务器配置的组合。使用 Apache2 作为带有模块 mod_rewrite 的Web前端,您可以配置此重定向。然后,在您的应用程序中,您将需要让每个Servlet在不同的URL中进行应答(映射)。
按照下面的示例,在第一个块中,HTTP端口80,它是re:
在apache中,在conf.d目录中创建一个新的conf文件,如下例所示:
<VirtualHost 10.0.0.199:80>
(...)
#redirect all to https
RewriteEngine on
RewriteCond %{HTTP_HOST} !^www\.yourdomain\.com [NC]
RewriteCond %{HTTP_HOST} !^$
RewriteRule ^/(.*) https://www.yourdomain.com/$1 [L,R]
(...)
#redirect based on URI to https
RewriteCond %{REQUEST_URI} !^\/servlet1\/
RewriteRule (.*) https://%{HTTP_HOST}$1 [L,R=301]
(...)
</VirtualHost>
<VirtualHost 10.0.0.199:443>
(...)
RewriteEngine on
RewriteCond %{HTTP_HOST} !^www\.yourdomain\.com [NC]
RewriteCond %{HTTP_HOST} !^$
RewriteRule ^/(.*) https://www.yourdomain.com/$1 [L,R]
(...)
</VirtualHost>