Tomcat w/ SSL,Client/Server 网站部分验证

Tomcat w/ SSL, Client/Server Auth on portion of site

我正在尝试设置我的 Apache Tomcat 服务器,以便 SSL 在整个站点上工作,并且 client/server 身份验证在站点的一部分上强制执行。客户已将他们的根 CA(以 .crt 形式)提供给我以用于信任。他们将使用他们的客户端证书尝试连接到 https://<site>/sso/login,并且在身份验证后,站点应允许他们与该部分进行 RESTfully 交互。

首先,我使用的是 Apache Tomcat 6. 我在 server.xml:

中有一个站点设置为使用 SSL 和以下连接器
<Connector port="443" SSLEnabled="true" maxThreads="16" 
           protocol="org.apache.coyote.http11.Http11NioProtocol"
           scheme="https" secure="true"clientAuth="want"
           sslProtocol="TLS" keystoreFile="C:\ssl\keystore"
           keystorePass="***" truststoreFile="C:\ssl\keystore"
           truststorePass="***"
           />

这应该意味着我希望在整个网站上使用 SSL,但会 "want" 客户端证书。 (帮助打开 SSO 连接的站点部分需要客户端证书。)而且,事实上,SSL 工作正常。我在密钥库中有一个 GoDaddy 签名的 SSL 证书。

对于需要客户端凭据的 SSO 部分,返回 server.xml,我使用的是内存领域:

<Realm className="org.apache.catalina.realm.MemoryRealm" />

因此,在 tomcat-users.xml 中,我可以使用:

<role rolename="sso"/>
<user username="CN=***, OU=***, C=**" password="null" roles="sso"/>

... 其中用户名与客户的客户端证书的 DN 信息匹配。 (用户名中的空格重要吗?)

并且,在 web.xml 中:

<security-constraint>
    <web-resource-collection>
        <web-resource-name>SSO</web-resource-name>
        <url-pattern>/sso/login</url-pattern>
    </web-resource-collection>

    <auth-constraint>
        <role-name>sso</role-name>
    </auth-constraint>

    <user-data-constraint>
        <transport-guarantee>CONFIDENTIAL</transport-guarantee>
    </user-data-constraint>
</security-constraint>

<login-config>
    <auth-method>CLIENT-CERT</auth-method>
</login-config>

<security-role>
    <role-name>sso</role-name>
</security-role>

最后,我使用

将客户的根 CA 添加到 keystore
"%JAVA_HOME%\bin\keytool" 
  -import 
  -alias customer_root 
  -keystore "C:\ssl\keystore" 
  -trustcacerts 
  -file "C:\ssl\customer_root.crt" 
  -storepass "***"

这是我的困境...当他们转到 https://<site>/sso/login 时,尝试了客户端身份验证 ,但他们收到 HTTP 401 错误。所以,我做错了什么。

更难的是,客户无法向我提供比 "HTTP 401" 更多的有关身份验证的信息。

我已经通过许多资源来设置和创建带有授权客户端密钥的自签名 CA 密钥,我试图通过我为目的是连接到站点并 POST 连接到 ~/sso/login,但每次我 re-code/re-package/re-run 测试我 得到 HTTP 401 而不是能够至少连接一次。

所以,要么我 Tomcat 设置不正确,要么我没有正确设置客户的 CA,但我无法弄清楚是哪一个,即使通过编写我自己的客户端代码也是如此。我被难住了。

上面的内容看起来不正确吗?我是不是少了一个配置?

找到答案,供任何需要信息的人参考。

在配置文件中tomcat-users.xml...

<role rolename="sso"/>
<user username="CN=***, OU=***, C=**" password="null" roles="sso"/>

密码不应为 "null",密码应为“”

<role rolename="sso"/>
<user username="CN=***, OU=***, C=**" password="" roles="sso"/>