keytool证书导入

admin
2022-02-27 / 1 评论 / 669 阅读 / 正在检测是否收录...
温馨提示:
本文最后更新于2023年09月07日,已超过441天没有更新,若内容或图片失效,请留言反馈。

最近项目对接时,中间B2B服务切换了域名,导致现有项目调用接口地址需要进行切换为https,同时需要安装SSL证书,这里记录一下JAVA工具keytool导入证书的过程。

一、问题点

切换域名后加上https,未导入证书报错:

[ERROR] - [2022-02-25 08:49:40.861] - [http-nio-9999-exec-1] - [DealParamAction.java:needConfirmAction:133] - no confirm method, call actual method = getNSDDtailByInterface
[INFO ] - [2022-02-25 08:50:04.483] - [http-nio-9999-exec-1] - [HttpMethodDirector.java:executeWithRetry:439] - I/O exception (java.net.ConnectException) caught when processing request: Connection timed out: connect
[INFO ] - [2022-02-25 08:50:04.484] - [http-nio-9999-exec-1] - [HttpMethodDirector.java:executeWithRetry:445] - Retrying request
[INFO ] - [2022-02-25 08:50:25.487] - [http-nio-9999-exec-1] - [HttpMethodDirector.java:executeWithRetry:439] - I/O exception (java.net.ConnectException) caught when processing request: Connection timed out: connect
[INFO ] - [2022-02-25 08:50:25.489] - [http-nio-9999-exec-1] - [HttpMethodDirector.java:executeWithRetry:445] - Retrying request
[INFO ] - [2022-02-25 08:50:46.493] - [http-nio-9999-exec-1] - [HttpMethodDirector.java:executeWithRetry:439] - I/O exception (java.net.ConnectException) caught when processing request: Connection timed out: connect
[INFO ] - [2022-02-25 08:50:46.495] - [http-nio-9999-exec-1] - [HttpMethodDirector.java:executeWithRetry:445] - Retrying request
[ERROR] - [2022-02-25 08:51:07.510] - [http-nio-9999-exec-1] - [IdeasSenderMessageClientService.java:sendMessage:540] - Connection timed out: connect
java.net.ConnectException: Connection timed out: connect
    at java.base/java.net.PlainSocketImpl.connect0(Native Method)
    at java.base/java.net.PlainSocketImpl.socketConnect(PlainSocketImpl.java:101)
    at java.base/java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:399)
    at java.base/java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:242)
    at java.base/java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:224)
    at java.base/java.net.SocksSocketImpl.connect(SocksSocketImpl.java:403)
    at java.base/java.net.Socket.connect(Socket.java:591)
    at java.base/sun.security.ssl.SSLSocketImpl.connect(SSLSocketImpl.java:285)
    at java.base/sun.security.ssl.SSLSocketImpl.<init>(SSLSocketImpl.java:190)
    at java.base/sun.security.ssl.SSLSocketFactoryImpl.createSocket(SSLSocketFactoryImpl.java:153)
    at org.apache.commons.httpclient.protocol.SSLProtocolSocketFactory.createSocket(SSLProtocolSocketFactory.java:82)
    at org.apache.commons.httpclient.protocol.SSLProtocolSocketFactory.createSocket(SSLProtocolSocketFactory.java:127)
    at org.apache.commons.httpclient.HttpConnection.open(HttpConnection.java:707)
    at org.apache.commons.httpclient.HttpMethodDirector.executeWithRetry(HttpMethodDirector.java:387)
    at org.apache.commons.httpclient.HttpMethodDirector.executeMethod(HttpMethodDirector.java:171)
    at org.apache.commons.httpclient.HttpClient.executeMethod(HttpClient.java:397)
    at org.apache.commons.httpclient.HttpClient.executeMethod(HttpClient.java:323)
    at com.vtradex.otwb.edi.server.service.send.pojo.IdeasSenderMessageClientService.sendMessage(IdeasSenderMessageClientService.java:532)
    at com.vtradex.otwb.edi.server.service.send.pojo.IdeasSenderMessageClientService.sendSynchronizInterfaceMessageHeadModel(IdeasSenderMessageClientService.java:634)

二、解决思路

1、查看报错日志。

2、进入报错类HttpMethodDirector.java,方法executeWithRetry,可以查看到是因为授权权限问题。

三、解决方案

JDK自带工具keytool导入证书即可。由于keytool不支持直接导入p7b格式证书,因此需要进行转换一下,如下:

1、p7b格式证书转cer格式证书:
本地安装证书,打开选中证书,右键导出证书,选中cer格式,重命名保存为cer格式。

2、准备工作:
将cer格式证书放导D:\jdk11\lib\security文件夹下。

3、jdk导入cer格式证书:
进入jdk安装目录的D:\jdk11\lib\security文件夹下,执行如下命令:

keytool -import -alias editest01 -file editest01.yanxiglobal.com.cer -keystore cacerts -trustcacerts

说明:
editest01:证书别名
editest01.yanxiglobal.com.cer:需要导入的cer格式证书

导入过程:
3.1、提示输入密码,密码一般默认第一个先测试:changeit 第二个测试密码:changeme
3.2、提示确认是否信任证书,直接输入Y回车确认即可。

4、验证是否导入成功:查看是否成功,如果显示你导入的密码就说明成功了

keytool -list -keystore cacerts -alias editest01

说明:
editest01:刚才导入的证书别名
说明:
java秘钥口令默认为 changeit,不需要重新设置秘钥口令;

5、如果提示已存在,则先将证书删除,之后再重新导入即可;

keytool -delete -alias editest01 -keystore cacerts 

说明:
editest01:刚才导入的证书别名

6、查看证书列表:

keytool -list -keystore cacerts 

说明:
java秘钥口令默认为 changeit,不需要重新设置秘钥口令;

7、keytool工具更多参数说明:
参考:(不同版本有差异,详细可参见的官方文档

  • --genkey:在用户主目录中创建一个默认文件”.keystore”,还会产生一个mykey的别名,mykey中包含用户的公钥、私钥和证书(在没有指定生成位置的情况下,keystore会存在用户系统默认目录)
  • --alias: 产生别名 每个keystore都关联这一个独一无二的alias,这个alias通常不区分大小写
  • --keystore: 指定密钥库的名称(产生的各类信息将不在.keystore文件中)
  • --keyalg: 指定密钥的算法 (如 RSA DSA,默认值为:DSA)
  • --validity: 指定创建的证书有效期多少天(默认 90)
  • --keysize: 指定密钥长度 (默认 1024)
  • --storepass: 指定密钥库的密码(获取keystore信息所需的密码)
  • --keypass: 指定别名条目的密码(私钥的密码)
  • --dname: 指定证书发行者信息 其中: “CN=名字与姓氏,OU=组织单位名称,O=组织名称,L=城市或区域名 称,ST=州或省份名称,C=单位的两字母国家代码”
  • --list: 显示密钥库中的证书信息 keytool -list -v -keystore 指定keystore -storepass 密码
  • --v: 显示密钥库中的证书详细信息
  • --export: 将别名指定的证书导出到文件 keytool -export -alias 需要导出的别名 -keystore 指定keystore -file 指定导出的证书位置及证书名称 -storepass 密码
  • --file: 参数指定导出到文件的文件名
  • --delete: 删除密钥库中某条目 keytool -delete -alias 指定需删除的别 -keystore 指定keystore – storepass 密码
  • --printcert: 查看导出的证书信息 keytool -printcert -file g:\sso\michael.crt
  • --keypasswd: 修改密钥库中指定条目口令 keytool -keypasswd -alias 需修改的别名 -keypass 旧密码 -new 新密码 -storepass keystore密码 -keystore sage
  • --storepasswd: 修改keystore口令 keytool -storepasswd -keystore g:\sso\michael.keystore(需修改口令的keystore) -storepass pwdold(原始密码) -new pwdnew(新密码)
  • --import: 将已签名数字证书导入密钥库 keytool -import -alias 指定导入条目的别名 -keystore 指定keystore -file 需导入的证书
12

评论 (1)

取消
  1. 头像
    晒太阳
    Windows 10 · Google Chrome

    不错,快速解决。表情

    回复