使用 C++ 在窗口上获取 SSL 证书
Obtaining ssl certificate on windows using C++
我正在尝试在Windows上获取远程服务器的SSL证书。我发现的一个选择是使用openssl。正如互联网上的一些帖子所指示的那样,执行此操作的命令是:
openssl.exe s_client -showcerts -connect {REMOTE_SERVER_IP}:{REMOTE_SERVER_PORT}
这很完美,但我的问题是上述命令的超时时间为 300 秒。证书本身的打印速度非常快,当我在前几秒钟内得到我想要的一切时,我认为没有理由等待 300 秒。我仍然认为无法更改s_client上的超时参数。所以我试图找到一种方法在给定的一段时间后杀死窗口上的进程,但同样没有运气。关于如何做到这一点的任何想法?如果有其他一些Windows方法可以获取远程服务器SSL证书并将其存储在文件中,这也将完成这项工作。
编辑:根据布鲁诺的要求添加更多信息。我正在尝试创建一个 c++ 应用程序,该应用程序获取远程服务器的 SSL 证书并将其存储在文件中以供进一步处理。由于我的应用程序已经使用了openssl.exe因此我要么需要一个使用openssl的解决方案.exe要么需要一个标准的windows命令(即不需要任何其他库(。
EDIT2:我找到了一种避免在 linux 中等待的方法 - 只需创建一个空文件并将 openssl s_client的输入重定向到它(或使用管道传递空输入(。这也适用于Windows,但适用于旧版本的openssl(0.9.8l(。我尝试了 0.9.8r 和 1.0.1b 并且将输入重定向到空文件无济于事。
这是我创建的一个简约程序,它连接到服务器并将其 ssl 证书打印到标准输出。希望它能帮助其他人解决类似的问题:
#ifdef WIN32
#include <windows.h>
#include <winsock2.h>
#else
#include <netinet/in.h>
#include <netinet/tcp.h>
#include <netdb.h>
#include <sys/types.h>
#include <sys/socket.h>
#endif
#include <openssl/ssl.h>
#include <cstdlib>
#include <iostream>
static const char *host= "10.23.10.12";
static int port=443;
int tcp_connect(const char *host,int port)
{
#ifdef WIN32
WSADATA wsaData;
WORD version;
int error;
version = MAKEWORD( 2, 0 );
error = WSAStartup( version, &wsaData );
/* check for error */
if ( error != 0 )
{
/* error occured */
return -1;
}
/* check for correct version */
if ( LOBYTE( wsaData.wVersion ) != 2 ||
HIBYTE( wsaData.wVersion ) != 0 )
{
/* incorrect WinSock version */
WSACleanup();
return -1;
}
/* WinSock has been initialized */
#endif
struct hostent *hp;
struct sockaddr_in addr;
int sock;
if(!(hp=gethostbyname(host)))
printf("Couldn't resolve host");
memset(&addr,0,sizeof(addr));
addr.sin_addr=*(struct in_addr*)
hp->h_addr_list[0];
addr.sin_family=AF_INET;
addr.sin_port=htons(port);
if((sock=(int)socket(AF_INET,SOCK_STREAM,
IPPROTO_TCP))<0)
printf("Couldn't create socket");
if(connect(sock,(struct sockaddr *)&addr,
sizeof(addr))<0)
printf("Couldn't connect socket");
return sock;
}
int main(int argc,char **argv)
{
SSL_CTX *ctx;
SSL *ssl;
BIO *sbio;
int sock;
SSL_METHOD *meth=NULL;
meth=SSLv23_client_method();
OpenSSL_add_ssl_algorithms();
SSL_load_error_strings();
ctx=SSL_CTX_new(meth);
/* Connect the TCP socket*/
sock=tcp_connect(host,port);
/* Connect the SSL socket */
ssl=SSL_new(ctx);
sbio=BIO_new_socket(sock,BIO_NOCLOSE);
SSL_set_bio(ssl,sbio,sbio);
if(SSL_connect(ssl)<=0)
printf("SSL connect error");
X509 *peer;
peer=SSL_get_peer_certificate(ssl);
PEM_write_X509(stdout, peer);
SSL_CTX_free(ctx);
close(sock);
#ifdef WIN32
closesocket(sock);
WSACleanup();
#else
close(sock);
#endif
exit(0);
}
代码是本文建议的此处示例的修改版本。
编辑:我一直收到错误OPENSSL_UPLINK:窗户上没有OPENSSL_APPLINK。在互联网上搜索了大量后,我找到了这篇文章并将其添加到我的代码中:
extern "C" {
#include <openssl/applink.c>
}
似乎这是一些解决方法,以避免编译器和运行时选项兼容性的要求。
- C++为构建时间获取QDateTime的可靠方法
- lambda参数转换为constexpr技巧,然后获取带链接的数组
- 如何使用 < 和 > 命令获取 c++ 中的输入和输出?
- 使用指针从C++中的数组中获取最大值
- 如何获取std::result_of函数的返回类型
- 如何在openssl-ecc中获取十六进制格式的私钥
- 使用Unreal C++获取VR耳机的世界位置/方向
- 获取日期异步信号安全吗?如果在信号处理程序中使用,它会导致死锁吗
- 从C字符串中获取奇怪的字符串长度
- 为什么我的for循环不能正确获取argv
- SSL上的`curl_easy_send`和`curl_asy_recv`:如何处理`CURLE_AGAIN`
- 从python中调用C++函数并获取返回值
- 如何获取一个数字的前3位
- 获取字符串的长度并将其分配给数组
- 如何从 boost::asio::ssl::stream<boost::asio::ip::tcp::socket> 获取本机套接字文件描述器?
- 如何在OpenSSL中获取SSL证书
- 如何从连接的 SSL 会话获取 base64 编码证书 (PEM)
- QT https SSL支持静态QT静态程序构建 - 获取“协议”https“未知”
- 使用 C++ 在窗口上获取 SSL 证书
- c++ Boost asio (OpenSSL)获取密码和TLS/SSL版本的活动连接