【问题标题】:Using key tool to make a CSR, how do I make a cert for tomcat ssl?使用密钥工具制作 CSR,如何为 tomcat ssl 制作证书?
【发布时间】:2015-05-01 20:45:24
【问题描述】:

我的目标是使用 keytool 创建一个证书签名请求 (CSR),然后获取该 CSR 并制作一个实际证书以添加到密钥库中,添加它,这样 SSL (HTTPS//my.site.com)将工作。这是出于测试目的。

到目前为止,我已经完成了以下步骤:

  1. 为我的 CSR 生成密钥库:

    keytool -genkey -dname "CN=test.com, OU=TEST, O=Test, L=TestCity, ST=Florida, C=US" -alias tomcat -keyalg RSA -keysize 2048 -keystore test.keystore -商店通行证改变它

  2. 生成 CSR:

    keytool -certreq -alias tomcat -file request.csr -keystore test.keystore -storepass changeit

  3. 生成与 openSSL 一起使用的服务器密钥以创建签名证书。这需要密码“changeit”,然后进行转换以删除 server.key 的密码:

    openssl genrsa -des3 -out server.key 2048

    cp server.key server.key.org

    openssl rsa -in server.key.org -out server.key

  4. 使用 CSR 生成我的签名证书:

    openssl x509 -req -days 365 -in request.csr -signkey server.key -out server.crt

  5. 最后,将证书导入我的密钥库。

    keytool -import -trustcacerts -file server.crt -keystore test.keystore -alias tomcat -storepass changeit

结果如下错误:

keytool 错误:java.lang.Exception:回复中的公钥和密钥库不匹配

【问题讨论】:

    标签: tomcat ssl exception certificate keytool


    【解决方案1】:

    我不确定以下是否正确,但它似乎有效。将各个网站的一些步骤拼凑在一起,执行这些命令会生成一个密钥库,该密钥库适用于通过 tomcat 进行的 SSL 连接。它可以将各个部分分开,让我可以测试我的系统的每一部分。

    1. 生成密钥库

    keytool -genkey -dname "CN=test.com, OU=TEST, O=Test, L=TestCity, ST=Florida, C=US" -alias tomcat -keyalg RSA -keysize 2048 -keystore test.keystore -商店通行证改变它

    1. 生成 CSR

    keytool -certreq -alias tomcat -file request.csr -keystore test.keystore -storepass changeit

    1. 从我的密钥库中导出私钥以用于创建签名证书

    keytool -v -importkeystore -srckeystore test.keystore -srcalias tomcat -destkeystore myp12file.p12 -deststoretype PKCS12

    openssl pkcs12 -in myp12file.p12 -out server.key

    1. 从 CSR 创建签名证书

    openssl x509 -req -days 365 -in request.csr -signkey server.key -out server.crt

    1. 最后导入keystore,成功

    keytool -import -trustcacerts -file server.crt -keystore test.keystore -alias tomcat -storepass changeit

    【讨论】:

    • 我想这可能是一个适合测试的解决方法,但这肯定不会模拟您正在实施的过程:通过给您他们的 PKCS#12 文件,您的用户给您的远不止CSR,他们也给你他们的私钥。这是他们不应该做的事情。
    • Uses 不会给我他们的 PKCS#12 文件。这又是为了测试。真正的工作流程是他们将使用 Web 界面来获取可以下载的 CSR。他们会将它带到 CA,然后他们将通过 Web 界面向我们提供 CA 提供的证书,我将把它添加到密钥库中。不会发送任何私钥,也不会有人访问密钥库文件。我只需要一种方法来本地测试此代码,而无需从真正的 CA 获得真正的证书。
    • 当然,我明白了,只是这样的测试看起来不太现实,因为你的测试需要的比实际给你的要多。使用我之前在回答中添加的 CA 工具(例如 openssl caCA.pl、...),可能会为您尝试模拟的内容提供更真实的东西。
    • 感谢您的帮助。我会给你一个赞成票之类的,但似乎没有办法做到这一点。我会研究这些工具。
    • 除了教授不安全行为之外,这个复杂的过程还会产生一个自签名证书,就像keytool 在第一步中创建的那个一样。如果您想测试安装一个可以验证针对 CA(如真实证书)的证书,您需要创建 CA 颁发的证书的东西,@Bruno 建议 CA.pl 或 @ 987654325@ 是一个不错的选择,但不是唯一可能的选择。
    【解决方案2】:

    keytool -genkey -dname "CN=test.com, OU=TEST, O=Test, L=TestCity, ST=Florida, C=US" -alias tomcat

    这不仅仅是生成一个密钥对,它还使用这个 DN 生成一个自签名证书,然后将其用作生成具有 -certreq 的 CSR 的基础(听起来可能很奇怪,但自签名cert 和 PKCS#10 CSR 实际上非常相似:CSR 或多或少是一个没有有效性时间戳的自签名证书。

    这是在documentation:

    -genkeypair

    [...]

    生成一个密钥对(一个公钥和相关联的 私钥)。将公钥包装成 X.509 v3 自签名 证书,存储为单元素证书链。 此证书链和私钥存储在一个新的 由别名标识的密钥库条目。

    [...] 此命令在早期版本中被命名为 -genkey。

    在向 CA 提交 CSR 时,您通常会做的是将 CA 颁发的证书重新导入到同一个别名(您的私钥所在的位置),从而覆盖该临时自签名证书。

    您可以跳过使用keytool -certreqopenssl 的步骤:只需使用keytool 导出证书,并在必要时将其重新导入单独的信任库以供Java 客户端使用。


    如果你想模拟一个 CA,openssl x509 不是你应该使用的命令:

    openssl x509 -req -days 365 -in request.csr -signkey server.key -out server.crt

    正如documentation for openssl x509 -signkey 所说:

    -signkey filename

    此选项使输入文件使用提供的私钥进行自签名。

    如果输入文件是证书,它将颁发者名称设置为主题名称(即使其自签名)将公钥更改为 提供的值并更改开始和结束日期。开始日期是 设置为当前时间,结束日期设置为确定的值 通过 -days 选项。保留任何证书扩展,除非 提供了 -clrext 选项。

    如果输入是证书请求,则使用提供的私钥创建自签名证书,使用 请求中的主题名称。

    所以,本质上,公钥材料也来自这个私钥。因此,它将与您提供的 CSR 中的公钥不匹配。在这种情况下,CSR 仅用于提供证书的身份信息和属性。

    确实,将 CSR 转换为证书是可以包含许多参数的东西。虽然keytool 根据您提供的参数生成合理的默认自签名证书,但 OpenSSL 通常需要更多配置。对于您正在尝试做的事情,openssl ca 肯定会更相关,尽管为了方便起见我建议使用 CA.pl 包装器(它将跟踪您颁发的证书、序列号等) .

    由于这似乎主要用于测试,可能是偶尔进行,您还可以找到其他工具(如 xca)更方便地执行该步骤。

    【讨论】:

    • 我不想跳过这一步。这是一个关于它如何真正工作的模拟。我想开发一个自动化流程。最终用户将获得我们将生成的 CSR。然后他们会将其发送到真正的 CA 以获取要导入的签名证书。所以我想生成一个签名证书来模拟它。如果我只是跳过那部分,那么测试不再有效。我需要从 CSR 生成一个证书,然后我可以使用 keytool 导入/覆盖该证书,其操作方式与由真实 CA 创建时的操作方式相同。
    • 从您的操作来看,您似乎想使用 server.key 作为 CA 签名密钥,如果它是服务器密钥(我不确定你有一个证书)。
    • 我这样做是因为我在谷歌上搜索如何从 CSR 生成证书,这是我找到的唯一示例。如果您阅读第一段,那描述了我想要做的事情。获取一个 CSR,从中创建一个证书,然后将该证书应用到我的密钥库,这样 SSL 连接就可以工作了。我在谷歌上搜索时的主要问题是所有文章都是关于如何创建 CSR 而不是如何从 CSR 创建可用证书。我真的不知道服务器密钥的用途,除了 openssl 签名步骤所需的。
    • 我正在尝试编写一个可以通过 Web 界面工作的工具,允许客户创建 CSR,然后当他们从 CA 获得证书时,我可以将证书应用到盒子这样他们就可以使用品牌 URL。现在我需要真正能够测试这个系统,所以我需要从 CSR 创建一个蛇油证书,然后我可以输入我的系统,这样我就可以看到它是否一切正常。
    • 可以openssl x509 -req-CA-CAkey一起使用来指定CA密钥和证书——两者都是必需的;这没有openssl ca 的所有功能,但它完成了基本工作。此外,openssl ca 本身会跟踪连续剧和颁发的证书; CA.pl "merely" 填写了一些"标准" 标志和文件名,因此您不必考虑它们(但"merely" 可以节省时间并避免错误)。
    【解决方案3】:

    以下过程描述了创建与 JBoss 5.0 应用服务器完美配合的 JKS 密钥库。 Tomcat 可能使用相同类型的密钥库。

    创建私钥和证书签名请求

    您可以借助 openssl 实用程序在 Linux 操作系统中创建私钥。

    设置umask为077,这样创建的文件就只能被当前用户读取:

    $ OLD_UMASK=`umask`   (umask is inside backtick characters)
    $ umask 077
    

    创建一个 2048 位长度的私钥并将其存储在文件 private_key.pem 中:

    $ openssl genrsa 2048 > private_key.pem
    

    恢复文件创建掩码:

    $ umask $OLD_MASK
    

    您可以使用以下命令创建证书签名请求 (CSR):

    $ openssl req -new -key private_key.pem -nodes
    

    接下来,您将不得不回答各种问题。请特别注意 Common Name 字段,该字段必须与您的服务器的 Fully Qualified Domain Name 匹配。该命令生成以下包含 CSR 的文本:

    -----开始证书请求--

    MIIBZYnPGQZK06tI6EKLGp7qmaFAIAe ...

    ....

    -----结束证书请求-----

    生成链证书

    该过程假定您拥有 (a) 文件 private_key.pem 中的私钥,(b) 您从文件 certificate.pem 中的证书颁发机构 (CA) 收到的数字证书和 (c) 链证书证明文件ca_chain_cert.pem中的CA。

    如果您的 CA 由另一个权威 CA1 认证,该权威 CA1 最终由根 CA CA_ROOT (CA -> CA1 -> CA_ROOT) 认证,并且各自的证书在单独的文件中可用 ca_cert.pemca1_cert.pem 和 @分别为987654331@,可以通过命令创建ca_chain_cert.pem

    $ cat ca_cert.pem ca1_cert.pem ca_root.pem > ca_chain_cert.pem
    

    certificate.pemca_chain_cert.pem结合生成链证书:

    $ cat certificate.pem ca_chain_cert.pem > chain.pem
    

    这个概念是你必须有一个包含订单所有证书的文件:

    1. 主机证书
    2. CA 证书
    3. CA1 证书
    4. 根 CA 证书

    生成 JKS 密钥库

    此步骤假定文件 chain.pem 包含证书链、private_key.pem 私钥和 certificate.pem 您从 CA 收到的服务器证书(链的第一部分)。

    使用以下命令从证书链和私钥在文件 keystore.p12 中创建 PKCS12 密钥库:

    $ openssl pkcs12 -export -name server_cert -in chain.pem -inkey private_key.pem -certfile certificate.pem -out keystore.p12

    记下导出密码,因为它将在以下所有步骤中用于访问密钥库。

    从 PKCS12 密钥库在文件 server.keystore 中创建 JKS 密钥库:

    $ keytool -importkeystore -destkeystore server.keystore -srckeystore keystore.p12 -srcstoretype pkcs12 -alias server_cert

    您可以使用以下命令列出证书:

    $ keytool -list -v -keystore server.keystore

    验证命令输出说明证书链的正确大小。对于 CA、CA1 和 CA_ROOT,大小必须为 4。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-09-13
      • 1970-01-01
      • 2014-08-19
      • 2014-07-09
      • 2011-10-17
      • 1970-01-01
      • 2016-07-10
      相关资源
      最近更新 更多