我正在将 openssl 添加到我的应用程序中,我可以发送和接收数据,但是到目前为止它没有加密或检查证书。
我通过以下方式获得服务器证书:
X509 *gCert = NULL;
X509_NAME *gCertName = NULL;
gCert = SSL_get_peer_certificate(sslConnection.ssl);
gCertName = X509_NAME_new();
gCertName = X509_get_subject_name(gCert);
certNameLen = strlen(gCertName);
memcpy(write_buffer, gCertName, certNameLen);
Run Code Online (Sandbox Code Playgroud)
然后我将 write_buffer 写入 SSL 套接字,但我在另一端收到的只是胡言乱语。
如何使用 X509_NAME?strlen 似乎不起作用?我得到长度 4,这是我认为的指针大小,而不是缓冲区大小...... X509_NAME 是什么编码?好像不是utf-8...
我知道发送下游工作,如果我只是将 0xAA 或 0XBB 放在缓冲区中,它会在另一端正确接收。
你已经相当接近了。然而 X509_get_name 返回一个 X509_NAME 结构,您需要将其转换为人类可读的字符串(或使用“原样”进行详细且更安全的比较;因为解析/比较纯 ascii 有点冒险 - 聪明的对手可能会放入诸如“C”之类的内容='在实际文本中)。
最简单的是
X509 * gCertName =SSL_get_peer_certificate(con);
// if null - error out
const char * buf = X509_NAME_oneline(gCertName, 0, 0);
// if null - release memory and error out
printf("Client\t: %s\n", buf);
OpenSSL_free(buf);
X509_free(gCertName);
Run Code Online (Sandbox Code Playgroud)
这将给你一个以 C \0 结尾的字符串的一行近似值。请注意,_oneline 函数已被废弃 - 请参阅 openssl 的手册页,了解获得 UTF8 和多行安全的文本再现的更详细方法。但以上对于简单的事情来说就很好了,比如纯 ASCII 西方字符集域名,没有替代品/变体之类的东西。
| 归档时间: |
|
| 查看次数: |
3978 次 |
| 最近记录: |