C++ 有没有办法获取我在C+;中发送给对等方的OpenSSL X509证书名+;?

C++ 有没有办法获取我在C+;中发送给对等方的OpenSSL X509证书名+;?,c++,c,ssl,openssl,x509,C++,C,Ssl,Openssl,X509,我在一些情况下从同行那里得到远程证书不匹配错误,我无法从服务器端跟踪问题 在执行int ret=SSL\u accept(SSL)之后,是否有一种方法可以在SSL握手期间从服务器(C++二进制)获取证书名称及其详细信息并打印出来 是否有我可以使用的SSL API 谢谢 我通常用“愚蠢的方式”来做这件事——捕捉 tcpdump -n -s 1500 -w - port 443 and host www.foobar.com | strings tcpdump -n -s 1500 -w - po

我在一些情况下从同行那里得到
远程证书不匹配
错误,我无法从服务器端跟踪问题

在执行
int ret=SSL\u accept(SSL)
之后,是否有一种方法可以在SSL握手期间从服务器(C++二进制)获取证书名称及其详细信息并打印出来

是否有我可以使用的SSL API


谢谢

我通常用“愚蠢的方式”来做这件事——捕捉

tcpdump -n -s 1500 -w - port 443 and host www.foobar.com | strings

tcpdump -n -s 1500 -w - port 443 and host www.foobar.com | hexdump -C
i、 只是在电线上嗅。与正常(非升级等)ssl交换期间一样,这是以明文形式交换的。ASN1编码时-很容易“看到”通用名称和其他DN字段

000305e0  06 03 55 04 0b 13 16 77  77 77 2e 71 75 6f 76 61  |..U....www.quova|
000305f0  64 69 73 67 6c 6f 62 61  6c 2e 63 6f 6d 31 20 30  |disglobal.com1 0|
00030600  1e 06 03 55 04 03 13 17  51 75 6f 56 61 64 69 73  |...U....QuoVadis|
00030610  20 47 6c 6f 62 61 6c 20  53 53 4c 20 49 43 41 30  | Global SSL ICA0|
00030620  1e 17 0d 31 31 30 38 30  35 31 30 31 38 30 36 5a  |...110805101806Z|
00030630  17 0d 31 32 30 38 30 35  31 30 31 38 30 36 5a 30  |..120805101806Z0|
00030670  1b 30 19 06 03 55 04 0a  13 12 41 42 4e 20 41 4d  |.0...U....ABN AM|
00030680  52 4f 20 42 61 6e 6b 20  4e 2e 56 2e 31 19 30 17  |RO Bank N.V.1.0.|
00030690  06 03 55 04 0b 13 10 49  6e 74 65 72 6e 65 74 20  |..U....Internet |
000306a0  42 61 6e 6b 69 6e 67 31  16 30 14 06 03 55 04 03  |Banking1.0...U..|

就是你看到的那种东西。正确的方法是坐在回调上分析证书堆栈。

您可以使用带有SSL会话结构的
SSL\u get\u certificate
(在SSL\u Accept中返回)来获取X509结构,该结构拥有提供给客户端的证书。 稍后,您可以使用一些X509特定函数提取证书的CN:

X509_NAME_oneline(X509_get_subject_name(certificate), buf, 256);

这将是一种幼稚的做法,因为一个证书可以处理不同的CN,但是,这可能会对您的问题造成很大影响。

如果您想查看源代码,s_客户端会这样做。同样,这个问题类似于:Thnx-但这不是我想要的。我在寻找SSL握手期间发送给客户端的证书名。哎呀,我确实错过了那个。那么您想转储服务器提供给客户端的证书吗?在这种情况下,我认为最简单的方法是捕获传输。我不知道还有什么其他方法可以通过API调用转储当前证书的内容。希望其他人能做到。祝你好运。。对我只需要证书名,至少。。。无论如何,谢谢!如何从证书中获取所有CN?X509_NAME_get_index_by_NID和NID_commonName,然后使用X509_NAME_get_条目获取该条目,直到第一个函数返回-1是我从研究中得到的答案。。但我不确定这是否有效。@PrasanthMadhavan是的,它有效,正如这里所解释的,这是正确的方法之一: