我正试图获得Windows上的远程服务器的SSL证书。 我发现的一个select是使用openssl。 互联网上的一些post显示的命令是:
openssl.exe s_client -showcerts -connect {REMOTE_SERVER_IP}:{REMOTE_SERVER_PORT}
这完美的工作,但我的问题是,上述命令超时300秒。 证书本身的打印速度非常快,当我在最初的几秒内获得所有我想要的时间时,我没有理由等待300秒。 仍然我认为没有办法改变s_client上的超时参数。 所以我试着想办法在一段时间后在窗户上杀死一个进程,但又没有运气。 任何想法如何做到这一点? 如果有一些其他窗口的方式来获得远程服务器SSL证书,并将其存储在一个文件中,这也将做这项工作。
编辑:根据布鲁诺的要求添加更多的信息。 我正在尝试创build一个获取远程服务器的SSL证书的c ++应用程序,并将其存储在文件中以供进一步处理。 由于我的应用程序已经使用openssl.exe,我需要一个使用openssl.exe或标准的Windows命令(即不需要任何额外的库)的解决scheme。
编辑2:我find了一种方法来避免在linux等待 – 只是创build一个空的文件,并redirect到它的openssl s_client的input(或使用pipe道传递空input)。 这在Windows上工作,但与旧版本的openssl(0.9.8l)。 我用0.9.8r和1.0.1b试了一下,把inputredirect到一个空文件没有帮助。
这是我创建的一个简单程序,它连接到服务器并将其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:在Windows上没有OPENSSL_APPLINK。 经过大量的互联网搜索后 ,我发现这个职位,并添加到我的代码:
extern "C" { #include <openssl/applink.c> }
看来这是一些工作,以避免编译器和运行时选项兼容性的要求。