我的目标是使用keytool创建证书签名请求(CSR),然后获取该CSR并将实际证书添加到密钥库,添加它,以便SSL(HTTPS // my.site.com)可以工作 . 这是出于测试目的 .
到目前为止,我已经完成了以下步骤:
- 为我的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 -storepass changeit
- 生成CSR:
keytool -certreq -alias tomcat -file request.csr -keystore test.keystore -storepass changeit
- 生成用于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
- 使用CSR生成我签名的证书:
openssl x509 -req -days 365 -in request.csr -signkey server.key -out server.crt
- 最后,将证书导入我的密钥库 .
keytool -import -trustcacerts -file server.crt -keystore test.keystore -alias tomcat -storepass changeit
结果是以下错误:
keytool error:java.lang.Exception:回复和密钥库中的公钥不匹配
3 回答
我不确定以下是否正确,但似乎有效 . 从各种网站拼凑一些步骤,执行这些命令生成一个密钥库,通过tomcat为SSL连接工作 . 它做了一些部分,让我测试我的系统的每一部分 .
这不仅仅生成一个密钥对,它还会生成一个带有此DN的自签名证书,然后将其用作生成带有
-certreq
的CSR的基础(它可能听起来很奇怪,但是自签名证书和PKCS# 10 CSR实际上非常相似:CSR或多或少是一个没有有效时间戳的自签名证书 .这是在documentation:
将CSR提交给CA时通常会将CA颁发的证书重新导入相同的别名(私钥所在的位置),从而覆盖该临时自签名证书 .
您可以跳过
keytool -certreq
和openssl
的步骤:只需使用keytool
导出证书,并在必要时将其重新导入单独的信任库以与Java客户端一起使用 .如果要模拟CA,
openssl x509
不是您应该使用的命令:正如documentation for openssl x509 -signkey所述:
因此,基本上,公钥材料也来自此私钥 . 因此,它与您提供的CSR中的公钥不匹配 . 在这种情况下,CSR仅用于提供证书身份信息和属性 .
实际上,将CSR转变为证书可以有许多参数 . 虽然
keytool
从您提供的参数生成合理的默认自签名证书,但OpenSSL通常需要更多配置 . 对于你想要做的事情,openssl ca肯定会更相关,虽然我建议使用CA.pl包装器以方便(它会跟踪你发出的证书,序列号等) .由于这似乎主要用于测试,可能偶尔进行测试,您可能还会发现其他工具如xca更方便执行该步骤 .
以下过程描述了创建与JBoss 5.0应用程序服务器完美配合的JKS密钥库 . Tomcat可能使用相同类型的密钥库 .
创建私钥和证书签名请求
您可以在openssl实用程序的帮助下在Linux OS中创建私钥 .
将umask设置为077,以便创建的文件只能由当前用户读取:
创建一个长度为2048位的私钥并将其存储在文件_1407510中:
恢复文件创建掩码:
您可以使用以下命令创建证书签名请求(CSR):
接下来,您将不得不回答各种问题 . 请特别注意必须与服务器的完全限定域名匹配的Common Name字段 . 该命令生成包含CSR的以下文本:
生成链证书
该过程假定您在文件
private_key.pem
中有(a)私钥,(b)您从文件certificate.pem
中的证书颁发机构(CA)收到的数字证书,以及(c)证明文件中的CA的链证书ca_chain_cert.pem
.如果您的CA通过最终由根CA CA_ROOT(CA - > CA1 - > CA_ROOT)认证的另一个机构CA1认证,并且各个文件分别在单个文件
ca_cert.pem
,ca1_cert.pem
和ca_root.pem
中可用,则可以创建ca_chain_cert.pem
通过命令:通过将
certificate.pem
与ca_chain_cert.pem
组合生成链证书:这个概念是您必须拥有一个包含订单所有证书的文件:
主机证书
CA证书
CA1证书
根CA证书
生成JKS密钥库
此步骤假定文件
chain.pem
包含证书链,private_key.pem
私钥和certificate.pem
您从CA(链的第一部分)收到的服务器证书 .使用以下命令从证书链和私钥创建文件
keystore.p12
中的PKCS12密钥库:记下导出密码,因为它将在以下所有步骤中用于访问密钥库 .
从PKCS12密钥库在文件
server.keystore
中创建JKS密钥库:您可以使用以下命令列出证书:
验证命令输出是否表明证书链的正确大小 . 对于CA,CA1和CA_ROOT,大小必须为4 .