如何在 Linux(Red Hat - Fedora 8)上的 JBoss 5 上启用 SSL?
到目前为止我所做的是:
(1)创建测试密钥库。
(2)将新生成的server.keystore放置在$JBOSS_HOME/server/default/conf中
(3)在 $JBOSS_HOME/server/default/deploy/jbossweb.sar 中的 server.xml 中进行以下更改以包含以下内容:
<!-- SSL/TLS Connector configuration using the admin devl guide keystore -->
<Connector protocol="HTTP/1.1" SSLEnabled="true"
port="8443" address="${jboss.bind.address}"
scheme="https" secure="true" clientAuth="false"
keystoreFile="${jboss.server.home.dir}/conf/server.keystore"
keystorePass="mypassword" sslProtocol = "TLS" />
(4)问题是,当 JBoss 启动时,它会记录此异常(在启动期间)(但我仍然可以查看http://本地主机:8080/):
03:59:54,780 ERROR [Http11Protocol] Error initializing endpoint
java.io.IOException:无法恢复密钥,位于 org.apache.tomcat.util.net.jsse.JSSESocketFactory.init(JSSESocketFactory.java:456),位于 org.apache.tomcat.util.net.jsse.JSSESocketFactory.createSocket(JSSESocketFactory.java:139),位于 org.apache.tomcat.util.net.JIoEndpoint.init(JIoEndpoint.java:498),位于 org.apache.coyote.http11.Http11Protocol.init(Http11Protocol.java:175),位于 org.apache.catalina.connector.Connector.initialize(Connector.java:1029),位于 org.apache.catalina.core.StandardService.initialize(StandardService.java:683),位于org.apache.catalina.core.StandardServer.initialize(StandardServer.java:821)位于 org.jboss.web.tomcat.service.deployers.TomcatService.startService(TomcatService.java:313)
我确实知道还有很多工作要做才能实现完整的 SSL 客户端身份验证......
答案1
这可能不是您正在寻找的最直接的答案,但经过多年建立大量基于 Tomcat 的基础设施后,我现在总是使用 Apache 和 mod_ssl 来前端它们,并使用 mod_jk (ajp13) 来连接它们。这有很多好处:
- 你可以将所有静态文件处理转移到 Apache 以获得更好的性能
- 你可以使用 mod_rewrite (和其他很棒的模块) 的所有功能
- 使用 Apache 设置 SSL 是轻而易举的事,Tomcat 甚至不知道这是一个 SSL 通道
...等等。虽然 Java 引擎可以处理 SSL,但这并不是它的强项之一,而且往往比它的价值更麻烦。让 Java 处理 Web 应用程序及其 Java 代码,让 Apache 做它最擅长的事情。您还会发现 mod_jk 有很多很棒的选项可以确保您的应用程序引擎不会过载;当 Tomcat 实例响应速度不够快(或崩溃/锁定)时,使用正确的参数组合,您可以以干净、美观的方式暂时重定向用户。
答案2
这可能有点晚了,但因为你非常接近,所以似乎值得给出一个答案:
从您的描述中看不太清楚,但我假设您在密钥库中有一个服务器证书?如果没有,您需要这样做 - 如果您还没有这样做,您可以使用 OpenSSL 生成证书。
您需要向 server.xml 添加一个新参数,以指定用于在 server.keystore 中查找证书的别名。因此,如果您的证书别名是“localhost”,则需要将其添加
keyAlias="localhost"
到 server.xml 中,使其看起来像这样:<Connector protocol="HTTP/1.1" SSLEnabled="true" port="8443" address="${jboss.bind.address}" scheme="https" secure="true" clientAuth="false" keystoreFile="${jboss.server.home.dir}/conf/server.keystore" keystorePass="mypassword" sslProtocol = "TLS" keyAlias="localhost"/>
将 localhost 替换为您在 server.xml 中为证书选择的别名。
顺便说一句 - 根据您的具体要求,我倾向于同意 Tactical Vim 的观点,即使用 mod_ssl 是一个更好的选择。
最后说明 - 一旦服务器端正常工作,配置客户端身份验证就相对简单了。您需要一个新的密钥库,其中包含可信任的 CA 来签署客户端证书。因此,您有这些新参数来添加 truststoreFile、truststorePassword 和 clientAuth。将 clientAuth 设置为“want”意味着您将被要求进行身份验证,但取消不会锁定您,设置为 true 意味着如果您不提供客户端访问权限,您将无法访问服务器(此时您可能想要禁用明文连接器)。其他两个参数相当于相应的密钥库参数,但要非常小心您在信任库中放入的证书,因为信任库中的证书签名的任何证书都将被接受用于客户端身份验证(如果您考虑一下,就会明白)。
答案3
我也遇到了完全相同的问题。
“该问题是由于 Tomcat 中的一个错误引起的。如果密钥库密码和密钥密码不同(我的设置中就是这种情况),则该错误将导致此错误。修复方法是简单地使用相同的两个密码重新创建密钥库。”
现在对我有用。
答案4
我个人认为问题在于,当这个人在密钥库中创建私钥时,他给了它错误的别名。他需要给它一个“tomcat”的别名。否则,tomcat 会认为密钥库是空的,并且不会告诉你情况确实如此。