国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

windows openssl安裝和基本使用(代碼演示)

這篇具有很好參考價值的文章主要介紹了windows openssl安裝和基本使用(代碼演示)。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

概述

本文主要講到了openssl的基本使用方法,開發(fā)環(huán)境為windows,開發(fā)工具為VS2019.本文主要是說明openssl如何使用,不介紹任何理論知識,如果有不懂的,請自行百度。個人建議下一個everything查詢工具,真的很好用,比window自帶的查詢快了很多,可以查詢自己想要的文件

OPENSSL安裝

安裝過程網(wǎng)上有很多,OPENSSL安裝,注意你安裝的OPENSSL的版本以及位數(shù)(32位或者64位),假如我安裝的是64位的openssl,安裝目錄為D:\Program Files\OpenSSL-Win64,你可以自行選擇你的安裝目錄,安裝完成后,查看安裝的openssl版本,使用控制臺輸入openssl version即可
windows openssl安裝和基本使用(代碼演示)

秘鑰key和公鑰的生成

在控制命令行中輸入以下命令:

openssl req -x509 -newkey rsa:4096 -keyout key.pem -out cert.pem -sha256 -days 365

網(wǎng)上有很多生成秘鑰和公鑰的文章,不過都沒成功,最后在stackoverflow找到了可以用的方法,原文地址為:openssl秘鑰和公鑰的生成,以下是截圖
windows openssl安裝和基本使用(代碼演示)
Enter PEM pass phrase:提示輸入pem文件的密碼,注意,后面要用到這個密碼,可以使用自己常用的密碼,輸入后會再次確認密碼,然后就是一些基本信息,可以默認為空。截圖如下,基本上這時候就得到了秘鑰key.pem和公鑰cert.pem,后面要用到這2個文件。,生成的位置為當前目錄,比如我的就是在C:\Users\86138,即控制臺的顯示目錄
windows openssl安裝和基本使用(代碼演示)

項目設置

使用VS創(chuàng)建一個控制臺項目,創(chuàng)建一個客戶端和服務器項目,由于我下載的是64位,openssl3.0版本。因此我項目也是64位的。
windows openssl安裝和基本使用(代碼演示)
項目的配置,服務器端和客戶端都是相同配置,這里我就只說一個即可,主要是設置openssl的lib和頭文件的路徑,這和使用任外部庫都是一樣的。截圖如下,注意我的openssl安裝位置為D:\Program Files\OpenSSL-Win64,請選擇你安裝位置即可。
windows openssl安裝和基本使用(代碼演示)
預處理器里添加2個定義:CRT_SECURE_NO_WARNINGS;_WINSOCK_DEPRECATED_NO_WARNINGS;
windows openssl安裝和基本使用(代碼演示)
附加依賴項:libssl.lib;openssl.lib;libcrypto.lib;liblegacy.lib;
windows openssl安裝和基本使用(代碼演示)
最后將前面生成的cert.pem和key.pem放到exe目錄下,為什么放到這個目錄,是因為下面的代碼用到的這2個文件是當前目錄,不管怎么樣,只要能找到這2個文件即可。
windows openssl安裝和基本使用(代碼演示)
配置很簡單,就上面幾步,基本上就可以了。

代碼部分

客戶端代碼

#include <stdio.h>
#include <errno.h>
#include <malloc.h>
#include <string.h>
# include <winsock2.h>
#include <ws2tcpip.h>
#include <openssl/ssl.h>
#include <openssl/err.h>

#define FAIL    -1
#pragma comment(lib, "Ws2_32.lib")
//Added the LoadCertificates how in the server-side makes.    
int OpenConnection(const char* hostname, int port)
{
	SOCKET sd;
	struct hostent* host;
	struct sockaddr_in addr;

	WORD wVersionRequested;
	WSADATA wsaData;
	int err;

	/* Use the MAKEWORD(lowbyte, highbyte) macro declared in Windef.h */
	wVersionRequested = MAKEWORD(2, 2);

	err = WSAStartup(wVersionRequested, &wsaData);
	if (err != 0)
	{
		/* Tell the user that we could not find a usable */
		/* Winsock DLL.                                  */
		printf("WSAStartup failed with error: %d\n", err);
		return 1;
	}

	sd = socket(PF_INET, SOCK_STREAM, 0);
	/bzero(&addr, sizeof(addr));
	addr.sin_family = AF_INET;
	addr.sin_port = htons(port);
	addr.sin_addr.s_addr = inet_addr(hostname);
	int ret = connect(sd, (struct sockaddr*)&addr, sizeof(addr));
	if ( ret != 0)
	{
		//close(sd);
		perror(hostname);
		abort();
	}
	return sd;
}

SSL_CTX* InitCTX(void)
{
	//SSL_METHOD* method;
	SSL_CTX* ctx;

	//OpenSSL_add_all_algorithms();  /* Load cryptos, et.al. */
	SSL_load_error_strings();   /* Bring in and register error messages */
	SSL_METHOD const* meth = SSLv23_client_method();  /* Create new client-method instance */
	//method = TLSv1_method();
	ctx = SSL_CTX_new(meth);   /* Create new context */
	if (ctx == NULL)
	{
		ERR_print_errors_fp(stderr);
		printf("Eroor: %s\n", stderr);
		abort();
	}
	return ctx;
}

void ShowCerts(SSL* ssl)
{
	X509* cert;
	char* line1, * line2;

	cert = SSL_get_peer_certificate(ssl); /* get the server's certificate */
	if (cert != NULL)
	{
		printf("Server certificates:\n");
		line1 = X509_NAME_oneline(X509_get_subject_name(cert), 0, 0);
		printf("Subject: %s\n", line1);
		//free(line);       /* free the malloc'ed string */
		line2 = X509_NAME_oneline(X509_get_issuer_name(cert), 0, 0);
		printf("Issuer: %s\n", line2);
		//free(line);       /* free the malloc'ed string */
		//X509_free(cert);     /* free the malloc'ed certificate copy */
	}
	else
		printf("No certificates.\n");
}

int main(int count, char* strings[])
{
	SSL_CTX* ctx;
	SOCKET server;
	SSL* ssl;
	char buf[1024];
	int bytes;
	char const *hostname, *portnum;

	SSL_library_init();
	hostname = "127.0.0.1";
	portnum = "1030";

	ctx = InitCTX();
	server = OpenConnection(hostname, atoi(portnum));
	ssl = SSL_new(ctx);      /* create new SSL connection state */
	//SSL_set_fd(ssl, server);    /* attach the socket descriptor */
	BIO* bio = BIO_new_socket(server, BIO_NOCLOSE);
	SSL_set_bio(ssl, bio, bio);
	SSL_set_connect_state(ssl);
	if (SSL_connect(ssl) == FAIL)   /* perform the connection */
	{
		printf("Eroor: %s\n", stderr);
		ERR_print_errors_fp(stderr);
	}
	else
	{
		printf("Connected with %s encryption\n", SSL_get_cipher(ssl));
		ShowCerts(ssl);  /* get any certs */
		while (1)
		{
			char p[100];
			printf("please input sned msg: ");
			gets(p);
			printf("strlen:%d,%s\n", strlen(p), p);
			SSL_write(ssl, p, strlen(p));   /* encrypt & send message */
			bytes = SSL_read(ssl, buf, sizeof(buf)); /* get reply & decrypt */
			if (bytes >= 0)
			{
				buf[bytes] = '\0';
				printf("Received: \"%s\"\n", buf);
			}
			else 
			{
				SSL_ERROR_WANT_READ;
				int error = SSL_get_error(ssl, bytes);
				printf("error:%d\n", error);
				break;
			}
			
		}
		SSL_shutdown(ssl);
		SSL_free(ssl);        /* release connection state */
	}

	SSL_CTX_free(ctx);        /* release context */
	getchar();
	return 0;
}

服務器端代碼

#include <errno.h>
#include <malloc.h>
#include <string.h>
# include <winsock2.h>
# include <ws2tcpip.h>
#include "openssl/ssl.h"
#include "openssl/err.h"

#ifdef  __cplusplus
extern "C" {
#endif
#include "openssl/applink.c"
#ifdef  __cplusplus
}
#endif

#define FAIL    -1
#pragma comment(lib, "Ws2_32.lib")

int OpenListener(WORD port)
{
	SOCKET  m_socket;

	WORD wVersionRequested;
	WSADATA wsaData;
	int err;

	/* Use the MAKEWORD(lowbyte, highbyte) macro declared in Windef.h */
	wVersionRequested = MAKEWORD(2, 2);

	err = WSAStartup(wVersionRequested, &wsaData);
	if (err != 0) {
		/* Tell the user that we could not find a usable */
		/* Winsock DLL.                                  */
		printf("WSAStartup failed with error: %d\n", err);
		return 1;
	}

	m_socket = socket(AF_INET, SOCK_STREAM, 0);

	if (m_socket == INVALID_SOCKET)
	{
		printf("Error at socket(): %ld\n", WSAGetLastError());
		WSACleanup();
		return 0;
	}
	struct sockaddr_in sain;
	//bzero(&addr, sizeof(addr));
	sain.sin_family = AF_INET;
	sain.sin_port = htons(port);
	sain.sin_addr.s_addr = inet_addr("127.0.0.1");
	if (bind(m_socket, (struct sockaddr*)&sain, sizeof(struct sockaddr_in)) == SOCKET_ERROR)
	{
		perror("can't bind port");
		//abort();
	}
	if (listen(m_socket, 10) != 0)
	{
		perror("Can't configure listening port");
		//abort();
	}
	return m_socket;
}

SSL_CTX* InitServerCTX(void)
{
	SSL_CTX* ctx = NULL;

#if OPENSSL_VERSION_NUMBER >= 0x10000000L
	const SSL_METHOD* method;
#else
	SSL_METHOD* method;
#endif

	SSL_library_init();
	//OpenSSL_add_all_algorithms();  /* load & register all cryptos, etc. */
	SSL_load_error_strings();   /* load all error messages */
	//method = SSLv23_method(); /* create new server-method instance */
	method = SSLv23_server_method();
	ctx = SSL_CTX_new(method);   /* create new context from method */
	if (ctx == NULL)
	{
		ERR_print_errors_fp(stderr);
		abort();
	}
	return ctx;
}

void LoadCertificates(SSL_CTX* ctx, char* CertFile, char* KeyFile)
{
	//New lines
	int ret = SSL_CTX_load_verify_locations(ctx, CertFile, KeyFile);
	if (ret != 1)
		ERR_print_errors_fp(stderr);

	if (SSL_CTX_set_default_verify_paths(ctx) != 1)
		ERR_print_errors_fp(stderr);
	//End new lines
	/* set the local certificate from CertFile */
	if (SSL_CTX_use_certificate_file(ctx, CertFile, SSL_FILETYPE_PEM) <= 0)
	{
		ERR_print_errors_fp(stderr);
		//abort();
	}
	/* set the private key from KeyFile (may be the same as CertFile) */
	if (SSL_CTX_use_PrivateKey_file(ctx, KeyFile, SSL_FILETYPE_PEM) <= 0)
	{
		ERR_print_errors_fp(stderr);
		abort();
	}
	/* verify private key */
	if (!SSL_CTX_check_private_key(ctx))
	{
		fprintf(stderr, "Private key does not match the public certificate\n");
		abort();
	}
	printf("LoadCertificates success\n");
}

void ShowCerts(SSL* ssl)
{
	X509* cert;
	char* line;

	cert = SSL_get_peer_certificate(ssl); /* Get certificates (if available) */
	if (cert != NULL)
	{
		printf("Server certificates:\n");
		line = X509_NAME_oneline(X509_get_subject_name(cert), 0, 0);
		printf("Subject: %s\n", line);
		free(line);
		line = X509_NAME_oneline(X509_get_issuer_name(cert), 0, 0);
		printf("Issuer: %s\n", line);
		free(line);
		X509_free(cert);
	}
	else
		printf("No certificates.\n");
}

void Servlet(SSL* ssl, SOCKET client) /* Serve the connection -- threadable */
{
	char buf[1024];
	char reply[1024];
	int sd, bytes;
	const char* HTMLecho = "hello client";

	ShowCerts(ssl);        /* get any certificates */
	int ret = SSL_accept(ssl);	
	while (1)
	{
		//bytes = recv(client, buf, sizeof(buf), 0);
		bytes = SSL_read(ssl, buf, sizeof(buf)); 
		if (bytes > 0)
		{
			buf[bytes] = '\0';
			printf("Client msg: %s\n", buf);
			sprintf(reply, HTMLecho, buf);   /* construct reply */
			SSL_write(ssl, reply, strlen(reply)); /* send reply */
		}
		else //其他情況
		{
			//printf("read byte < 0\n");
		}
	}
	SSL_shutdown(ssl);
	SSL_free(ssl);
}

int main(int count, char* strings[])
{
	SSL_CTX* ctx;
	SOCKET server;
	char* portnum;
	server = OpenListener(1030);    /* create server socket */

	SSL_library_init();

	portnum = strings[1];
	ctx = InitServerCTX();        /* initialize SSL */
	LoadCertificates(ctx, (char *)"cert.pem", (char *)"key.pem");  /* load certs */

	while (1)
	{
		struct sockaddr_in addr;
		socklen_t len = sizeof(addr);
		SSL* ssl;

		SOCKET client = accept(server, (struct sockaddr*)&addr, &len);  /* accept connection   as usual */

		socklen_t len1;
		struct sockaddr_storage addr1;
		//add1.sin_family = AF_INET;
		char ipstr[INET6_ADDRSTRLEN];
		int port;

		len1 = sizeof addr;
		int r;

		r = getpeername(client, (struct sockaddr*)&addr1, &len1);

		// deal with both IPv4 and IPv6:
		if (addr1.ss_family == AF_INET)
		{
			struct sockaddr_in* s = (struct sockaddr_in*)&addr1;
			port = ntohs(s->sin_port);
			inet_ntop(AF_INET, &s->sin_addr, ipstr, sizeof ipstr);
		}
		else
		{ // AF_INET6
			struct sockaddr_in6* s = (struct sockaddr_in6*)&addr1;
			port = ntohs(s->sin6_port);
			inet_ntop(AF_INET6, &s->sin6_addr, ipstr, sizeof ipstr);
		}

		printf("Peer IP address: %s,port:%d\n", ipstr,port);
		ssl = SSL_new(ctx);              /* get new SSL state with context */
		//SSL_set_fd(ssl, client);      /* set connection socket to SSL state */
		BIO* bio = BIO_new_socket(client, BIO_NOCLOSE);
		SSL_set_bio(ssl, bio, bio);

		Servlet(ssl, client);         /* service connection */
	}
	SSL_CTX_free(ctx);         /* release context */
}

總結(jié)

可能遇到的問題
1.要確保代碼中applink.c文件的存在,否則服務器端代碼會提示Unlink的錯誤
2.服務器端代碼要求輸入密碼,請使用生成秘鑰時的密碼文章來源地址http://www.zghlxwxcb.cn/news/detail-405764.html

到了這里,關(guān)于windows openssl安裝和基本使用(代碼演示)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權(quán),不承擔相關(guān)法律責任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務器費用

相關(guān)文章

  • ROS-參數(shù)服務器(python)方向的基本實現(xiàn)流程及代碼演示

    ROS-參數(shù)服務器(python)方向的基本實現(xiàn)流程及代碼演示

    首先是創(chuàng)造工作空間等等這里就不再贅述,下文使用的工作空間叫 ilove02_01_ws;功能包名字叫做:ilovezero2。 參數(shù)服務器的一套簡單流程就是圍繞:增刪改查;這四個字組成的。 其中由增改這兩個字組成一個主體文件,后面就叫它為 set文件。實行查與刪功能的文件后面我就分

    2024年01月21日
    瀏覽(20)
  • windows如果快速安裝OpenSSL(懶人安裝)

    windows如果快速安裝OpenSSL(懶人安裝)

    ?OpenSSL是一個功能豐富且自包含的開源安全工具箱,提供一系列的開發(fā)組件,提供出來的API可供使用。應用程序可以使用這個包來進行安全通信,避免竊聽,同時確認另一端連接者的身份。這個包廣泛被應用在互聯(lián)網(wǎng)的網(wǎng)頁服務器上。 1. Openssl環(huán)境安裝 下載地址:Win32/Win64

    2024年02月13日
    瀏覽(20)
  • Windows 安裝 OpenSSL 生成自簽名證書

    Windows 安裝 OpenSSL 生成自簽名證書

    下載openssl.exe:適用于 Windows 的 Win32/Win64 OpenSSL 安裝程序 Win64 OpenSSL v1.1.1i Light,安裝Win64 OpenSSL v1.1.1i最常用的軟件包 Win64 OpenSSL v1.1.1i,安裝Win64 OpenSSL v1.1.1i完整軟件包 Win32 OpenSSL v1.1.1i Light,安裝Win32 OpenSSL v1.1.1i最常用的軟件包 Win32 OpenSSL v1.1.1i,安裝Win32 OpenSSL v1.1.1i完整軟件

    2024年01月25日
    瀏覽(17)
  • 如何在windows上安裝Openssl環(huán)境

    如何在windows上安裝Openssl環(huán)境

    首先在鏈接下載openssl安裝版 openssl windows 我選擇的是肥一點的版本 然后就是按向?qū)Р襟E安裝。 安裝完后,首先要先設置下環(huán)境變量 我安裝的路徑是 接下來,我以我的windows11為例說明, 在任務欄開始菜單圖標上右鍵【系統(tǒng)】-【高級系統(tǒng)設置】-【環(huán)境變量】-【系統(tǒng)變量】中

    2024年02月10日
    瀏覽(19)
  • windows系統(tǒng)下git的安裝以及基本命令的使用

    windows系統(tǒng)下git的安裝以及基本命令的使用

    windows系統(tǒng)下git的安裝過程 使用Git Bash即LInux操作方式使用git 設置用戶名:以當前用戶為例 設置郵箱 用戶名及郵箱為基本配置 可以在以下路徑查看到配置文件 查看配置文件:git config --list 此時可以看到我們配置的用戶名及郵箱 案例:創(chuàng)建一個git項目 步驟1 :創(chuàng)建一個項目文

    2024年02月08日
    瀏覽(21)
  • Windows系統(tǒng)中數(shù)據(jù)標注軟件LabelImg的安裝和基本使用

    Windows系統(tǒng)中數(shù)據(jù)標注軟件LabelImg的安裝和基本使用

    LabelImg是國立臺灣大學(National Taiwan University)的Tzuta Lin主導完成,并基于免費軟件許可 MIT LICENSE 發(fā)布在github上的一款計算機視覺(Computer Vision,CV)中 目標檢測數(shù)據(jù)集 的標注軟件,它不僅輕量化且使用簡單。雖然現(xiàn)在Tzuta Lin等人已經(jīng)不在積極維護LabelImg,并且LabelImg也已經(jīng)成

    2024年02月16日
    瀏覽(18)
  • windows安裝新openssl后依然顯示舊版本

    windows安裝新openssl后依然顯示舊版本

    1、Windows環(huán)境下安裝升級新版本openssl后,通過指令openssl version -a查看版本號:如下 這個版本號還是是以前的老版本,看來得把原先的老版本刪除掉才可以生效,但是不知道在哪里。 2、網(wǎng)上找了老半天也沒找到答案,最后通過指令 ????????where openssl 才找到原來的openssl在

    2024年02月11日
    瀏覽(17)
  • windows下安裝openssl,配置VS(visual studio)

    windows下安裝openssl,配置VS(visual studio)

    百度網(wǎng)盤連接: 鏈接:https://pan.baidu.com/s/1sZapr2mKmuvzG76Ra7yiTg? 提取碼:2l4l? 注意: vs項目為win32項目則安裝win32的 vs項目為x64項目則安裝win64的 根據(jù)安裝向?qū)нx擇路徑進行安裝 ①同意 ?②自行選擇安裝路徑 ③ 選擇動態(tài)庫路徑在安裝目錄下 ④選擇安裝即可 創(chuàng)建桌面向?qū)Э枕椖?/p>

    2024年02月03日
    瀏覽(24)
  • 初識Redis——Redis概述、安裝、基本操作

    初識Redis——Redis概述、安裝、基本操作

    目錄 一、NoSQL介紹 1.1什么是NoSQL 1.2為什么會出現(xiàn)NoSQL技術(shù) 1.3NoSQL的類別 1.4傳統(tǒng)的ACID是什么 1.5?CAP 1.5.1?經(jīng)典CAP圖 1.5.4 什么是BASE 二、Redis概述 2.1?什么是Redis 2.2 Redis能干什么 2.3 Redis的特點 2.4 Redis與memcached對比 2.5?Redis的安裝 2.6?Docker安裝 三、 基本操作 3.1.1 set 3.1.2set操作的選

    2024年02月16日
    瀏覽(21)
  • 跨平臺指南:在 Windows 和 Linux 上安裝 OpenSSL 的完整流程

    跨平臺指南:在 Windows 和 Linux 上安裝 OpenSSL 的完整流程

    一:找到安裝包,雙擊即可 https://gitee.com/wake-up-again/installation-package.git 二:按照提示,一步一步來,就可以啦 三:此界面意思是,是否想向創(chuàng)作者捐款,自己視情況而定啦。 四:安裝完畢之后,接下來就是VS下的環(huán)境配置了。 在VS下創(chuàng)建一個新項目,點到屬性界面 五:找到

    2024年04月23日
    瀏覽(24)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包