我有以下证书层次结构。我需要在 Apache 上进行客户端身份验证。
.
└── root (CA) - self signed
├── intermediate 1 (CA)
| ├── client1
| ├── client2
└── intermediate 2 (CA)
├── client3
└── client4
谁应该存储中间证书(客户端还是服务器)?
我更愿意在服务器上只存储一个根 CA,以便根据它验证所有客户端证书。主要原因是中间 CA 列表可能会增长,而且我不想一直更新存储在 Apache 配置中的证书。
这在技术上可行吗? SSL 协议是否要求客户端发送整个链?
关于这个问题的一个想法。据我所知,当客户端验证服务器时,服务器会将整个链发送给客户端。我希望它是对称的,当服务器需要验证客户端时,客户端有责任发送整个链。
答案1
当客户端验证服务器时,服务器将发送 中定义的链SSLCertificateChainFile
,这是您作为服务器管理员的责任。因此,当客户端验证自身身份时,它还负责发送整个链。Apache 只需要知道您在 中定义的 CA 证书SSLCACertificateFile
。您也可以自行决定在此处定义链,这将使 Apache 对不自行发送链的客户端更加宽容。
为用户签署证书时,请确保为用户提供正确的证书链。您的用户可以使用以下 OpenSSL 命令构建 .p12:
openssl pkcs12 -export -in ${SIGNED_CERT} -inkey ${PRIVATE_KEY} \
-name ${USERNAME} -out ${OUTPUT_P12} -certfile ${PROVIDED_CHAIN}