【问题标题】:Tomcat Client Authentication using SSL使用 SSL 的 Tomcat 客户端身份验证
【发布时间】:2010-12-05 20:36:07
【问题描述】:

我很茫然,因为我不是 Tomcat 人。我需要使用第 3 方的 Web 服务,他们需要通过 SSL 进行客户端身份验证,因此他们生成并向我颁发了 SSL 证书。不幸的是,就他们的支持而言,这不能给我任何关于如何实际使用它的指导。我被困在使用这个第 3 方,所以很遗憾我不得不忍受他们缺乏支持。

所以我有一个供应商为我们提供的 Java 应用程序(显然他们从来没有处理过这个问题),一个在 CentOS 5.3 上运行 6.0.20 的 Tomcat 应用程序服务器,以及来自第 3 方的 SSL 证书.

此时我需要做什么?我在网上只能找到如何设置密钥库,以便我的应用程序可以对连接到它的事物使用客户端身份验证,而不是在它需要连接到其他人时,或者如何通过端口 8443 使用 SSL(我知道怎么办已经设置好了)。

【问题讨论】:

  • 根据您提供的信息,我倾向于同意网络服务提供商的观点。他们选择使用标准的、广泛支持的身份验证机制。他们没有业务(除非您付钱请他们咨询)告诉您如何实现他们指定的接口。幸运的是,由于他们确实选择了一个广泛使用的标准,因此您确实有很多资源可供您参考(其中许多资源(例如 StackOverflow)是免费的),并学习一种可能在其他情况下使您受益的技术。
  • 我对他们的抱怨远不止这一个问题。我们付费不仅是为了访问服务,而且我们还必须为每笔交易付费,所以我希望至少能得到一些帮助(除了一些几乎没有其中的技术细节)。我所有的其他 3rd 方服务提供商至少会给我代码示例,或者当我有问题时可以为我指明正确的方向。

标签: tomcat ssl


【解决方案1】:

更新:

尝试以下方式在Tomcat中启用客户端身份验证。

为了使 tomcat 能够利用客户端身份验证,我们需要三个证书。即 Tomcat 的服务器证书、浏览器的客户端证书和将签署上述两个证书的 CA 证书。在这里,我将展示如何在 Windows 中执行此操作。

有两种方法。

  1. 您应该有一个 CSR 文件,即证书签名请求。您可以将其提交给证书颁发机构,例如 VerisignComodo 或许多其他类似的机构。他们会给你证书。或者

  2. 您可以创建自己的证书颁发机构并签署证书。但建议仅供个人使用。

您应该安装 Java 和 OpenSSL 以执行以下步骤。

要生成证书签名请求,您应该拥有密钥。要生成密钥,请在 CMD 中键入以下命令。

openssl genrsa -out Serverkey.key 1024

这将生成一个文件“Serverkey.key”。密钥大小为 1024。您可以根据自己的要求给它。

现在借助以下命令生成 CSR 文件。

openssl req -new -key Serverkey.key -out ServerReq.csr -config /path/to/openssl.cnf

执行此命令后,系统会要求您提供一些信息。 之后,您将在您的目录中找到 CSR 文件。您可以将此文件提交给 CA。如果您这样做是为了个人用途,并且想要拥有自己的 CA,请借助上面给出的两个命令为您的 CA 创建密钥和 CSR。获得 CA 的 CSR 后,您可以在以下命令的帮助下使用 CA 的密钥进行签名。

openssl x509 -req -days 365 -in CAReq.csr -signkey CAKey.key -out CA.crt

拥有 CA 证书后,您可以使用它来签署其他证书。

openssl x509 -req -days 365 -CA CA.crt -CAkey CAKey.key -CAcreateserial -in ServerReq.csr -out Server.crt

您也可以对客户端证书使用相同的命令。

作为我们这里的客户端的浏览器将接受 P12 格式的证书。 P12 格式是一个包含您的证书和密钥的文件。

要将 CRT 转换为 P12,请使用以下命令。

openssl pkcs12 -export -in Server.crt -inkey ServerKey.key -chain -CAfile CA.crt -out ServerCert.p12

在 tomcat 中,有一个信任库将拥有 CA 的证书,另一个是密钥库,将拥有服务器的密钥和证书(p12 文件)。

要将 CA 的证书导入到信任库,请使用以下命令。

keytool -import -alias CertAuth -keystore caCerts.jks -file CA.crt

你可以给任何你想要的别名。请注意执行上述命令后询问时提供的密码。我们将在 server.xml 文件中使用该密码。同样适用于以下命令。

要将 p12 格式证书导入密钥库,请使用以下命令。

keytool -importkeystore -destkeystore tomcat.keystore -srckeystore -ServerCert.p12 -srcstoretype PKCS12 -alias 1

现在,修改tomcat的server.xml如下。

<Connector port="8443" 
           protocol="org.apache.coyote.http11.Http11NioProtocol"
           SSLEnabled="true" scheme="https" secure="true"
           truststoreFile="path/to/truststorefile" truststorePass="password" 
           keystoreFile="path/to/keystorefile" keystorePass="password"
           clientAuth="true" sslProtocol="TLS"
           />

现在,将客户端的 P12 格式证书导入浏览器。然后,启动 tomcat 服务器并尝试访问 https://localhost:8443。您可以访问blog 获取此答案的详细版本。希望这会有所帮助。

【讨论】:

  • 你能修复损坏的博客文章链接吗?
【解决方案2】:

这是一个很长的答案:http://java.sun.com/javase/6/docs/technotes/guides/security/jsse/JSSERefGuide.html

不要相信我的话,但我相信,作为客户端,客户端身份验证将在服务器请求时自动执行。

如果配置tomcat是个问题,你读过http://tomcat.apache.org/tomcat-6.0-doc/ssl-howto.html吗?特别要注意 Connector 元素的 clientAuth 属性。

【讨论】:

  • 所以我所要做的就是生成一个密钥库(我猜不使用端口属性),当我的应用程序访问第 3 方(例如,通过 SOAP)时,它将获取SSL 身份验证并沿我拥有的客户端 SSL 发送?
  • 如果他们给了你一个你必须用来连接他们的证书,他们也应该给你一个私钥。通常,您会生成两者,保留私钥并向他们发送证书副本以放在他们的服务器上。但是,是的,将私钥和证书放入密钥库,将其服务器的证书放入信任库,然后将它们放入 SSLContext 以生成 ssl 套接字。
【解决方案3】:

我不知道这是关于配置 Tomcat,除了能够将系统属性传递给在 Tomcat 中运行的 Web 应用程序。

提供 Web 应用程序的供应商确实应该能够告诉您如何从他们的软件中获取客户端连接,以便在与远程 Web 服务建立 SSL 连接时使用特定的客户端证书。

例如,他们可以让他们的应用程序为 SSL 连接实现自定义 KeyManager,从而能够从可配置的位置查找客户端证书和私钥。

如果他们没有这样做,他们可能正在使用默认的 SunX509 KeyManager。

对于默认的 KeyManager,您显然可以使用 keytool 创建一个包含客户端证书和证书描述的私钥的密钥库。然后,您可以使用以下系统参数指定该密钥存储:

-Djavax.net.ssl.keyStore="/path/to/keystore"
-Djavax.net.ssl.keyStorePassword="<password>"

您需要配置 Tomcat 以传递这些属性。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-15
    • 2014-11-13
    • 2012-04-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多