热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

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

开发时我们常常使用JDK自带的keytool工具来创建自签发的证书,并保存到密钥库文件中。如果要把一个密钥库导入到另一个密钥库(比如到另一台机器上安装&

开发时我们常常使用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&#61;"8443" protocol&#61;"org.apache.coyote.http11.Http11Protocol" SSLEnabled&#61;"true"maxThreads&#61;"150" scheme&#61;"https" secure&#61;"true"clientAuth&#61;"false" sslProtocol&#61;"TLS"keystoreFile&#61;"aaa.jks"keystorePass&#61;"changeit" />

请把上面的aaa.jks输入为实际的全路径名&#xff08;比如d:\aaa.jks&#xff09;。完成后启动Tomcat&#xff0c;此时Tomcat应能够成功启动。

确认成功后请关闭Tomcat&#xff0c;接下来我们把上面的aaa.jks换为bbb.jks&#xff0c;保存后重新启动Tomcat。Tomcat将报异常&#xff1a;

严重: 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 failedat 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 entryat 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启动不了呢&#xff1f;为此我们分别检查一下aaa.jks和bbb.jks里的内容。

下面是aaa.jks里的内容&#xff1a;

keytool -keystore aaa.jks -list -alias tomcat
输入keystore密码&#xff1a;
tomcat
, 2012-12-2, PrivateKeyEntry,
认证指纹
(MD5)&#xff1a; 20:E1:74:4B:0B:35:33:FF:BE:2D:9D:B5:31:AB:3B:DE

 下面是bbb.jks里的内容&#xff1a;

keytool -keystore bbb.jks -list -alias tomcat
输入keystore密码&#xff1a;
tomcat
, 2012-12-2, trustedCertEntry,
认证指纹
(MD5)&#xff1a; 20:E1:74:4B:0B:35:33:FF:BE:2D:9D:B5:31:AB:3B:DE

从上面两个输出中可见其差别&#xff0c;一个是PrivateKeyEntry&#xff0c;另一个是trustedCertEntry。

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

 

那么我们该如何正确操作呢&#xff1f;方法有很多&#xff0c;最常用的方法是不用keytool来生成证书和私钥&#xff0c;而改用openssl工具。不过本文的目的是只用keytool来操作。

其实操作很简单&#xff1a;

keytool -importkeystore -deststorepass changeit -destkeypass changeit -destkeystore bbb.jks -deststoretype jks -srckeystore aaa.jks -srcstoretype jks -srcstorepass changeit -alias tomcat

这个bbb.jks就包含了别名为tomcat的私钥和证书了。如果不放心可再用启动Tomcat的方法去验证一下。

最后要说明的是&#xff0c;如果在keytool中不指定storetype、srcstoretype、deststoretype参数则也默认为jks。

转:https://www.cnblogs.com/yang-wu/archive/2012/12/02/2798212.html



推荐阅读
  • 为了确保iOS应用能够安全地访问网站数据,本文介绍了如何在Nginx服务器上轻松配置CertBot以实现SSL证书的自动化管理。通过这一过程,可以确保应用始终使用HTTPS协议,从而提升数据传输的安全性和可靠性。文章详细阐述了配置步骤和常见问题的解决方法,帮助读者快速上手并成功部署SSL证书。 ... [详细]
  • 本文详细介绍了在Linux系统上编译安装MySQL 5.5源码的步骤。首先,通过Yum安装必要的依赖软件包,如GCC、GCC-C++等,确保编译环境的完备。接着,下载并解压MySQL 5.5的源码包,配置编译选项,进行编译和安装。最后,完成安装后,进行基本的配置和启动测试,确保MySQL服务正常运行。 ... [详细]
  • 本文探讨了 Kafka 集群的高效部署与优化策略。首先介绍了 Kafka 的下载与安装步骤,包括从官方网站获取最新版本的压缩包并进行解压。随后详细讨论了集群配置的最佳实践,涵盖节点选择、网络优化和性能调优等方面,旨在提升系统的稳定性和处理能力。此外,还提供了常见的故障排查方法和监控方案,帮助运维人员更好地管理和维护 Kafka 集群。 ... [详细]
  • SecureCRT是一款功能强大的终端仿真软件,支持SSH1和SSH2协议,适用于在Windows环境下高效连接和管理Linux服务器。该工具不仅提供了稳定的连接性能,还具备丰富的配置选项,能够满足不同用户的需求。通过SecureCRT,用户可以轻松实现对远程Linux系统的安全访问和操作。 ... [详细]
  • 服务器部署中的安全策略实践与优化
    服务器部署中的安全策略实践与优化 ... [详细]
  • 在配置Nginx的SSL证书后,虽然HTTPS访问能够正常工作,但HTTP请求却会遇到400错误。本文详细解析了这一问题,并提供了Nginx配置的具体示例。此外,还深入探讨了DNS服务器证书、SSL证书的申请与安装流程,以及域名注册、查询方法和CDN加速技术的应用,帮助读者全面了解相关技术细节。 ... [详细]
  • 本文详细解析了 Android 系统启动过程中的核心文件 `init.c`,探讨了其在系统初始化阶段的关键作用。通过对 `init.c` 的源代码进行深入分析,揭示了其如何管理进程、解析配置文件以及执行系统启动脚本。此外,文章还介绍了 `init` 进程的生命周期及其与内核的交互方式,为开发者提供了深入了解 Android 启动机制的宝贵资料。 ... [详细]
  • Keepalived 提供了多种强大且灵活的后端健康检查机制,包括 HTTP_GET、SSL_GET、TCP_CHECK、SMTP_CHECK 和 MISC_CHECK 等多种检测方法。这些健康检查功能确保了高可用性环境中的服务稳定性和可靠性。通过合理配置这些检查方式,可以有效监测后端服务器的状态,及时发现并处理故障,从而提高系统的整体性能和可用性。 ... [详细]
  • Web开发框架概览:Java与JavaScript技术及框架综述
    Web开发涉及服务器端和客户端的协同工作。在服务器端,Java是一种优秀的编程语言,适用于构建各种功能模块,如通过Servlet实现特定服务。客户端则主要依赖HTML进行内容展示,同时借助JavaScript增强交互性和动态效果。此外,现代Web开发还广泛使用各种框架和库,如Spring Boot、React和Vue.js,以提高开发效率和应用性能。 ... [详细]
  • 本文详细介绍了批处理技术的基本概念及其在实际应用中的重要性。首先,对简单的批处理内部命令进行了概述,重点讲解了Echo命令的功能,包括如何打开或关闭回显功能以及显示消息。如果没有指定任何参数,Echo命令会显示当前的回显设置。此外,文章还探讨了批处理技术在自动化任务执行、系统管理等领域的广泛应用,为读者提供了丰富的实践案例和技术指导。 ... [详细]
  • Amoeba 通过优化 MySQL 的读写分离功能显著提升了数据库性能。作为一款基于 MySQL 协议的代理工具,Amoeba 能够高效地处理应用程序的请求,并根据预设的规则将 SQL 请求智能地分配到不同的数据库实例,从而实现负载均衡和高可用性。该方案不仅提高了系统的并发处理能力,还有效减少了主数据库的负担,确保了数据的一致性和可靠性。 ... [详细]
  • 如何在任意浏览器中轻松安装并使用VSCode——Codeserver简易指南
    code-server 是一款强大的工具,允许用户在任何服务器上部署 VSCode,并通过浏览器进行访问和使用。这一解决方案不仅简化了开发环境的搭建过程,还提供了高度灵活的工作方式。用户只需访问 GitHub 上的官方仓库(GitHub-coder/code-server),即可获取详细的安装和配置指南,快速启动并运行 code-server。无论是个人开发者还是团队协作,code-server 都能提供高效、便捷的代码编辑体验。 ... [详细]
  • 本文介绍了如何在 Windows 系统上利用 Docker 构建一个包含 NGINX、PHP、MySQL、Redis 和 Elasticsearch 的集成开发环境。通过详细的步骤说明,帮助开发者快速搭建和配置这一复杂的技术栈,提升开发效率和环境一致性。 ... [详细]
  • 在JavaWeb项目架构中,NFS(网络文件系统)的实现与优化是关键环节。NFS允许不同主机系统通过局域网共享文件和目录,提高资源利用率和数据访问效率。本文详细探讨了NFS在JavaWeb项目中的应用,包括配置、性能优化及常见问题的解决方案,旨在为开发者提供实用的技术参考。 ... [详细]
  • 本文详细介绍了如何在Java Web服务器上部署音视频服务,并提供了完整的验证流程。以AnyChat为例,这是一款跨平台的音视频解决方案,广泛应用于需要实时音视频交互的项目中。通过具体的部署步骤和测试方法,确保了音视频服务的稳定性和可靠性。 ... [详细]
author-avatar
刘刘敬
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有