最近项目对接时,中间B2BService切换了Domain,导致现有项目调用Interface地址需要进行切换为https,同时需要InstallationSSLCertificate,这里记录一下JAVAToolskeytoolImport Certificate的过程。
一、问题点
切换Domain后加上https,未Import CertificateError:
[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、ViewErrorLogging。
2、进入Error类HttpMethodDirector.java,MethodexecuteWithRetry,可以View到是因为授权PermissionsProblem。
三、解决方案
JDK自带ToolskeytoolImport Certificate即可。由于keytool不支持直接导入p7b格式Certificate,因此需要进行转换一下,如下:
1、p7b格式Certificate转cer格式Certificate: 本地InstallationCertificate,打开选中Certificate,右键导出Certificate,选中cer格式,重命名保存为cer格式。
2、准备工作: 将cer格式Certificate放导D:\jdk11\lib\securityFile夹下。
3、jdk导入cer格式Certificate: 进入jdkInstallationDirectory的D:\jdk11\lib\securityFile夹下,Execute如下Command:
keytool -import -alias edigatewaytest01 -file edigatewaytest01.jusdaglobal.com.cer -keystore cacerts -trustcacerts
说明: edigatewaytest01:Certificate别名 edigatewaytest01.jusdaglobal.com.cer:需要导入的cer格式Certificate
导入过程: 3.1、提示输入密码,密码一般默认第一个先测试:changeit 第二个测试密码:changeme 3.2、提示确认是否信任证书,直接输入Y回车确认即可。
4、Verification是否导入成功:Verify Installation,如果显示你导入的密码就说明成功了
keytool -list -keystore cacerts -alias edigatewaytest01
说明: edigatewaytest01:刚才导入的Certificate别名 说明: java秘钥口令默认为 changeit,不需要重新Settings秘钥口令;
5、如果提示已存在,则先将Certificate删除,之后再重新导入即可;
keytool -delete -alias edigatewaytest01 -keystore cacerts
说明: edigatewaytest01:刚才导入的Certificate别名
6、ViewCertificate列表:
keytool -list -keystore cacerts
说明: java秘钥口令默认为 changeit,不需要重新Settings秘钥口令;
7、keytoolTools更多Parameter说明: 参考:(不同Version有差异,详细可参见的官方文档)
- —genkey:在用户主Directory中Create一个默认File”.keystore”,还会产生一个mykey的别名,mykey中包含用户的公钥、私钥和Certificate(在没有指定生成位置的情况下,keystore会存在用户系统默认Directory)
- —alias: 产生别名 每个keystore都关联这一个独一无二的alias,这个alias通常不区分大小写
- —keystore: 指定KeyLibrary的名称(产生的各类信息将不在.keystoreFile中)
- —keyalg: 指定Key的算法 (如 RSA DSA,默认值为:DSA)
- —validity: 指定Create的Certificate有效期多少天(默认 90)
- —keysize: 指定Key长度 (默认 1024)
- —storepass: 指定KeyLibrary的密码(Getkeystore信息所需的密码)
- —keypass: 指定别名条目的密码(私钥的密码)
- —dname: 指定Certificate发行者信息 其中: “CN=名字与姓氏,OU=组织单位名称,O=组织名称,L=城市或区Domain 称,ST=州或省份名称,C=单位的两字母国家Code”
- —list: 显示KeyLibrary中的Certificate信息 keytool -list -v -keystore 指定keystore -storepass 密码
- —v: 显示KeyLibrary中的Certificate详细信息
- —export: 将别名指定的Certificate导出到File keytool -export -alias 需要导出的别名 -keystore 指定keystore -file 指定导出的Certificate位置及Certificate名称 -storepass 密码
- —file: Parameter指定导出到File的File名
- —delete: 删除KeyLibrary中某条目 keytool -delete -alias 指定需删除的别 -keystore 指定keystore – storepass 密码
- —printcert: View导出的Certificate信息 keytool -printcert -file g:\sso\michael.crt
- —keypasswd: 修改KeyLibrary中指定条目口令 keytool -keypasswd -alias 需修改的别名 -keypass 旧密码 -new 新密码 -storepass keystore密码 -keystore sage
- —storepasswd: 修改keystore口令 keytool -storepasswd -keystore g:\sso\michael.keystore(需修改口令的keystore) -storepass pwdold(原始密码) -new pwdnew(新密码)
- —import: 将已签名数字Certificate导入KeyLibrary keytool -import -alias 指定导入条目的别名 -keystore 指定keystore -file 需导入的Certificate