我正在使用运行 Ubuntu 22.04 的虚拟专用服务器。在 VPS 上,我使用 Apache Web 服务器来提供内容,例如 wiki。
为了确保只有我可以访问内容,我已将 Apache 配置为期望客户端通过客户端证书对自己进行身份验证。
我在 Ubuntu 服务器上使用 OpenSSL 创建 CA,然后用它创建客户端证书。客户端证书使用导出密码。
我可以在 Windows 10 上的 Firefox 和 Chrome 中的 Android 手机上毫无问题地安装和使用生成的客户端证书。因此,原则上证书和密码似乎都工作得很好。但是,具有相同导出密码的相同证书将无法在我的 iPad 上安装,并声称密码不正确。
我已使用这些 OpenSSL 命令来创建 CA 密钥和证书:
注意:在寻找此问题的解决方案时,我发现这篇文章表明iOS无法处理使用OpenSSL 3.x创建的证书。因此,我在以下命令中使用了 OpenSSL 1.1.1。
openssl genrsa -aes256 -out ca.key
openssl req -x509 -new -nodes -key ca.key -sha512 -days 365 -out ca.crt
这些是我用来创建客户端证书的 OpenSSL 命令:
openssl req -newkey rsa:2048 -days 365 -nodes -keyout client-key.pem > client-request.pem
openssl x509 -req -in client-request.pem -days 365 -CA ca.crt -CAkey ca.key -set_serial 01 > client-cert01.pem
客户端密钥已分配有密码。
然后我将它们转换为 .pfx 文件,如下所示:
openssl pkcs12 -export -in client-cert01.pem -inkey client-key.pem -out client-cert01.pfx
.pfx 文件分配有导出密码。
如上所述,生成的 .pfx 文件适用于 Windows 上的 Firefox 和 Android 上的 Chrome,但如果我尝试使用相同的密码在 iPad 上安装相同的 .pfx 文件,则 iOS 将拒绝该密码。
我尝试使用 OpenSSL 3 和 OpenSSL 1.1.1 生成证书和密钥,我尝试将证书导出为 .p12 格式(尽管我不确定这会产生很大的差异),我也尝试创建Mac Mini 上的证书请求而不是 Linux 服务器本身。然而,这些都没有任何效果。
有谁知道问题可能是什么或者我可能缺少什么?
我找到了问题的原因。这有点尴尬,因为这是一个公然的用户错误。
在 Windows 上的 Firefox 上,导入证书时系统会要求您提供证书导出密码。
在 Android 版 Chrome 上,导入证书时系统会要求您提供证书导出密码。
在 iOS 上,导入证书时会要求您输入“代码”。不过,这个第一个密码提示不是指的是证书的导出密码,而是你的iPad的密码。仅在正确输入您的 iPad 密码后才会提示导出密码...