Testing SSL/TLS Client Authentication with OpenSSL
我正在使用TLS开发客户端/服务器应用程序。我的想法是在客户端上使用证书,以便服务器进行身份验证。服务器上还有另一个证书,因此客户端也可以验证它是否连接到正确的服务器。
我想先测试并使用openssl s_server和openssl s_client验证提案。
到目前为止,我已经在服务器上创建了CA私钥,还创建了根证书。使用根证书,我已经签署了两个CSR,因此我为服务器获得了一个证书,为客户端获得了一个证书。
我还在客户端上安装了客户端证书+根证书,并在服务器上安装了服务器证书+根证书。
现在,我想尝试在openssl s_server和openssl s_client之间建立连接,并验证它们是否相互进行了身份验证,但是我无法确定如何执行此操作。有任何帮助或指导吗?
设置好之后,下一步就是针对该服务器测试自己开发的客户端,针对s_client测试我们自己开发的服务器。我们可以将其用于测试吗?
谢谢
看来您正在尝试使用(1)
为确保
-
-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_CTX_load_verify_locations(3),SSL_CTX_use_certificate(3),SSL_CTX_set_client_CA_list和朋友的文档。
最容易使用的证书和密钥格式是PEM。 PEM是使用例如
让服务器发送所有必需的证书是解决"哪个目录"问题的标准做法。这是PKI中一个众所周知的问题,本质上是客户不知道去哪里获取丢失的中间证书的问题。
通常,您现在知道需要使用的功能。下载像nginx这样的小型服务器,并查看生产服务器在实践中如何使用它们。您甚至可以使用像Postgres这样的SQL服务器,因为它可以设置SSL / TLS服务器。只需在源文件中搜索
尽管我不建议这样做,但您甚至可以查看
生成两对证书/密钥,一对用于服务器,一对用于客户端。还要创建带有任何内容的test.txt。
要设置检查客户端证书的SSL服务器,请运行以下命令:
1 | openssl s_server -cert server_cert.pem -key server_key.pem -WWW -port 12345 -CAfile client_cert.pem -verify_return_error -Verify 1 |
要使用客户端证书测试服务器,请运行以下命令:
1 2 3 4 5 | echo -e 'GET /test.txt HTTP/1.1\ \ \ \ ' | openssl s_client -cert client_cert.pem -key client_key.pem -CAfile server_cert.pem -connect localhost:12345 -quiet |
另外,您可以使用curl命令:
1 | curl -k --cert client_cert.pem --key client_key.pem https://localhost:12345/test.txt |