【问题标题】:How to configure tomcat 7 with SSL on Ubuntu 14 - the unanswered questions如何在 Ubuntu 14 上使用 SSL 配置 tomcat 7 - 未回答的问题
【发布时间】:2015-05-08 08:52:59
【问题描述】:

有数百个在 tomcat 上安装 SSL 的指南,但我找不到任何一个可以回答这些关键问题。

安装SSL有两种方式:一种是给我们keytool,另一种是简单的把cert文件放在FS上,把server.xml指向这些文件(不使用keytool)。

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

  1. 使用更复杂的密钥工具是否有任何优势,而不是将证书放在 FS 上,例如在 /etc/ssl
  2. 如果使用 keytool,您必须提供“-keystore xxx.jks”。 xxx.jks 应该放在哪里,例如/root, /home/tomcat7, /etc /var/lib/tomcat7?我只能找到一个说明如何设置密钥库的指南,并说将其放入 tomcat 目录中,这似乎很疯狂,因为当我们升级 tomcat 时,我们会丢失证书,但如果这是一个硬性要求,那么我们可以做到.
  3. 如果使用keytool,哪个用户应该使用该工具来导入证书、tomcat7或root?
  4. 他们提供的示例展示了如何将证书导入用于生成原始 csr 的密钥库。我们没有使用它来生成 csr(我们从第 3 方获得了证书)。这是否意味着我们不能使用密钥库,或者需要先生成一个虚拟 csr?

我们不知道哪个 CA 用于颁发证书,因此无法在那里寻找答案。我们有 3 个文件:gd_bundle-g2-g1.crt、our.crt 和 our.key

我们使用 java 7。

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

收到建议说我们不能对现有的密钥/crt 文件使用 keytool(我们认为是由 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 启动时没有错误(万岁!) ,但是当我们导航到 www.oursite.com/ourwebapp:8443 时,我们得到 404。如果我们尝试 https://www.oursite.com/ourwebapp:8443,我们会从 chrome 得到“此网页不可用”。

netstat -a

显示它正在监听端口 8443(和 80,但在 443 上什么都没有)

有什么想法吗?

【问题讨论】:

  • 这绝对是主题,不,它不是太宽泛。请不要投票关闭。
  • this answer中给出了你的终极问题的解决方案。

标签: tomcat ubuntu ssl


【解决方案1】:

解决上述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

【讨论】:

    【解决方案2】:

    有数百个在 tomcat 上安装 SSL 的指南,但我找不到任何一个可以回答这些关键问题。

    你唯一需要的是Tomcat自带的那个。

    安装SSL有两种方式:一种是给我们keytool,另一种是简单的把cert文件放在FS上,把server.xml指向这些文件(不使用keytool)。

    不真实。在这两种情况下,您都必须生成密钥对和 CSR。 Tomcat 文档展示了如何使用 openssl 和 Java keytool. 来做到这一点。您不能从无处开始使用证书文件。

    使用更复杂的密钥工具是否有任何优势,而不是将证书放在 FS 上,例如在 /etc/ssl

    稻草人论据。恕我直言,keytool 比 openssl 复杂得多。

    如果使用 keytool,您必须提供“-keystore xxx.jks”。 xxx.jks 应该放在哪里,例如/root, /home/tomcat7, /etc /var/lib/tomcat7?

    任何你喜欢的地方。 Tomcat 提供了告诉Tomcat密钥库在哪里的方法。

    我只能找到一个说明如何设置密钥库的指南,它说将它放在 tomcat 目录中,这似乎很疯狂,因为当我们升级 tomcat 时,我们会丢失证书,但如果这是一个硬性要求,那么我们可以的。

    没有兴趣讨论一段未说明的任意互联网垃圾所说的内容。遵循 Tomcat 文档。

    如果使用keytool,导入cert、tomcat7还是root应该由哪个用户使用?

    只要用户对密钥库有写权限就没有关系。

    他们提供的示例展示了如何将证书导入用于生成原始 csr 的密钥库。我们没有使用它来生成 csr(我们是从第 3 方获得的证书)。

    在这种情况下,您甚至无法开始。您的第一步是生成密钥对。没有其他人可以为你做到这一点。该对的私有成员对您来说是私有的。如果其他人提供了它,它就不是私有的,因此它不可能实现它的预期目的。

    这是否意味着我们不能使用密钥库,还是需要先生成一个虚拟 csr?

    您需要生成一个 real 密钥对,一个 real CSR,对其进行签名,然后将其导入回密钥库,在所有三种情况下都使用相同的别名。

    我们不知道哪个 CA 用于颁发证书,因此无法在那里寻找答案。我们有 3 个文件:gd_bundle-g2-g1.crt、our.crt 和 our.key

    把它们都扔掉,重新开始。你一直遵循或给出的过程从头到尾都是完全无效和不安全的。如果你得到了一个 .key 文件,那么它完全没有价值,而且给你的人不知道他们在说什么,应该退出这个循环。被解雇了。

    【讨论】:

    • 我们的密钥不是一文不值 - 我们使用它们来配置 apache 和 node.js 没有问题。它只是我们正在努力的tomcat。在最坏的情况下,我们可以用 apache 终止 SSL,并将其放在 tomcat 前面,如果你说的是真的 - 密钥库无法处理来自不同工具生成的 CSR 的密钥。我们有许多系统需要安装的密钥,而不仅仅是 ubuntu。
    • 1.如果你的钥匙是别人给的,你的钥匙就一文不值,原因我已经说过了。如果你没有得到它们,你的大部分问题都是不可理解的:你会生成自己的 CSR,对其进行签名,并获得签名证书和信任链作为回报。 2. 我没有说 keytool 无法处理由不同工具生成的 CSR。不要把话放在我嘴里。
    • 我们的钥匙并非一文不值。它们是由我们的 IT 安全部门生成的,除了在 tomcat 中之外,它们在我们的企业中无处不在。我正在尝试安装的特定是针对我们的开发环境的,并且并非毫无价值-它们可以与 apache、node js 等一起正常工作。只有 tomcat 失败。我们不允许生成自己的证书,所以这是唯一的选择。
    • 我没有说它们不起作用。我说它们一文不值,我已经说明了原因。不止一方知道的私钥不是私有的。很明显。您的 IT 程序需要审查。
    【解决方案3】:

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

    首先,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 证书。)

    【讨论】:

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

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

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

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

      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
      

      【讨论】:

        【解决方案5】:

        您是否真的希望 Tomcat 自己处理 SSL,或者它是否位于要为其处理 SSL 的 Web 服务器后面?如果是后者,只需将 server.xml 中的 SSL 连接器注释掉即可。

        【讨论】:

          猜你喜欢
          • 2015-05-27
          • 2015-08-07
          • 2018-04-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多