我正在使用TLS开发客户端/服务器应用程序。我的想法是在客户端上使用证书,以便服务器对其进行身份验证。此外,服务器上还有另一个证书,因此客户端也可以验证它是否连接到正确的服务器。
我想先测试并使用openssl s_server和openssl s_client来验证提案。
到目前为止,我已经在服务器上创建了一个CA私钥,我已经创建了一个根证书。使用根证书,我签署了两个CSR,因此我获得了一个服务器证书和一个客户端证书。
我还在客户端安装了客户端证书+根证书,服务器上安装了服务器证书+根证书。
我现在想要尝试在openssl s_server和openssl s_client之间建立连接,并验证它们是否相互进行了身份验证,但我无法用如何执行此操作的文档。任何帮助或任何指南?
一旦我完成了这个设置,下一步就是针对该服务器测试自己开发的客户端,并针对s_client测试我们自己开发的服务器。我们可以用它进行测试吗?
由于
答案 0 :(得分:25)
您似乎正在尝试使用(1)s_client
和s_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_certificate
和SSL_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_locations
或SSL_load_verify_locations
的源文件,您就会找到合适的位置。
虽然我不推荐它,但您甚至可以查看s_client.c
和s_server.c
。它们位于<openssl dir>/apps
。但有时候代码很难阅读。
答案 1 :(得分: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