windows openssl安装和基本使用(代码演示)

这篇具有很好参考价值的文章主要介绍了windows openssl安装和基本使用(代码演示)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

概述

本文主要讲到了openssl的基本使用方法,开发环境为windows,开发工具为VS2019.本文主要是说明openssl如何使用,不介绍任何理论知识,如果有不懂的,请自行百度。个人建议下一个everything查询工具,真的很好用,比window自带的查询快了很多,可以查询自己想要的文件

OPENSSL安装

安装过程网上有很多,OPENSSL安装,注意你安装的OPENSSL的版本以及位数(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

网上有很多生成秘钥和公钥的文章,不过都没成功,最后在stackoverflow找到了可以用的方法,原文地址为:openssl秘钥和公钥的生成,以下是截图
windows openssl安装和基本使用(代码演示)
Enter PEM pass phrase:提示输入pem文件的密码,注意,后面要用到这个密码,可以使用自己常用的密码,输入后会再次确认密码,然后就是一些基本信息,可以默认为空。截图如下,基本上这时候就得到了秘钥key.pem和公钥cert.pem,后面要用到这2个文件。,生成的位置为当前目录,比如我的就是在C:\Users\86138,即控制台的显示目录
windows openssl安装和基本使用(代码演示)

项目设置

使用VS创建一个控制台项目,创建一个客户端和服务器项目,由于我下载的是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 */
}

总结

可能遇到的问题
1.要确保代码中applink.c文件的存在,否则服务器端代码会提示Unlink的错误
2.服务器端代码要求输入密码,请使用生成秘钥时的密码文章来源地址https://www.toymoban.com/news/detail-405764.html

到了这里,关于windows openssl安装和基本使用(代码演示)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • ROS-参数服务器(python)方向的基本实现流程及代码演示

    首先是创造工作空间等等这里就不再赘述,下文使用的工作空间叫 ilove02_01_ws;功能包名字叫做:ilovezero2。 参数服务器的一套简单流程就是围绕:增删改查;这四个字组成的。 其中由增改这两个字组成一个主体文件,后面就叫它为 set文件。实行查与删功能的文件后面我就分

    2024年01月21日
    浏览(33)
  • windows如果快速安装OpenSSL(懒人安装)

    ​OpenSSL是一个功能丰富且自包含的开源安全工具箱,提供一系列的开发组件,提供出来的API可供使用。应用程序可以使用这个包来进行安全通信,避免窃听,同时确认另一端连接者的身份。这个包广泛被应用在互联网的网页服务器上。 1. Openssl环境安装 下载地址:Win32/Win64

    2024年02月13日
    浏览(27)
  • 如何在windows上安装Openssl环境

    首先在链接下载openssl安装版 openssl windows 我选择的是肥一点的版本 然后就是按向导步骤安装。 安装完后,首先要先设置下环境变量 我安装的路径是 接下来,我以我的windows11为例说明, 在任务栏开始菜单图标上右键【系统】-【高级系统设置】-【环境变量】-【系统变量】中

    2024年02月10日
    浏览(25)
  • 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日
    浏览(26)
  • windows系统下git的安装以及基本命令的使用

    windows系统下git的安装过程 使用Git Bash即LInux操作方式使用git 设置用户名:以当前用户为例 设置邮箱 用户名及邮箱为基本配置 可以在以下路径查看到配置文件 查看配置文件:git config --list 此时可以看到我们配置的用户名及邮箱 案例:创建一个git项目 步骤1 :创建一个项目文

    2024年02月08日
    浏览(31)
  • Windows系统中数据标注软件LabelImg的安装和基本使用

    LabelImg是国立台湾大学(National Taiwan University)的Tzuta Lin主导完成,并基于免费软件许可 MIT LICENSE 发布在github上的一款计算机视觉(Computer Vision,CV)中 目标检测数据集 的标注软件,它不仅轻量化且使用简单。虽然现在Tzuta Lin等人已经不在积极维护LabelImg,并且LabelImg也已经成

    2024年02月16日
    浏览(36)
  • windows安装新openssl后依然显示旧版本

    1、Windows环境下安装升级新版本openssl后,通过指令openssl version -a查看版本号:如下 这个版本号还是是以前的老版本,看来得把原先的老版本删除掉才可以生效,但是不知道在哪里。 2、网上找了老半天也没找到答案,最后通过指令         where openssl 才找到原来的openssl在

    2024年02月11日
    浏览(29)
  • windows下安装openssl,配置VS(visual studio)

    百度网盘连接: 链接:https://pan.baidu.com/s/1sZapr2mKmuvzG76Ra7yiTg  提取码:2l4l  注意: vs项目为win32项目则安装win32的 vs项目为x64项目则安装win64的 根据安装向导选择路径进行安装 ①同意  ②自行选择安装路径 ③ 选择动态库路径在安装目录下 ④选择安装即可 创建桌面向导空项目

    2024年02月03日
    浏览(32)
  • 初识Redis——Redis概述、安装、基本操作

    目录 一、NoSQL介绍 1.1什么是NoSQL 1.2为什么会出现NoSQL技术 1.3NoSQL的类别 1.4传统的ACID是什么 1.5 CAP 1.5.1 经典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日
    浏览(30)
  • 跨平台指南:在 Windows 和 Linux 上安装 OpenSSL 的完整流程

    一:找到安装包,双击即可 https://gitee.com/wake-up-again/installation-package.git 二:按照提示,一步一步来,就可以啦 三:此界面意思是,是否想向创作者捐款,自己视情况而定啦。 四:安装完毕之后,接下来就是VS下的环境配置了。 在VS下创建一个新项目,点到属性界面 五:找到

    2024年04月23日
    浏览(29)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包