我的目标是使用keytool创建一个证书签名请求( CSR ),然后使用这个CSR并制作一个实际的证书添加到keystore中,添加它,这样SSL (HTTPS/my.site.com)就可以工作了。这是为了测试目的。
到目前为止,我已经完成了以下步骤:
结果是以下错误:
密钥工具错误: java.lang.Exception:答复中的公钥和密钥存储不匹配
发布于 2015-05-02 01:27:21
keytool -genkey -dname "CN=test.com, OU=TEST, O=Test, L=TestCity, ST=Florida, C=US" -alias tomcat
这不仅仅是生成一个密钥对,它还生成一个带有此DN的自签名证书,然后用作使用-certreq生成一个CSR的基础(这听起来可能有些奇怪,但自签名证书和PKCS#10 CSR实际上非常相似: CSR或多或少是一个没有有效性时间戳的自签名证书)。
这是在文档中
-genkeypair..。 生成密钥对(公钥和关联私钥)。将公钥封装到X.509 v3自签名证书中,该证书存储为单个元素证书链。此证书链和私钥存储在由别名标识的新密钥库条目中。 ..。该命令在早期版本中被命名为-genkey。
当将CSR提交给CA时,通常要做的是将CA颁发的证书重新导入到相同的别名(其中有私钥),从而覆盖临时的自签名证书。
您可以跳过keytool -certreq和openssl的步骤:只需使用keytool导出证书,并在必要时将其重新导入一个单独的信任库,以便与您的keytool客户端一起使用。
如果要模拟CA,则不应该使用openssl x509命令:
openssl x509 -req -days 365 -in request.csr -signkey server.key -out server.crt
-signkey filename此选项将导致使用提供的私钥对输入文件进行自签名。 如果输入文件是证书,则它将颁发者名称设置为主题名称(即使其自签名),将公钥更改为提供的值,并更改开始日期和结束日期。开始日期设置为当前时间,结束日期设置为由-days选项确定的值。除非提供了-clrext选项,否则任何证书扩展都将保留。 如果输入是证书请求,则使用请求中的主题名称使用提供的私钥创建自签名证书。
所以,从本质上讲,公钥材料也来自于这个私钥。因此,它将与您提供的CSR中的公钥不匹配。在这种情况下,CSR只用于提供证书、标识信息和属性。
实际上,将CSR转换为证书是一件可以有许多参数的事情。当keytool从您提供的参数生成合理的默认自签名证书时,OpenSSL通常需要更多的配置。对于您想要做的事情,openssl ca当然更有意义,尽管我建议使用CA.pl包装器以方便(它将跟踪您签发的证书、序列号等等)。
由于这似乎主要用于测试,可能只是偶尔进行,您可能还会发现其他工具(如xca )更便于执行这一步骤。
发布于 2015-05-04 14:04:05
我不确定下面这句话是否正确,但它似乎奏效了。从各种网站中拼凑出一些步骤,执行这些命令就会生成一个keystore,它可以通过tomcat为SSL连接工作。它会将部件分解,让我测试系统的每一个部分。
关键工具-genkey -dname "CN=test.com,OU=TEST,O=Test,L=TestCity,ST=Florida,C=US“-alias tomcat -keyalg -keysize 2048 -keystore test.keystore -storepass changeit
键盘工具-certreq -alias tomcat -file request.csr -keystore test.keystore -storepass转换
键盘工具-v -importkeystore -srckeystore test.keystore -srcalias tomcat -destkeystore myp12file.p12 -deststoretype PKCS12 openssl pkcs12 -in myp12file.p12 -out server.key
openssl x509 -req -days 365 -in request.csr -signkey server.key -out server.crt
键盘工具-import -trustcacerts -file server.crt -keystore test.keystore -alias tomcat -storepass转换
发布于 2015-05-27 08:47:30
下面的过程描述了JKS的创建,它与JBoss 5.0应用服务器完美地工作。Tomcat可能使用相同类型的keystore。
创建私钥和证书签名请求
您可以使用openssl实用程序在Linux操作系统中创建私钥。
将umask设置为077,以便创建的文件只能由当前用户读取:
$ OLD_UMASK=
umask(umask在反勾字符中)$ umask 077
创建一个长度为2048位的私钥并将其存储在文件private_key.pem中
$ openssl genrsa 2048 > private_key.pem
还原文件创建掩码:
$ umask $OLD_MASK
可以使用以下命令创建证书签名请求(CSR):
$ openssl req -new -key private_key.pem -nodes
接下来,你必须回答各种问题。请特别注意“公共名称”字段,该字段必须与服务器的完全限定域名匹配。该命令生成包含CSR的以下文本:
-开始申请证书 MIIBZYnPGQZK06tI6EKLGp7qmaFAIAe ... ……
生成链证书
该过程假设文件private_key.pem中有(a)私钥,(b)从文件certificate.pem中的证书颁发机构( CA )接收的数字证书,以及(c)在ca_chain_cert.pem文件中验证CA的链证书。
如果您的CA由另一个权威机构(最终由根CA CA1 (CA -> CA1 -> CA_ROOT)认证)认证,并且各自的证书分别在单独的文件ca_cert.pem、ca1_cert.pem和ca_root.pem中可用,则可以通过命令创建ca_chain_cert.pem:
$ cat ca_cert.pem ca1_cert.pem ca_root.pem > ca_chain_cert.pem
链证书是通过将certificate.pem与ca_chain_cert.pem相结合生成的。
$ cat certificate.pem ca_chain_cert.pem > chain.pem
其概念是,您必须有一个包含所有证书的文件,该文件具有以下顺序:
生成JKS密钥存储库
此步骤假设文件chain.pem包括证书链、私钥private_key.pem和从CA (链的第一部分)接收的服务器证书certificate.pem。
使用以下命令在证书链和私钥文件中创建PKCS12密钥存储库:
$ openssl pkcs12 -export -name server_cert -in chain.pem -inkey private_key.pem -certfile certificate.pem -out keystore.p12
写下导出密码,因为它将在以下所有步骤中使用,以访问密钥存储库。
在server.keystore文件中从PKCS12密钥库中创建一个JKS:
关键工具-importkeystore -destkeystore server.keystore -srckeystore keystore.p12 -srcstoretype pkcs12 -alias server_cert
可以使用以下命令列出证书:
$ keytool -list -v -keystore server.keystore
验证命令输出是否说明证书链的正确大小。对于CA、CA1和CA_ROOT,大小必须为4。
https://stackoverflow.com/questions/29994878
复制相似问题