使用SSL进行Tomcat客户端身份验证

9
我有些困惑,因为我不是一个Tomcat专家。我需要使用第三方的Web服务,并且他们要求通过SSL进行客户端身份验证,所以他们为我生成并颁发了一个SSL证书。不幸的是,这就是他们的支持范围,他们不能给我任何关于如何实际使用它的指导。我被迫忍受他们的缺乏支持,因为我必须使用这个第三方。
现在,我手头上有一个Java应用程序,由供应商提供(显然他们从未遇到过这种情况),一个运行在CentOS 5.3上的Tomcat应用服务器6.0.20,以及来自第三方的SSL证书。
那么此时我需要做什么?我能在网上找到的只是如何设置密钥库,以便我的应用程序可以对连接到它的东西进行客户端身份验证,而不是当它需要连接到别人时,或者如何在8443端口上使用SSL(我已经知道如何做了并已经设置好了)。

根据你提供的信息,我倾向于同意网络服务提供商的选择。他们选择使用了一个标准的、受到广泛支持的身份验证机制。除非你付费咨询,否则他们没有权利告诉你如何实现他们指定的接口。幸运的是,由于他们选择了一个广泛使用的标准,你有许多资源可以使用(其中许多资源,如StackOverflow,是免费的),并且学习一项可能在其他情况下对你有益的技术。 - erickson
我的不满远不止这一个问题。我们不仅支付了服务访问费,而且还必须按交易次数付费,因此我希望至少能获得一些帮助(除了几个几乎没有技术细节的模糊 PDF 文件)。所有其他第三方服务提供商都会给我提供代码示例或在我有疑问时指引我正确的方向。 - dragonmantank
3个回答

10

更新:

尝试以下方法在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创建密钥和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中,有一个信任库(truststore),其中包含CA的证书,另一个是密钥库(keystore),其中包含服务器的密钥和证书(p12文件)。

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

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

您可以随意分配别名。注意在执行上述命令后输入的密码。我们将在server.xml文件中使用该密码。对于以下命令也适用相同的规则。

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

keytool

<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。您可以访问博客以获取此答案的详细版本。希望这有所帮助。


请问您能否修复那篇损坏的博客文章链接? - mavis

4

所以我需要做的就是生成一个密钥库(我猜不需要使用Port属性),当我的应用程序访问第三方时(比如通过SOAP),它会捕获SSL认证请求并发送客户端SSL。 - dragonmantank
如果他们给了你一个证书,让你用它来连接他们,那么他们也应该给你一个私钥。通常情况下,你会生成两者,保留私钥并将证书副本发送给他们放在服务器上。但是,确保将私钥和证书放入密钥库中,将其服务器证书放入信任库中,并将它们放入SSLContext以生成SSL套接字。 - Jeremy Huiskamp

1

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

提供Web应用程序的供应商应该告诉您如何使客户端连接使用特定的客户端证书,在与远程Web服务建立SSL连接时。

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

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

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

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

你需要配置Tomcat来传递这些属性。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接