问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

如何用keytool工具导入私有密钥和自签发证书

发布网友 发布时间:2022-04-13 00:04

我来回答

1个回答

热心网友 时间:2022-04-13 01:33

开发时我们常常使用JDK自带的keytool工具来创建自签发的证书,并保存到密钥库文件中。如果要把一个密钥库导入到另一个密钥库(比如到另一台机器上安装,同时又不想用覆盖文件的方式),那该怎么操作呢?
比如,我们从aaa.jks里把别名为tomcat的内容导入到bbb.jks里。一个错觉是先从aaa.jks导出证书、再导入到bbb.jks里。
为说明错误情况,我们从头做起。先生成别名为tomcat的证书,并保存到aaa.jks里:
keytool -keystore aaa.jks -genkey -keyalg RSA -alias tomcat

然后把证书导出到tomcat.cert文件:
keytool -keystore aaa.jks -export -file tomcat.cert -alias tomcat

接着把tomcat.cert导入到bbb.jks里:
keytool -keystore bbb.jks -import -file tomcat.cert -alias tomcat

为验证这种做法的错误性,我们可分别用aaa.jks和bbb.jks来启动Tomcat服务器,看看能不能启动成功。由于我们仅仅是出于验证的目的,因此无需在Tomcat的webapps目录里放进应用的war包文件。
先用aaa.jks来启动Tomcat。修改Tomcat的conf\server.xml文件为:
<Connector port="8443" protocol="org.apache.coyote.http11.Http11Protocol" SSLEnabled="true"
maxThreads="150" scheme="https" secure="true"
clientAuth="false" sslProtocol="TLS"
keystoreFile="aaa.jks"
keystorePass="changeit" />

请把上面的aaa.jks输入为实际的全路径名(比如d:\aaa.jks)。完成后启动Tomcat,此时Tomcat应能够成功启动。
确认成功后请关闭Tomcat,接下来我们把上面的aaa.jks换为bbb.jks,保存后重新启动Tomcat。Tomcat将报异常:

严重: Failed to initialize connector [Connector[HTTP/1.1-8443]]
org.apache.catalina.LifecycleException: Failed to initialize component [Connector[HTTP/1.1-8443]]
at org.apache.catalina.util.LifecycleBase.init(LifecycleBase.java:106)
at org.apache.catalina.core.StandardService.initInternal(StandardService.java:559)
at org.apache.catalina.util.LifecycleBase.init(LifecycleBase.java:102)
at org.apache.catalina.core.StandardServer.initInternal(StandardServer.java:814)
at org.apache.catalina.util.LifecycleBase.init(LifecycleBase.java:102)
at org.apache.catalina.startup.Catalina.load(Catalina.java:633)
at org.apache.catalina.startup.Catalina.load(Catalina.java:658)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.apache.catalina.startup.Bootstrap.load(Bootstrap.java:281)
at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:450)
Caused by: org.apache.catalina.LifecycleException: Protocol handler initialization failed
at org.apache.catalina.connector.Connector.initInternal(Connector.java:983)
at org.apache.catalina.util.LifecycleBase.init(LifecycleBase.java:102)
... 12 more
Caused by: java.io.IOException: Alias name tomcat does not identify a key entry
at org.apache.tomcat.util.net.jsse.JSSESocketFactory.getKeyManagers(JSSESocketFactory.java:567)
at org.apache.tomcat.util.net.jsse.JSSESocketFactory.getKeyManagers(JSSESocketFactory.java:505)
at org.apache.tomcat.util.net.jsse.JSSESocketFactory.init(JSSESocketFactory.java:449)
at org.apache.tomcat.util.net.jsse.JSSESocketFactory.createSocket(JSSESocketFactory.java:158)
at org.apache.tomcat.util.net.JIoEndpoint.bind(JIoEndpoint.java:393)
at org.apache.tomcat.util.net.AbstractEndpoint.init(AbstractEndpoint.java:610)
at org.apache.coyote.AbstractProtocol.init(AbstractProtocol.java:429)
at org.apache.coyote.http11.AbstractHttp11JsseProtocol.init(AbstractHttp11JsseProtocol.java:119)
at org.apache.catalina.connector.Connector.initInternal(Connector.java:981)
... 13 more

为什么用bbb.jks启动不了呢?为此我们分别检查一下aaa.jks和bbb.jks里的内容。
下面是aaa.jks里的内容:
keytool -keystore aaa.jks -list -alias tomcat
输入keystore密码:
tomcat, 2012-12-2, PrivateKeyEntry,
认证指纹 (MD5): 20:E1:74:4B:0B:35:33:FF:BE:2D:9D:B5:31:AB:3B:DE

下面是bbb.jks里的内容:
keytool -keystore bbb.jks -list -alias tomcat
输入keystore密码:
tomcat, 2012-12-2, trustedCertEntry,
认证指纹 (MD5): 20:E1:74:4B:0B:35:33:FF:BE:2D:9D:B5:31:AB:3B:DE

从上面两个输出中可见其差别,一个是PrivateKeyEntry,另一个是trustedCertEntry。
其实,密钥库里保存了两类信息,一类是私钥,另一类是证书。证书里只有公钥。上面导出的tomcat.cert文件为证书文件,里面没有私钥。因此当我们再导入到bbb.jks时,导进去的只有证书、没有对应的私钥。而服务器需要用私钥与客户端的公钥通讯,因此Tomcat报了上面的异常。

那么我们该如何正确操作呢?方法有很多,最常用的方法是不用keytool来生成证书和私钥,而改用openssl工具。不过本文的目的是只用keytool来操作。
其实操作很简单:
keytool -importkeystore -deststorepass changeit -destkeypass changeit -destkeystore bbb.jks -deststoretype jks -srckeystore aaa.jks -srcstoretype jks -srcstorepass changeit -alias tomcat

这个bbb.jks就包含了别名为tomcat的私钥和证书了。如果不放心可再用启动Tomcat的方法去验证一下。
最后要说明的是,如果在keytool中不指定storetype、srcstoretype、deststoretype参数则也默认为jks。
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
我网贷一万,手续费300,分24期,每期506.67,请问怎么计算月息,和年利率... 多普达手机铃音多普达手机铃声 【车载软件推荐】有车一族必备软件有哪些?好用的车主必备app 我画画时常被说我画画不动脑筋,弱弱的问一句,画画怎样动脑筋? 三星手机如何设置时间在桌面显示? 精确到十分位,要看小数点右边第一位 对吗 要把一个小数精确到十分位,就要看这个小数的( )A.十分位B.百分位C... 黑米算不算粗粮 存定期协议利率选是还是否? 同城上那些卖二手ndsi的是真的吗? 阿里云linux服务器 ,phpstudy 重启apache 提示command not found linux 下zabbix 安装 php.ini 里也设置了,结果重启还是没有变化,如下... 我的世界阿神的有没有 为什么我的支付宝可以花呗扫码付款,别让却用不了花呗给我付款? 江西赣州详细资料? 四川巴中到江西余江距离 北京中旭天下投资有限公司怎么样? 北京鹰瑞科技有限公司怎么样? 北京赛福凯瑞医学研究院有限公司怎么样? 中建·玲珑山怎么样?好不好?值不值得买? 北京鹰瑞饭店怎么样? 泰剧系列剧有哪些? bkpp演过的泰剧有哪些? 如何导入.cer证书到Java keystore 虎皮兰开花有毒吗 jdk生成的证书导入成功 怎么测试是是否成功 为什么用pr做的视频会有爱奇艺图标? 玉子豆腐肉末的做法,玉子豆腐肉末怎么做好吃 整理桌面软件有什么比较好用的吗? 好用的桌面整理软件是什么? 如何把链接做成表格 微信处理违章给违章交罚款?请问关注什么软件? 哪个手机银行能交罚款 java keytool支持的类型及如何将证书导入jks中 山东违章缴费银联在线缴费支付失败怎么办? 山东枣庄违章处理休班吗 车辆违章查询用哪个App 脱脂奶粉应该怎么选?纽瑞滋是不是比较好?? 三力平衡汇交定理的内容 证明三力平衡汇交定理 出国留学找中介,考研留学中介选择如何看 什么是三力平衡汇交定理? 三力平衡汇交定理是什么 选哪个? 共面三力平衡必须汇交于一点吗?? 关于材料力学中三力平衡条件 为什么二力杆受力图不用画重力?还有不明白什么是三力平衡汇交定理?????麻烦都说详细点 三力汇交定理 八天没联系我的情人今天微信和我发个表情就没影了,啥意思 假如苏梅克——利维9号彗星真的撞到地球,将会发生什么 网络营销的4c策略是以利维为首?