首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >缺少客户端证书:如何恢复它

缺少客户端证书:如何恢复它
EN

Stack Overflow用户
提问于 2019-03-31 14:51:17
回答 1查看 1.8K关注 0票数 1

我所在的团队正试图使用证书将Java应用程序连接到安全的企业web服务站点。没有一个团队成员有为这种类型的连接创建证书和编码的经验。

我们准备并提交了一份企业社会责任报告,并从网站上获得了一份.p7b证书。.p7b包含两个证书:一个是由web服务站点颁发的,另一个是由公司所有者自己的CA颁发的web服务站点。两者都出现在下面的密钥存储列表中。keystore在自定义SSLContext中被引用,并且HttpClient代码使用该SSLContext创建了一个没有错误的SSLContext。

当Java代码试图执行HttpGet时,web服务站点拒绝SSLHandshake并使用错误终止连接:

代码语言:javascript
复制
javax.net.ssl.SSLHandshakeException: Remote host closed connection during handshake

在握手调试跟踪中,在握手的步骤13中,消息是:

代码语言:javascript
复制
ServerHelloDone
Warning: no suitable certificate found - continuing without client authentication
Certificate chain
Empty

Keytool将密钥存储库的内容列表为:(修改后的公司身份)

代码语言:javascript
复制
Keystore type: PKCS12
Keystore provider: SUN

Your keystore contains 1 entry

Alias name: server
Creation date: Mar 28, 2019
Entry type: PrivateKeyEntry
Certificate chain length: 2
Certificate[1]:
Owner: ...
Issuer: ...
Serial number: ...
Valid from: Mon Mar 11 19:00:00 CDT 2019 until: Wed Mar 11 18:59:59 CDT 2020
Certificate fingerprints:
     SHA1: ...
     SHA256: ...
Signature algorithm name: SHA1withRSA
Subject Public Key Algorithm: 2048-bit RSA key
Version: 3

Extensions: 

#1: ObjectId: 2.16.840.1.113733.1.6.9 Criticality=false
0000: 01 01 FF                                           ...


#2: ObjectId: 2.5.29.19 Criticality=false
BasicConstraints:[
  CA:false
  PathLen: undefined
]

#3: ObjectId: 2.5.29.31 Criticality=false
CRLDistributionPoints [
  [DistributionPoint:
     [URIName: http://onsite-crl.pki.digicert.com/ATTServicesIncApplicationCertificates/LatestCRL.crl]
]]

#4: ObjectId: 2.5.29.15 Criticality=false
KeyUsage [
  DigitalSignature
  Key_Encipherment
]

#5: ObjectId: 2.16.840.1.113730.1.1 Criticality=false
NetscapeCertType [
   SSL client
]

Certificate[2]:
Owner: ...
Issuer: ...
Serial number: ...
Valid from: Wed Feb 23 18:00:00 CST 2011 until: Tue Feb 23 17:59:59 CST 2021
Certificate fingerprints:
     SHA1: ...
     SHA256: ...
Signature algorithm name: SHA1withRSA
Subject Public Key Algorithm: 2048-bit RSA key
Version: 3

Extensions: 

#1: ObjectId: 2.5.29.35 Criticality=false
AuthorityKeyIdentifier [
KeyIdentifier [
0000: 97 20 99 C2 73 2A 45 EB   E0 02 7F 47 DA 7B AB 7C  . ..s*E....G....
0010: EB 1F AF 6E                                        ...n
]
]

#2: ObjectId: 2.5.29.19 Criticality=true
BasicConstraints:[
  CA:true
  PathLen:0
]

#3: ObjectId: 2.5.29.31 Criticality=false
CRLDistributionPoints [
  [DistributionPoint:
     [URIName: http://onsitecrl.verisign.com/offlineca/ATTServicesIncATTServicesIncRootCA.crl]
]]

#4: ObjectId: 2.5.29.15 Criticality=true
KeyUsage [
  Key_CertSign
  Crl_Sign
]

#5: ObjectId: 2.5.29.17 Criticality=false
SubjectAlternativeName [
  CN=VeriSignMPKI-2-51
]

#6: ObjectId: 2.5.29.14 Criticality=false
SubjectKeyIdentifier [
KeyIdentifier [
0000: 25 64 37 69 DB DC 57 99   43 80 79 29 90 6C B8 13  %d7i..W.C.y).l..
0010: 58 EE B6 D0                                        X...
]
]



*******************************************
*******************************************

]
}

密钥存储库似乎包含了私钥的条目,但没有包含客户端证书;只列出了来自web服务站点的.p7b的两个证书。

StackOverflow的帖子是:

why doesn't java send the client certificate during SSL handshake?

建议从密钥库导出客户端证书并编辑证书链。这并不能缓解问题,显然是因为keystore包含了我们的私钥,但没有包含我们已签名的证书。

我没有标识为客户端证书的工件。Oracle程序在下列地方提供:

https://docs.oracle.com/cd/E19509-01/820-3503/ggezu/index.html

建议应该在准备原始CSR的过程中创建签名的客户端证书(过程的第3步),但是我们似乎没有将该证书文件作为单独的工件。

我认为我们需要重建客户端证书,并将其导入到密钥存储库中证书链的正确位置。由于我们似乎没有在创建CSR时创建原始文件,所以现在是否可以从头开始重新创建客户端证书( Oracle过程的步骤3-5)并将其编辑回链中?是否有办法从原始CSR中提取或重建客户证书?

任何问题、见解或建议都非常感谢。谢谢。

EN

回答 1

Stack Overflow用户

发布于 2019-03-31 21:58:57

密钥存储库似乎包含了私钥的条目,但没有包含客户端证书;只列出了来自web服务站点的.p7b的两个证书。

您所显示的按keytool 列出的PrivateKeyEntry确实包含一个客户机证书(由BC、KU和NCT提供),以及一个CA证书,该证书可能是该客户端证书的颁发(父)证书。(如果您使用keytool将这些证书导入到这个密钥存储库,CA证书肯定是颁发者,因为keytool验证了这一点;如果您使用了另一个工具,它应该强制执行相同的要求,但可能不会。)您将p7b描述为包含“由企业所有者自己的CA发布的web服务站点的第二个”,但是(1)如果是这种情况,关键工具就不会将其作为同一链的一部分导入,(2)这将没有任何意义,因为客户端不需要在其密钥库或信任库中使用CA颁发的(即非自签名)服务器证书,只有服务器的CA证书在其信任库中,而且即使它是一个共享文件,作为单独的条目也不存在于客户端的PrivateKeyEntry中。

根据您的描述,您将得到一个javax.net.debug=ssl跟踪,因此请查看该跟踪中加载密钥存储库的部分,并确保加载了该条目,并查看Cert Authorities下的服务器的*** CertificateRequest,以查看它所要求的CA (在*** ServerHelloDone之前),并将其与您的密钥存储中的链的实际CA进行比较(未编辑)。由于您使用的是Apache HttpClient,如果使用指定PrivateKeyStrategy的重载之一,请确保它正确选择别名。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55442135

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档