如何在Ubuntu 14上使用SSL配置tomcat 7 - 未解答的问题

时间:2015-05-08 08:53:00

标签: tomcat ubuntu ssl

在tomcat上有数百个安装SSL的指南,但我找不到这些关键问题。

安装SSL有两种方法:一种是我们的keytool,另一种是简单地将证书文件放在FS上,并将server.xml指向这些文件(不使用keytool)。

如果有人知道答案,我将非常感激这些问题:

  1. 使用更复杂的keytool是否有任何优势,而不仅仅是将证书放在FS上,例如在/ etc / ssl
  2. 如果使用keytool,则必须提供" -keystore xxx.jks"。 xxx.jks应该放在哪里,例如/ root,/ home / tomcat7,/ etc / var / lib / tomcat7?我只能找到一个说明如何设置密钥库的指南,它说把它放在tomcat目录中,这似乎很疯狂,因为当我们升级tomcat时,我们失去了证书,但如果这是一个很难的要求那么我们就可以做到
  3. 如果使用keytool,哪个用户应该使用该工具导入cert,tomcat7或root?
  4. 他们可用的示例显示如何将证书导入到用于生成原始csr的密钥库中。我们没有使用它来生成csr(我们从第三方获得了证书)。这是否意味着我们无法使用密钥库,或者需要先生成虚拟csr?
  5. 我们不知道哪个CA用于颁发证书,因此无法查找答案。我们有3个文件:gd_bundle-g2-g1.crt,our.crt和our.key

    我们使用java 7。

    -----更新1 ------

    收到建议我们不能将keytool用于我们现有的密钥/ crt文件(我们认为是由go daddy发布),我们尝试了将密钥/证书直接放入server.xml的旧方法,这肯定是用来工作的旧版本的tomcat:

    我们收到此错误:

     java.io.FileNotFoundException: /usr/share/tomcat7/.keystore (No such file or directory)
    

    ----更新2 -----

    我们发现this post显示了如何将现有证书与tomcat一起使用:

    openssl pkcs12 -export -in mycert.crt -inkey mykey.key -out our.p12 -name tomcat -CAfile myCA.crt -caname root -chain

    然后编辑server.xml:

    <Connector port="443" protocol="HTTP/1.1" SSLEnabled="true"
               maxThreads="200" scheme="https" secure="true"
               keystoreType="PKCS12"
               keystoreFile="/etc/ssl/our.p12" keystorePass=""
               clientAuth="false" sslProtocol="TLS" />
    

    但是,这会在catalina.out中显示此消息:

     SEVERE: Failed to initialize end point associated with ProtocolHandler ["http-bio-443"]
     java.net.SocketException: No such file or directory
    

    -----更新3 -----

    所以我们不知道为什么433失败(端口80工作,443上没有别的东西,我们以root身份启动它),但是如果我们将其更改为8443,则tomcat启动时没有错误(horay) !),但是当我们导航到www.oursite.com/ourwebapp:8443时,我们得到404.如果我们尝试https://www.oursite.com/ourwebapp:8443,我们得到&#34;此网页不可用&#34;来自铬。

    netstat -a
    

    显示它正在侦听端口8443(和80,但443上没有任何内容)

    有什么想法吗?

4 个答案:

答案 0 :(得分:3)

解决catalina.out中报告的上述问题的这一部分......

  

严重:无法初始化与ProtocolHandler相关的终点[“http-bio-443”]    java.net.SocketException:没有这样的文件或目录

对我来说,这是由于tomcat不允许绑定到端口443引起的,并且与密钥库/证书无关。

我通过运行来修复它...

sudo touch /etc/authbind/byport/443 
sudo chmod 500 /etc/authbind/byport/443 
sudo chown tomcat7 /etc/authbind/byport/443

如果您没有安装authbind,请通过

安装
apt-get install authbind

答案 1 :(得分:0)

让我们从清理一些事情开始吧。

首先,X.509证书是X.509证书,无论它们是捆绑在Java密钥库,PKCS12密钥库中,还是在基于OpenSSL的软件通常使用的单独PEM文件中。你可以在所有这些之间来回转换。

其次,Tomcat有两种不同类型的连接器:基于JSSE的连接器(目前都需要使用Java或PKCS12密钥库)和基于APR的本机连接器,这需要在磁盘上使用PEM编码的文件,就像Apache httpd那样。

基于JSSE的连接器优先选择基于本地APR的连接器有一个重要原因:性能。而且我不只是谈论几个百分点。 Recent benchmarks将OpenSSL性能提高的速度比JSSE快。

如果您希望使用基于JSSE的连接器,那么您应该使用keytool生成密钥和CSR:这样对您来说会更容易。如果您希望使用基于APR的连接器,则应该从命令行使用OpenSSL来操作所有内容。

(请注意,在即将推出的Apache Tomcat 9中(可能是Tomcat 8,如果它被后端移植,有一个相当不错的更改)将接受任何这些格式的任何连接器的TLS配置。也就是说,你可以使用PEM编码的证书和密钥位于单独的文件或Java / PKCS12密钥库中, 基于本地APR的连接器基于JSSE的连接器。)

第三,如果您自己(或者您真正信任的人,如同事,NOC等)没有生成密钥,那么@EJP是对的:您的证书不安全。如果您的证书颁发机构为您生成了密钥,那么您真的应该重新开始。您没有理由相信您的证书颁发机构。

(至于不知道哪个CA签署了您的密钥...您拥有的各种证书不应该有任何神秘的标识或类似的东西。证书颁发机构的全部意义在于它是众所周知和值得信赖的。不应该很难确定CA是基于您面前的证书的。如果您无法确定涉及哪个CA,您可能希望将此任务交给其他人更熟悉X.509证书。)

答案 2 :(得分:0)

  1. 如前所述,它取决于您的连接器,基于Apr的连接器使用openssl(单个文件),基于JSSE的连接器使用java运行时ssl实现(密钥库)。当http客户端/请求数量增加时,Apr表现得更好(一般来说)。

  2. Fedora link建议将/ etc / pki / app / private作为存储私钥和证书的位置。我们使用/ opt / pki / httpd / private。

  3. 用户无关紧要,只要它可以写入密钥库文件,但密钥库应该由运行tomcat的用户(在我们的例子中使用group)拥有(可写)。

  4. 您必须将证书,捆绑和密钥导入密钥库,最好按此顺序。假设它们是PEM编码的(因为它们在apache httpd中工作),你可以使用pkcs路由:

  5. openssl pkcs12 -export -in our.crt -inkey our.key \ -out our.p12 -name some-alias \ -CAfile gd_bundle-g2-g1.crt -caname root -chain

    使用changeit作为密码。有时-CAfile -caname不起作用,你必须使用-certfile gd ...而不是。

    然后转换为密钥库:

    keytool -importkeystore \
        -deststorepass changeit -destkeypass changeit -destkeystore our.jks \
        -srckeystore our.p12 -srcstoretype PKCS12 -srcstorepass changeit \
        -alias application
    

答案 3 :(得分:0)

你真的想要Tomcat自己处理SSL,还是它背后是一个Web服务器,无论如何要为它处理SSL?如果是后者,只需注释掉server.xml中的SSL连接器。