簡體   English   中英

使用C ++在Windows上獲取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上的timeout參數。 所以我試圖找到一種方法在一段時間后殺死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:在Windows上沒有OPENSSL_APPLINK。 在互聯網上進行了大量搜索之后,我找到了這篇文章並將其添加到我的代碼中:

extern "C" {
   #include <openssl/applink.c>
}

似乎這是一些解決方法,以避免編譯器和運行時選項兼容性的要求。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM