【问题标题】:Testing SSL/TLS Client Authentication with OpenSSL使用 OpenSSL 测试 SSL/TLS 客户端身份验证
【发布时间】:2014-01-29 18:47:54
【问题描述】:

我正在使用 TLS 开发客户端/服务器应用程序。我的想法是在客户端上使用证书,以便服务器对其进行身份验证。服务器上还有另一个证书,因此客户端也能够验证它正在连接到正确的服务器。

我想先测试并使用 openssl s_server 和 openssl s_client 来验证提案。

到目前为止,我已经在服务器上创建了一个 CA 私钥,我已经创建了一个根证书。使用根证书,我签署了两个 CSR,因此我获得了一份用于服务器的证书和一份用于客户端的证书。

我在客户端也安装了客户端证书+根证书,服务器端安装了服务器证书+根证书。

我现在想尝试在 openssl s_server 和 openssl s_client 之间建立连接,并验证它们是否都得到了相互身份验证,但我无法用文档来说明如何去做。对此有任何帮助或指南吗?

设置完成后,下一步就是针对该服务器测试自己开发的客户端,以及针对s_client 测试我们自己开发的服务器。我们可以用它来测试吗?

谢谢

【问题讨论】:

    标签: ssl openssl client-server certificate ssl-certificate


    【解决方案1】:

    您似乎正在尝试使用 (1) s_clients_server 设置信任根以进行测试; (2) 在您的代码中使用 OpenSSL 以编程方式。


    为确保openssl s_client(或openssl s_server)使用您的root,请使用以下选项:

    • -CAfile 选项指定根
    • -cert 要使用的证书选项
    • -key 证书私钥选项

    有关详细信息,请参阅 s_client(1)s_server(1) 上的文档。


    要在客户端以编程方式执行相同操作,您可以使用:

    • SSL_CTX_load_verify_locations 加载可信根
    • SSL_CTX_use_certificate 指定客户端证书
    • SSL_CTX_use_PrivateKey 加载客户端证书的私钥

    要在服务器上以编程方式执行相同操作,您可以使用:

    • SSL_CTX_load_verify_locations 加载可信根
    • SSL_CTX_use_certificate_chain_file指定服务器证书
    • SSL_CTX_use_PrivateKey 加载服务器证书的私钥
    • SSL_CTX_set_client_CA_list 告诉客户端发送其客户端证书

    如果您不想为每个连接(即公共上下文)使用参数,请为每个 SSL 连接设置它,例如 SSL_use_certificateSSL_use_PrivateKey

    SSL_CTX_set_client_CA_list 发生了很多事情。它 (1) 将 CA 加载到用于验证客户端的服务器,(2) 它使服务器在验证客户端时发送它接受的 CA 列表,以及 (3) 它在客户端触发 ClientCertificate 消息如果客户端的证书满足服务器接受的 CA 列表。

    另请参阅SSL_CTX_load_verify_locations(3)SSL_CTX_use_certificate(3)SSL_CTX_set_client_CA_list 和朋友的文档。


    最容易使用的证书和密钥格式是 PEM。 PEM 是使用例如----- BEGIN CERTIFICATE ----- 的一种。对于服务器证书,请确保该文件是服务器证书和客户端构建链所需的任何中间体的串联。

    让服务器发送所有必需的证书是被称为“哪个目录”问题的标准做法。这是 PKI 中众所周知的问题,其本质上是客户端不知道去哪里获取丢失的中间证书的问题。


    总的来说,您现在已经知道需要使用的功能了。下载像nginx 这样的小型服务器,看看生产服务器如何在实践中使用它们。您甚至可以使用像 Postgres 这样的 SQL 服务器,因为它设置了 SSL/TLS 服务器。只需在源文件中搜索SSL_CTX_load_verify_locationsSSL_load_verify_locations,您就会找到正确的位置。

    虽然我不推荐,你甚至可以看看s_client.cs_server.c。它们位于<openssl dir>/apps。但有时代码可能难以阅读。

    【讨论】:

    • 非常感谢您的回答!这个答案太棒了!不能两次投票让我很难过!
    【解决方案2】:

    生成两对证书/密钥,一对用于服务器,一对用于客户端。同时创建包含任何内容的 test.txt

    要设置检查客户端证书的 SSL 服务器,请运行以下命令:

    openssl s_server -cert server_cert.pem -key server_key.pem -WWW -port 12345 -CAfile client_cert.pem -verify_return_error -Verify 1
    

    要使用客户端证书测试服务器,请运行以下命令:

    echo -e 'GET /test.txt HTTP/1.1\r\n\r\n' | openssl s_client -cert client_cert.pem -key client_key.pem -CAfile server_cert.pem -connect localhost:12345 -quiet
    

    您也可以使用 curl 命令:

    curl -k --cert client_cert.pem --key client_key.pem https://localhost:12345/test.txt
    

    【讨论】:

    • 在运行我得到的第一个命令时:[验证深度为 1,必须返回证书输入 server_private_key.pem 的密码:使用默认的临时 DH 参数 ACCEPT],此时 cmd 卡住了.这是否意味着我的客户端证书已成功验证?还是这是一些错误?
    • @SparshDutta,你可能需要输入服务器证书密码。
    • 我确实输入了服务器证书密码
    • 是不是我必须创建一个信任库并将我的客户端证书添加到服务器信任库中?
    猜你喜欢
    • 2016-07-09
    • 1970-01-01
    • 2014-08-24
    • 2010-12-05
    • 1970-01-01
    • 1970-01-01
    • 2023-03-20
    • 2014-09-15
    相关资源
    最近更新 更多