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