我可以为每个servlet使用不同的SSL证书吗?

时间:2014-07-02 17:32:07

标签: java android servlets ssl

以下是我的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>

让我们说:

  • firstServlet是来自浏览器的每个查询的入口点
  • secondServlet是来自Android应用程序
  • 的每个查询的入口点
  • 和thirdServlet是来自iOS应用程序的每个查询的入口点

问题:

1 - 我可以为secondServlet和thirdServlet使用不同的SSL证书(可能是自签名的),而不会影响firstServlet吗? (这意味着firstServlet将接受http查询,secondServlet和thirdServlet将只接受httpS查询)。

2 - 我该怎么做? (web.xml中相关Servlet所需的语法等)

谢谢,

2 个答案:

答案 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/servlet1https://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>

查看http://httpd.apache.org/docs/2.2/mod/mod_rewrite.html