设置以避免PKIX路径构建失败错误

时间:2016-10-19 13:49:45

标签: java ssl keystore

很抱歉打开同一主题的另一个问题,但我认为这个子问题会使other one臃肿成为遗忘。

我遇到了上面提到的错误消息,这是非常不明确的(至少对我而言)。调试输出显示加载的证书,然后只显示提到的错误。我使用自己的CA链生成了测试证书: CA - > SubCA - > ClientCert

我尝试使用SSL连接同一台计算机上的客户端和服务器(以测试双向协议)。

我使用以下命令生成我的证书:

openssl req -batch -x509 -config ${ROOTCA_CONFIG} -newkey rsa:2048 -sha1 -nodes -out ${ROOTCA_CERT} -outform PEM -days 7300 
openssl req -batch -config ${SUBCA_CONFIG} -newkey rsa:2048 -sha1 -nodes -out ${SUBCA_CSR} -outform PEM
openssl ca -batch -config ${ROOTCA_CONFIG} -policy signing_policy -extensions signing_req_CA -out ${SUBCA_CERT} -infiles ${SUBCA_CSR}

他们似乎很好。让我感到困惑的唯一事情是:如果将两个证书连接成一个文件并用该链验证它们就可以了。如果它尝试仅使用subCA或根CA进行验证,则验证失败。

然后我创建我的客户端/服务器证书:

openssl req -batch -config ${CLIENT_CONFIG} -newkey rsa:2048 -sha256 -nodes -out ${CLIENT_CSR} -outform PEM -keyout $1.key
openssl ca -batch -config ${SUBCA_CONFIG} -policy signing_policy -extensions signing_req -out ${CLIENT_CERT} -infiles ${CLIENT_CSR}

有了这个,我创建了一个在我的密钥库中使用的PKCS12文件:

openssl pkcs12 -export -inkey ${CONNECTOR_KEY} -in ${CONNECTOR_CERT} -out ${CONNECTOR_P12}

我这样做是通过两次调用我的脚本,一次是服务器,一次是客户端。让我们称它们为client.cert和server.cert,即使客户端/服务器令人困惑,因为它们都是本地协议端点。

然后我使用这些命令为客户端和服务器生成信任库和密钥库:

keytool -keystore $2-truststore.jks -importcert -alias ca -file test_ca_certs/rootca.cert
keytool -keystore $2-truststore.jks -importcert -alias subca -file test_ca_certs/subca.cert
keytool -v -importkeystore -srckeystore $1 -srcstoretype PKCS12 -destkeystore $2-keystore.jks -deststoretype JKS

让$ 2为客户端和服务器(服务器信任库等),$ 1与$ {CONNECTOR_P12}之前相同(somefile.p12)

所以现在我有了一个带CA和SubCA的信任库以及一个带有PKCS12令牌的密钥库。 Truststore在客户端和服务器端是相同的,Token几乎相同,但具有不同的密钥对,因为它们每次都生成。

ssl调试输出表明已加载证书:

keystore (...) has type [jks], and contains aliases [1].
***
found key for : 1
chain [0] = [
[
  Version: V3
  Subject: CN=cnname, OU=ouname, O=oname, L=location, ST=bavaria, C=DE
  Signature Algorithm: SHA256withRSA, OID = 1.2.840.113549.1.1.11

  Key:  Sun RSA public key, 2048 bits
  modulus: 2999...
  public exponent: 65537
...
...
keystore has type [jks], and contains aliases [ca, subca].
adding as trusted cert:
  Subject: CN=my Root CA 2016, O=organization, C=DE
  Issuer:  CN=my Root CA 2016, O=organization, C=DE
  Algorithm: RSA; Serial number: 0xfc8239c0355555c1
  Valid from Wed Oct 19 10:14:36 CEST 2016 until Tue Oct 14 10:14:36 CEST 2036

adding as trusted cert:
  Subject: CN=my SubCA 2016, O=Fraunhofer, C=DE
  Issuer:  CN=my Root CA 2016, O=Fraunhofer, C=DE
  Algorithm: RSA; Serial number: 0x1
  Valid from Wed Oct 19 10:14:38 CEST 2016 until Thu Oct 17 10:14:38 CEST 2024

我的理解是否存在一些普遍的缺陷?再次,抱歉发布两个问题,但我开始相信我以更基本的方式做错了什么。谢谢!

1 个答案:

答案 0 :(得分:2)

我终于找到了解决方案。我只将调试设置为SSL。这是我的错。我需要将调试输出设置为“all”。然后我可以看到此错误消息:

  

引起:sun.security.validator.ValidatorException:扩展密钥   用法不允许用于TLS服务器身份验证

这更加具体。为了解决这个问题,我确实需要将扩展​​密钥用法改为:

keyUsage            = digitalSignature, keyEncipherment, nonRepudiation
extendedKeyUsage    = clientAuth, serverAuth

非常感谢!