SSL_do_handshake()
、SSL_connect()
、SSL_accept()
、SSL_write()
时的情况, SSL_read()
或 SSL_shutdown()
返回 0,调用 SSL_get_error()
后返回 SSL_ERROR_SYSCALL
和一个实际的 errno
为 0 表示对端已关闭 TCP 连接,例如通过在没有正确关闭 SSL 的情况下调用 close()
。 这是一种完全正常和常见的情况,但就 TLS/SSL 而言,这不是正常的断开连接。因此,违反 SSL 协议(protocol)的是 EOF。
- 1初始化 OpenSSL 库:调用 SSL_library_init() 和 SSL_load_error_strings() 来初始化 SSL 库和错误信息。
-
- 2创建 SSL 上下文:使用 SSL_CTX_new() 函数创建 SSL 上下文对象,该对象将保存 SSL 相关的配置信息,如加密算法、证书等。
-
- 3加载证书和私钥:使用 SSL_CTX_use_certificate_file() 和 SSL_CTX_use_PrivateKey_file() 函数加载服务器的证书和私钥。证书用于验证服务器身份,私钥用于进行加密和解密操作。
-
- 4创建监听套接字:创建一个监听套接字,并绑定到服务器的 IP 地址和端口上。
-
- 5等待客户端连接:使用 accept() 函数等待客户端的连接请求,并返回一个新的套接字用于与客户端通信。
-
- 6创建 SSL 对象:使用 SSL_new() 函数创建一个 SSL 对象,并将其与刚刚建立的套接字关联起来。
-
- 7设置 SSL 握手:使用 SSL_set_accept_state() 将 SSL 对象设置为接受状态,表示准备进行 SSL 握手过程。
-
- 8执行 SSL 握手:通过 SSL_accept() 函数执行 SSL 握手过程,该过程涉及到协商加密算法、验证证书等步骤。
-
- 9处理加密通信:一旦握手成功,可以使用 SSL_read() 和 SSL_write() 函数进行加密的读写操作,实现安全的数据传输。
-
- 10关闭 SSL 连接:使用 SSL_shutdown() 函数关闭 SSL 连接,确保安全地关闭连接。
-
- 11清理资源:释放 SSL 对象和 SSL 上下文,并关闭套接字。
- 1.初始化 MbedTLS 库:调用 mbedtls_ssl_init() 来初始化 MbedTLS 库,并设置随机数生成器。
-
- 2.创建 SSL 上下文:使用 mbedtls_ssl_config_init() 和 mbedtls_ssl_config_defaults() 函数来创建和配置 SSL 上下文对象,包括选择加密算法、证书验证方式等。
-
- 3.加载证书和私钥:使用 mbedtls_x509_crt_parse_file() 和 mbedtls_pk_parse_keyfile() 函数加载服务器的证书和私钥。
-
- 4.创建监听套接字:创建一个监听套接字,并绑定到服务器的 IP 地址和端口上。
-
- 5.等待客户端连接:使用 accept() 函数等待客户端的连接请求,并返回一个新的套接字用于与客户端通信。
-
- 6.创建 SSL 对象:使用 mbedtls_ssl_init() 函数创建一个 SSL 对象,并将其与刚刚建立的套接字关联起来。
-
- 7.设置 SSL 握手:使用 mbedtls_ssl_setup() 将 SSL 对象与 SSL 上下文关联起来,并设置握手状态为服务器模式。
-
- 8.执行 SSL 握手:通过 mbedtls_ssl_handshake() 函数执行 SSL 握手过程,该过程涉及到协商加密算法、验证证书等步骤。
-
- 9.处理加密通信:一旦握手成功,可以使用 mbedtls_ssl_read() 和 mbedtls_ssl_write() 函数进行加密的读写操作,实现安全的数据传输。
-
- 10关闭 SSL 连接:使用 mbedtls_ssl_close_notify() 函数关闭 SSL 连接,确保安全地关闭连接。
-
- 11 清理资源:释放 SSL 对象和 SSL 上下文,并关闭套接字。