如何在 Windows 中使用 OpenSSL 指定 -CAPath 以执行 TLS 握手

信息安全 tls openssl 窗口服务器
2021-08-18 14:08:05

我是使用 OpenSSL 的新手,目前在 Windows 中使用它,试图为连接到我们服务器的一方进行故障排除。

openssl s_client -connect servername:443

CONNECTED(00000134)
depth=0 CN = servername
verify error:num=20:unable to get local issuer certificate
verify return:1
depth=0 CN = servername
verify error:num=21:unable to verify the first certificate
verify return:1
[other details follow...]

经过几次搜索后,我意识到我需要为受信任的根 ca 指定路径。

-CApath directory 用于服务器证书验证的目录。此目录必须为“哈希格式”,有关详细信息,请参阅验证。这些也用于构建客户端证书链。

-CApath /etc/ssl/certs/

我唯一的问题是大多数在线示例都使用基于 unix 的系统,因此示例通常与上面的示例类似。我对 unix 不太熟悉,所以我假设我的 CA 在

C:\OpenSSL-Win64\bin\cas

然后 ca 路径参数如下所示。CA 采用 .cer / .crt 格式。

-CApath /c/OpenSSL-Win64/bin/cas

但是,我仍然得到相同的结果,所以我不确定我是否理解正确。

3个回答

#使用别人的 PEM 包。

您不能直接将 Windows 证书存储与 OpenSSL 一起使用。相反,OpenSSL 期望其 CA 采用以下两种方式之一:

  1. 许多文件:在一个特殊的文件夹结构中。每个证书一个文件,具有常规名称,例如Verisign-CA.pem. (这样人们就可以理解证书存储。)然后是每个此类文件的符号链接。并且符号链接具有奇怪的名称,例如01c34cfa... 等等。它们以证书文件的哈希值命名。(这样 OpenSSL 可以理解证书存储。更多信息:手册页openssl verify。)如果要添加证书,只需将文件放在目录中并运行为您创建符号链接的脚本。

您可以使用命令行参数指定该文件夹的路径CApath区分大小写:大CA、小path。):

    -CApath arg   - PEM format directory of CA's
  1. 单个文件:所有 CA 证书集中在一个 PEM 包中。

您可以使用命令行参数指定该文件的路径CAfile区分大小写:大CA、小file。):

    -CAfile arg   - PEM format file of CA's

获得这样一个 PEM 包的一种简单方法是从 testssl.sh 站点下载它:https ://github.com/drwetter/testssl.sh/blob/3.1dev/etc/Microsoft.pem

然后这将适用于 OpenSSL 的 Windows 安装:

    c:\> openssl s_client -connect google.com:443 -CAfile "c:\Microsoft.pem"  

...

    Timeout   : 300 (sec)
    Verify return code: 0 (ok)
    ---

该站点列出了提供 PEM 包的各种站点,并引用了这个git hub 项目,该项目以单一文件格式提供了所有主要 OS PEM 包的副本,可供 Windows 上的 OpenSSL 使用。

可以从提供的 tar 文件中提取 microsoft_windows.pem 并像这样使用它

echo | openssl.exe s_client -CAfile microsoft_windows.pem -servername URL -connect HOST:PORT 2>nul

该错误是因为 openssl.exe 希望您告诉它从何处获取根 CA 证书。在 *nix 中这很容易,因为它们是文件,但在 Windows 中,它们存储为注册表项。

您可以从 Internet 下载它们,或者如果您运行 Certificate Manager,则可以从您自己的计算机上获取它们。Win+R > certmgr打开程序,然后证书 - 本地计算机 > 受信任的根证书颁发机构 > 证书打开列表。从那里选择适当的证书颁发机构(例如,如果您针对 LetsEncrypt / Certbot 进行身份验证,则 2021 年的 CA 是“ISRG Root X1”)。右键单击 > 所有任务 > 导出会打开导出向导,“Base-64 编码 X.509”将为您提供一个可以保存的 pem 文件。

如果您只需要检查单个 CA,那么您现在基本上完成了。使用该选项运行 openssl.exe,-CAfile x:/path/to/your/new/file.cer只要您的文件是正确的根 CA,您就不会收到该错误。

但是你问的是-CApath哪个允许你拥有多个 CA 文件,它会检查哪个是合适的。在 Windows 上使用此方法有一个额外的步骤。s_client的文档说您指向的目录必须是“哈希格式”,并检查文档以验证哪些文件必须以x509文档中描述的“hash.0”格式命名,这给了我们答案: 所指向的目录-CApath不能只包含任何旧名称的文件,它们必须根据您可以从中获取的加密“证书主题名称”来命名openssl.exe x509

例如,如果您将 ISRG Root X1 证书的 .cer 文件导出到C:\certs\lets.cer,您可以运行命令

openssl.exe s_client -CAfile C:\certs\lets.cer -connect servername:443

或者如果你想创建一个证书目录,你首先运行

openssl.exe x509 -subject_hash -in C:\certs\lets.cer

它为您提供哈希4042bcee(以及证书的打印输出)

因此,您将 .cer 文件重命名为C:\certs\4042bcee.0(或制作副本,或符号链接等)

然后你可以运行 openssl.exe s_client -connect servername:443 -CApath C:\certs\

另外,如果您不想指定-CApath每次,您可以检查我的Win10系统上默认路径openssl.exe version -a

OPENSSLDIR: "C:\Program Files\Common Files\SSL"

并将特别命名的文件放入其子文件夹\certs中,所以在我的情况下,在 Win10 上C:\Program Files\Common Files\SSL\certs