现在,我手头上有一个Java应用程序,由供应商提供(显然他们从未遇到过这种情况),一个运行在CentOS 5.3上的Tomcat应用服务器6.0.20,以及来自第三方的SSL证书。
那么此时我需要做什么?我能在网上找到的只是如何设置密钥库,以便我的应用程序可以对连接到它的东西进行客户端身份验证,而不是当它需要连接到别人时,或者如何在8443端口上使用SSL(我已经知道如何做了并已经设置好了)。
更新:
尝试以下方法在Tomcat中启用客户端身份验证。
为了使Tomcat能够利用客户端身份验证,我们需要三个证书。即Tomcat的服务器证书、浏览器的客户端证书和将签署上述两个证书的CA证书。这里,我将展示如何在Windows中完成此操作。
有两种方法:
您应该有一个CSR文件,即证书签名请求。您可以将其提交给像Verisign或Comodo等许多其他类似机构的证书颁发机构,并提供给您证书。或者
您可以创建自己的证书颁发机构并签署证书。但是仅建议出于个人使用目的而执行此操作。
您应该已安装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。您可以访问博客以获取此答案的详细版本。希望这有所帮助。
我不知道这与配置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来传递这些属性。