Redis 7.0.X 在Windows下编译支持TLS连接,遇坑埋坑

图片

微信公众号:数据库杂记   个人微信: iiihero
我是iihero. 也可以叫我Sean.
iihero@CSDN(https://blog.csdn.net/iihero) 
Sean@墨天轮 (https://www.modb.pro/u/16258)
数据库领域的资深爱好者一枚。
水木早期数据库论坛发起人 db2@smth,早期多年水木论坛数据库版版主。
国内最早一批DB2 DBA。前后对Sybase ASE及SQLAnywhere, PostgreSQL, 
HANA, Oracle, DB2, SQLite均有涉猎。曾长期担任CSDN相关数据库版版主。
SAP数据库技术专家与开发架构师,PostgreSQL ACE.
代表作有:<<Java2网络协议内幕>> <<Oracle Spatial及OCI高级编程>> 
<<Sybase ASE 15.X全程实践>>
兴趣领域:数据库技术及云计算、GenAI

业余专长爱好:中国武术六段 陈式太极拳第13代传人(北京陈式太极拳第5代传人)
职业太极拳教练,兼任北京陈式太极拳研究会副秘书长。
如果想通过习练陈式太极拳强身健体,也可以与我联系。

前言

Redis在版本6以及以后,基于安全的需要,就开始支持TLS连接了。基于Windows版本的维护,在网上以前有两个库,一个是微软维护的,维护到3.x之后就变成archive了,见后边的参考链接。另一个库也只维护到5.x。还没有一个windows版本维护到6及以上的版本。

如果仔细推敲其原因,可能还是在windows平台上用的不多吧。简单的非TLS的在windows上跑跑也不差不多了。

那到底有没有可能编译出一份支持TLS的windows版本呢?回想起很久以前使用msys+mingw来编译PostgreSQL的经历,感觉隐约可行。只是可能一样会遇到一些坑。

环境准备

1、从https://www.msys2.org 下载一份,默认安装到本机。经是基础环境。

2、从msys64的msys2_shell.cmd进入,也就是说,进入的是msys2的shell,而不是mingw64的shell。后者经过实践证明,不适用于Redis的编译。(这是第一个大坑)

在 MSYS2 中,你可以使用 pacman 包管理器来安装软件包。但是,你可能不会找到名为 libssl-dev 或 openssl-dev 的包,因为这些通常是在 Debian 或 Ubuntu 系统中的包名。在 MSYS2 或其他使用 Pacman 的系统中,你可能需要安装 openssl 和 openssl-devel

你可以使用以下命令来安装:

pacman -S openssl
pacman -S openssl-devel

请注意,这些包可能已经被包含在你的系统中,或者可能有不同的名称。如果你无法找到正确的包,你可能需要搜索它们:

pacman -Ss openssl

这将显示所有与 openssl 相关的包,你可以从中找到你需要的包。msys64下边, 如果通过pacman 安装libssl-dev和openssl-dev

pacman的相关帮助。
$ pacman --help
usage:  pacman <operation> [...]
operations:
    pacman {-h --help}
    pacman {-V --version}
    pacman {-D --database} <options> <package(s)>
    pacman {-F --files}    [options] [file(s)]
    pacman {-Q --query}    [options] [package(s)]
    pacman {-R --remove}   [options] <package(s)>
    pacman {-S --sync}     [options] [package(s)]
    pacman {-T --deptest}  [options] [package(s)]
    pacman {-U --upgrade}  [options] <file(s)>

use 'pacman {-h --help}' with an operation for available options

基于上边这些,做一些更新:

pacman -Syu
pacman -Sy gcc make pkg-config
pacman -S openssl-devel

实作与分析:

下载源码:https://github.com/redis/redis/archive/refs/tags/7.0.12.tar.gz

解压到/c/3rdparty/redis

make distclean
cd deps
make PREFIX=/c/tools/redis BUILD_TLS=yes hdr_histogram  hiredis linenoise  lua

cd ../
make PREFIX=/c/tools/redis install  BUILD_TLS=yes

会发现编译不过(第二大坑)

解决这个坑的方法是:(参考链接里头也有相关介绍)

找到文件:msys64\usr\include\dlfcn.h

line: 49 ~ 61,修改如下:(即把第49和61行注释掉)
// #if __GNU_VISIBLE
typedef struct Dl_info Dl_info;

struct Dl_info
{
   char        dli_fname[PATH_MAX];  /* Filename of defining object */
   void       *dli_fbase;            /* Load address of that object */
   const char *dli_sname;            /* Name of nearest lower symbol */
   void       *dli_saddr;            /* Exact value of nearest symbol */
};

extern int dladdr (const void *addr, Dl_info *info);
// #endif

这样就能顺利编译完成。最后打包:

最后安装到/c/tools/redis

打包时,要加入这三个文件:
2023-07-15  12:50 AM         2,982,622 msys-2.0.dll
2023-06-01  07:17 AM         4,523,484 msys-crypto-3.dll
2023-06-01  07:17 AM           610,496 msys-ssl-3.dll
它们来自目录:C:\tools\msys64\usr\bin
还有两个配置文件,来自源文件目录。
最后的结构如下:

c:\tools\redis\bin>dir
 Volume in drive C is OSDisk
 Volume Serial Number is 6E46-ACF4

 Directory of c:\tools\redis\bin

2023-07-30  07:00 PM    <DIR>          .
2023-07-30  07:00 PM    <DIR>          ..
2023-07-30  12:06 PM               101 dump.rdb
2023-07-15  12:50 AM         2,982,622 msys-2.0.dll
2023-06-01  07:17 AM         4,523,484 msys-crypto-3.dll
2023-06-01  07:17 AM           610,496 msys-ssl-3.dll
2023-07-30  04:19 PM           997,529 redis-benchmark.exe
2023-07-30  04:19 PM         7,883,673 redis-check-aof
2023-07-30  04:19 PM         7,883,673 redis-check-rdb
2023-07-30  04:19 PM         1,155,751 redis-cli.exe
2023-07-30  04:19 PM         7,883,673 redis-sentinel
2023-07-30  04:19 PM         7,883,673 redis-server.exe
2023-07-10  07:39 PM           106,545 redis.conf
2023-07-10  07:39 PM            14,005 sentinel.conf

拿一个真实的环境初步尝试:

c:\tools>cf ssh aaaaaaa -L 1381:clusteaaaaaaaaaaaaaaawxxxxxxxxxxxxx:1381 -T -N

c:\tools\redis\bin>redis-cli -c -p 1381 -a jRxxxxxxxxxxxxxxxnhWy --tls --no-auth-warning
Could not connect to Redis at 127.0.0.1:1381: SSL_connect failed: No error
not connected> quit

会一直报这个错:SSL_connect failed: No error。
这是遇到的第三个坑。

用它作为普通的Redis client使用还是可以的。

实际上,主要是因为用的是Windows自带的shell (DOS)窗口运行上述命令。这样是不行的。必须还得使用msys2_shell.cmd来启动它的shell再执行上述命令。

Redis TLS连接测试

参考文档: https://zhuanlan.zhihu.com/p/145972315

也可以直接参照文档:https://redis.io/docs/management/security/encryption/

https://cloud.tencent.com/developer/article/1839188

启动msys2_shell.cmd,然后:

1. 运行./utils/gen-test-certs.sh生成根CA证书和服务器证书。
2. 运行./runtest --tls或./runtest-cluster --tls,以TLS模式运行Redis和Redis集群测试。

手动运行:

2. 启动Server.
./src/redis-server --tls-port 6379 --port 0 \
--tls-cert-file ./tests/tls/redis.crt \
--tls-key-file ./tests/tls/redis.key \
--tls-ca-cert-file ./tests/tls/ca.crt
启动是成功的:
4970:C 30 Jul 2023 19:16:49.821 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
4970:C 30 Jul 2023 19:16:49.821 # Redis version=7.0.12, bits=64, commit=00000000, modified=0, pid=4970, just started
4970:C 30 Jul 2023 19:16:49.821 # Configuration loaded
4970:M 30 Jul 2023 19:16:49.841 # You requested maxclients of 10000 requiring at least 10032 max file descriptors.
4970:M 30 Jul 2023 19:16:49.841 # Server can't set maximum open files to 10032 because of OS error: Operation not permitted.
4970:M 30 Jul 2023 19:16:49.841 # Current maximum open files is 3200. maxclients has been reduced to 3168 to compensate for low ulimit. If you need higher maxclients increase 'ulimit -n'.
4970:M 30 Jul 2023 19:16:49.841 * monotonic clock: POSIX clock_gettime
                _._
           _.-``__ ''-._
      _.-``    `.  `_.  ''-._           Redis 7.0.12 (00000000/0) 64 bit
  .-`` .-```.  ```\/    _.,_ ''-._
 (    '      ,       .-`  | `,    )     Running in standalone mode
 |`-._`-...-` __...-.``-._|'` _.-'|     Port: 6379
 |    `-._   `._    /     _.-'    |     PID: 4970
  `-._    `-._  `-./  _.-'    _.-'
 |`-._`-._    `-.__.-'    _.-'_.-'|
 |    `-._`-._        _.-'_.-'    |           https://redis.io
  `-._    `-._`-.__.-'_.-'    _.-'
 |`-._`-._    `-.__.-'    _.-'_.-'|
 |    `-._`-._        _.-'_.-'    |
  `-._    `-._`-.__.-'_.-'    _.-'
      `-._    `-.__.-'    _.-'
          `-._        _.-'
              `-.__.-'

4970:M 30 Jul 2023 19:16:49.868 # Server initialized
4970:M 30 Jul 2023 19:16:49.870 * Ready to accept connections
4970:M 30 Jul 2023 19:18:03.523 # Error accepting a client connection: error:0A00010B:SSL routines::wrong version number (conn: fd=8)
4970:M 30 Jul 2023 19:18:18.781 # Error accepting a client connection: error:0A00010B:SSL routines::wrong version number


使用redis-cli连接到此Redis服务器:
./src/redis-cli –tls --cert ./tests/tls/redis.crt --key ./tests/tls/redis.key \
--cacert ./tests/tls/ca.crt

MSYS /c/tools/3rdpart/redis/redis-7.0.12

再试一下:
./src/redis-cli --tls \
    --cert ./tests/tls/redis.crt \
    --key ./tests/tls/redis.key \
    --cacert ./tests/tls/ca.crt
127.0.0.1:6379>    

--  这下终于成功了 --

当然也可以使用额外的参数:-tls-ciphers 来指定允许的TLS协议。
$ ./src/redis-cli --tls --cert ./tests/tls/redis.crt --key ./tests/tls/redis.key \
--cacert ./tests/tls/ca.crt --tls-ciphers TLSv1.2:TLSv1.1:TLSv1.0:SSLV3:SSLv2
(ssl2/ssl3/tls1.0/tls1.1/tls1.2)

小结:

使用msys2的shell cmd,更新必要的库,是可以完成Redis带TLS的完整编译的,并且最终也能使用。这些用于平时的Windows上的开发测试环境,还是可以的,尤其是需要支持TLS的情况下。

不过,有一个依赖关系,打包时,最好将这三个文件一起打包。

msys-2.0.dll
msys-crypto-3.dll
msys-ssl-3.dll

另外,还需要一个https://www.msys2.org  上下载安装的最小msys2运行时,在那个运行时环境里头才能正常运行Redis with TLS。

相关参考资料:

使用 Redis 源码编译发布 Windows 版 Redis For Windows 发行包: https://mp.weixin.qq.com/s/V-wGPkyhuNHkfB3wCflXdQ

编译实战 | 手摸手教你在Windows环境下运行Redis6.x

https://www.msys2.org  从这里下载一个msys2

MS提供的低版本Redis for Windows: https://github.com/microsoftarchive/redis/tags

https://github.com/tporadowski/redis/tags

https://github.com/redis/go-redis

https://github.com/redis/redis

https://github.com/sewenew/redis-plus-plus

openssl 1.11,  3.0源码下载

图片

图片

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/468058.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

VSCode创建用户代码片段-案例demo

示例 - 在线生成代码片段 Vue3代码片段 {"vue3": {scope": "javascript,typescript,html,vue","prefix": "vue3","body": ["<template>","$1","</template>",""…

Java后端面试:框架篇高频面试(Spring、SpringMVC、SpringBoot、MyBatis)

&#x1f468;‍&#x1f393;作者简介&#xff1a;一位大四、研0学生&#xff0c;正在努力准备大四暑假的实习 &#x1f30c;上期文章&#xff1a;Java后端面试&#xff1a;MySQL面试篇&#xff08;底层事务、SQL调优&#xff09; &#x1f4da;订阅专栏&#xff1a;Java后端面…

HQYJ 3-18 整理

1.OSI七层体系结构&#xff1a;物理层、数据链路层、网络层、传输层、会话层、表示层、应用层 TCP/IP四层结构&#xff1a;网络接口层、网际层、传输层、应用层 五层结构&#xff1a;物理层、数据链路层、网络层、传输层、应用层 2.一帧数据的说明&#xff1a;大小为64-1518…

解决访问站外图片403(referrer)问题

问题 我们在使用站外图片的时候&#xff0c;访问图片403&#xff0c;但是浏览器直接访问图片链接可以打开&#xff0c;这是为什么呢&#xff1f; 原因 http请求体的header中有一个referrer字段&#xff0c;用来表示发起http请求的源地址信息&#xff0c;这个referrer信息是可…

WPS制作甘特图

“ 甘特图&#xff08;Gantt chart&#xff09;又称为横道图、条状图&#xff08;Bar chart&#xff09;&#xff0c;通过条状图来显示项目、进度和其他时间相关的系统进展的内在关系随着时间进展的情况。” 设置基础样式 设置行高 设置宽度 准备基础数据 计算持续时间 …

解决Android Studio Flamingo创建项目时出现的问题

问题1 使用Android Studio Flamingo创建项目时&#xff0c;IDE默认下载Gradle 8.0&#xff0c;但是下载速度特别慢&#xff0c;或者直接下载失败 解决办法-手动安装Gradle 第一步&#xff1a;使用浏览器下载gradle-8.0-bin.zip 下载地址&#xff1a;https://services.gradle…

Flutter-Android studio常用快捷键总结

前言 因为之前一直用Xcode&#xff0c;对Android studio的快捷键还不是很熟悉&#xff0c;这次有空来总结一下。 一、快捷键 1、Ctrl option O 删除未使用的 import 这个快捷键其实也不需要&#xff0c;可以在设置里面设置flutter自动格式化代码&#xff0c;或者使用CMD …

Servlet两种配置

通过xml配置 <servlet><servlet-name>MyServlet</servlet-name><servlet-class>MyServlet</servlet-class> </servlet> <servlet-mapping><servlet-name>MyServlet</servlet-name><url-pattern>/MyServlet</ur…

智慧城市中的智慧生活:便捷、舒适与高效

目录 一、智慧城市中的智慧生活概述 二、智慧生活带来的便捷性 1、智慧交通的便捷出行 2、智慧购物的轻松体验 3、智慧政务的一站式服务 三、智慧生活带来的舒适性 1、智慧环境的绿色宜居 2、智慧医疗的健康保障 3、智慧教育的均衡发展 四、智慧生活带来的高效性 1、…

Flask中的Blueprints:模块化和组织大型Web应用【第142篇—Web应用】

&#x1f47d;发现宝藏 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。【点击进入巨牛的人工智能学习网站】。 Flask中的Blueprints&#xff1a;模块化和组织大型Web应用 在构建大型Web应用时&#xff0…

机器人可反向驱动能力与力控架构

反向驱动性是电机传动系统的机械特性&#xff0c;它描述了运动是否可以轻松反转 。特别是&#xff0c;反向驱动能力取决于两个因素&#xff1a;传动运动效率和整体执行器机械阻抗。反向运动中传动装置的低运动效率意味着所施加的外力的大部分被运动反作用力抵消。然而&#xff…

海外问卷调查:代理IP使用方法

在进行问卷调查时&#xff0c;为了避免被限制访问或被封禁IP&#xff0c;使用代理IP已经成为了必要的选择。 其中&#xff0c;口子查和渠道查也不例外。 使用代理IP可以隐藏本机IP地址&#xff0c;模拟不同的IP地址&#xff0c;从而规避被封禁的风险。但是&#xff0c;对于很…

layuiAdmin-通用型后台模板框架【广泛用于各类管理平台】

1. 主页 1.1 控制台 2. 组件 3. 页面 3.1 个人主页 3.2 通讯录 3.3 客户列表 3.4 商品列表 3.5 留言板 3.6 搜索结果 3.7 注册 3.8 登入 3.9 忘记密码 4. 应用 4.1 内容系统 4.1.1 文章列表 4.1.2 分类管理 4.1.3 评论管理 4.2 社区系统 4.2.1 帖子列表 4.2.2 回…

【FPGA/IC】什么是模块化设计?

什么是模块化设计 FPGA/IC设计中根据模块层次的不同有两种基本的设计方法&#xff1a; 自下而上方法对设计进行逐次划分的过程是从基本单元出发的&#xff0c;设计树最末枝上的单元是已经设计好的基本单元&#xff0c;或者其他项目开发好的单元或者IP。该方法先对底层的功能块…

数据结构:图的拓扑排序与关键路径

目录 一、拓扑排序 1.1、算法的基本步骤 1.2、算法实现 1.4、习题思考 1.5、DFS生成逆拓扑序 一、拓扑排序 AOV网:在 有向图中&#xff0c; 顶点表示活动&#xff08;或任务&#xff09;&#xff0c; 有向边表示活动&#xff08;或任务&#xff09;间的先后关系&#xff0…

在基于全志V851se的TinyVision上手动构建 Linux 6.1 + Debian 12 镜像

构建 SyterKit 作为 Bootloader SyterKit 是一个纯裸机框架&#xff0c;用于 TinyVision 或者其他 v851se/v851s/v851s3/v853 等芯片的开发板&#xff0c;SyterKit 使用 CMake 作为构建系统构建&#xff0c;支持多种应用与多种外设驱动。同时 SyterKit 也具有启动引导的功能&a…

Kotlin: 协程的四种启动模式(CoroutineStart)

点击查看CoroutineStart英文文档 创建协程的三种方式 runBlocking 运行一个协程并且会阻塞当前线程&#xff0c;直到它完成。launch 启动一个新的协程&#xff0c;不会阻塞当前线程&#xff0c;并且返回一个Job&#xff0c;可以取消。async async和await是两个函数&#xff0c…

【UE 插件】UE4 虚幻引擎 插件开发(带源码插件打包、无源码插件打包) 有这一篇文章就够了!!!

目录 0 引言1 快速入门1.1 新建插件的前提1.2 创建插件步骤1.3 打包插件 2 无源代码的插件制作3 插件详细介绍3.1 插件的使用方法3.1 UE 预置插件模版3.1.1 空白3.1.2 纯内容3.1.3 编辑器独立窗口3.1.4 编辑器工具栏按钮3.1.5 编辑器模式3.1.6 第三方库3.1.7 蓝图库 3.2 插件中…

【视频异常检测】Delving into CLIP latent space for Video Anomaly Recognition 论文阅读

Delving into CLIP latent space for Video Anomaly Recognition 论文阅读 ABSTRACT1. Introduction2. Related Works3. Proposed approach3.1. Selector model3.2. Temporal Model3.3. Predictions Aggregation3.4. Training 4. Experiments4.1. Experiment Setup4.2. Evaluat…

Re62:读论文 GPT-2 Language Models are Unsupervised Multitask Learners

诸神缄默不语-个人CSDN博文目录 诸神缄默不语的论文阅读笔记和分类 论文全名&#xff1a;Language Models are Unsupervised Multitask Learners 论文下载地址&#xff1a;https://cdn.openai.com/better-language-models/language_models_are_unsupervised_multitask_learner…
最新文章