4,453
社区成员




if (nClient == -1)
应该是
if (m_nConversion == -1)
如此种种,回复改起来相对麻烦,所以如果有更正,一并放在我的另一篇博文里:《OpenSSL编程初探2 --- 关于证书文件的加载》
另外也在博文里补充了更多的一些内容 // 前面省略了服务端socket套接字的创建过程
// 接受客户端的socket连接
m_nConversion = accept(nListen, (sockaddr *)&addr_client, &size);
if (nClient == -1)
{
printf("accept failed!\n");
continue;
}
// 创建服务端SSL会话环境
m_pServerCtx = SSL_CTX_new(SSLv23_server_method());
if (m_pServerCtx == 0)
{
printf("SSL_CTX_new for Server failed!\n");
return -1;
}
/*-------------------------Begin of:服务端公私钥加载-------------------------*/
// 为服务端指定SSL连接所用公钥证书
//参数 m_pServerCtx,服务端SSL会话环境
//参数 pCertPath,你存放公钥证书的路径
//参数 SSL_FILETYPE_PEM,指定你所要加载的公钥证书的文件编码类型为 Base64
if (SSL_CTX_use_certificate_file(m_pServerCtx, pCertPath, SSL_FILETYPE_PEM) != 1)
{
printf("SSL_CTX_use_certificate_file failed!\n");
return -1;
}
// 为服务端指定SSL连接所用私钥
//参数 m_pServerCtx,服务端SSL会话环境
//参数 pKeyPath,你存放对应私钥文件的路径
//参数 SSL_FILETYPE_PEM,指定你所要加载的私钥文件的文件编码类型为 Base64
if (SSL_CTX_use_PrivateKey_file(m_pServerCtx, pKeyPath, SSL_FILETYPE_PEM) != 1)
{
printf("SSL_CTX_use_PrivateKey_file failed!\n");
return -1;
}
// 检查SSL连接 所用的私钥与证书是否匹配【所以你仅有公约证书是不够的】
if (!SSL_CTX_check_private_key(m_pServerCtx))
{
printf("Private key does not match the certificate public key\n");
return -1;
}
/*-------------------------End of:服务端公私钥加载-------------------------*/
// 创建一个与客户端通信的SSL套接字
m_pServerSSL = SSL_new(m_pServerCtx);
if (m_pServerSSL == 0)
{
printf("SSL_new for Server failed!\n");
return -1;
}
// 将与客户端通信的 SSL套接字&&socket套接字 进行可读写地绑定
SSL_set_fd(m_pServerSSL, m_nConversion);
// 接受客户端的SSL连接
if (SSL_accept(m_pServerSSL) == -1)
{
printf("SSL_set_fd for Server failed!\n");
return -1;
}
//后面省略的是基于SSL_read()与SSL_write()的SSL通信过程