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

Setup to avoid PKIX path building failed error

很抱歉打开另一个相同主题的问题,但我认为这个子问题会使 膨胀到被遗忘。

我 运行 进入提到的错误消息,这是非常不具体的(至少对我而言)。调试输出显示证书已加载,然后仅显示提到的错误。我用自己的 CA 链生成了测试证书: CA -> SubCA -> ClientCert

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

我使用这些命令生成我的 ca 证书:

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 进行验证,则验证失败。

然后我创建我的 client/server 证书:

openssl req -batch -config ${CLIENT_CONFIG} -newkey rsa:2048 -sha256 -nodes -out ${CLIENT_CSR} -outform PEM -keyout .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,即使 client/server 令人困惑,因为它们都是本地协议端点。

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

keytool -keystore -truststore.jks -importcert -alias ca -file test_ca_certs/rootca.cert
keytool -keystore -truststore.jks -importcert -alias subca -file test_ca_certs/subca.cert
keytool -v -importkeystore -srckeystore  -srcstoretype PKCS12 -destkeystore -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

我的理解有什么普遍性的错误吗?再次,很抱歉提出两个问题,但我开始相信我以更基本的方式做错了。谢谢!

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

Caused by: sun.security.validator.ValidatorException: Extended key usage does not permit use for TLS server authentication

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

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

非常感谢!