十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Windows 10下OpenSSL 1.1.1安装避坑指南

Windows 10下OpenSSL 1.1.1安装避坑指南 写这篇东西的起因很简单有个老项目必须在Windows 10环境上用OpenSSL 1.1.1结果手头几台测试机全都没装过。本来以为这玩意儿和Linux下apt install一下差不多结果翻车翻了好几次不是缺DLL就是版本不对再就是明明配了环境变量终端里还是找不到命令。折腾完一轮之后我觉得必须把这个过程完整写出来给后面接手的人省点时间。这篇博文就是给你讲清楚在Windows 10下从零装好OpenSSL 1.1.1到底要经历哪些环节每一步为什么这么做以及最容易被忽略的几个坑在哪里。无论你是做Java、Python、Node还是C开发的只要你的项目要处理HTTPS证书、RSA签名、AES加密这类事情后面大概率都要和OpenSSL打交道。照着这篇文章走一遍基本能让你少踩一半的坑。1. 版本选型为什么OpenSSL 1.1.1还是很多项目绕不开的选择先别急着去下载你手里到底需要哪个版本这个得先想清楚。OpenSSL不是一个“越新越好”的工具它牵扯到大量现有系统和应用的兼容性尤其是老项目版本错一个数字编译出来的东西可能就完全跑不起来了。1.1 OpenSSL到底解决什么问题OpenSSL说白了就是一个加密工具箱它实现了SSL/TLS协议以及各种基础加密算法。你平时打开一个HTTPS网站浏览器和服务器之间建立起安全通道的时候底层用的就是它或者同类库。你在代码里面生成密钥对、做数据签名、计算摘要、验证证书很多底层操作最后也都是落到OpenSSL头上。在Windows环境下不像Linux那样系统自带或者包管理器一条命令就能装。你装OpenSSL的本质是往系统里放一组可执行的命令行工具openssl.exe、一组动态链接库libcrypto和libssl的dll文件以及配套的头文件。这三个东西分别对应了“我要手动算点东西”“我要让程序运行时不报找不到库”“我要写C/C代码调用加密函数”这三种需求。1.2 1.1.1与3.x怎么选这里要重点说清楚。OpenSSL 1.1.1是2018年发布的一个长期支持版本它的生命期到2023年9月11日正式结束。也就是说从安全补丁的角度看它已经停止维护了。那为什么还要用它原因很现实大量的存量项目、商用软件、老版本SDK还在依赖它你升级到3.x某些模块的二进制兼容性就会出问题轻则警告重则直接崩溃。如果你的项目是全新的、没有历史包袱的那建议直接用OpenSSL 3.x没必要从一个已经EOL的版本起步。但如果你的项目被锁定在1.1.1上或者你手头有现成的编译产物只认这个版本的库那就在Windows 10上装1.1.1这也是本文的主题场景。另外一个小技巧安装前先检查系统里是不是已经有别的OpenSSL版本了。在命令行里输入openssl version试一下如果有输出看看版本号是多少。如果已经装了3.x你又同时需要1.1.1建议把两个版本放到不同目录靠环境变量切换而不是直接覆盖安装不然很容易把系统环境搞乱。2. 安装前准备下载预编译包时要避开的坑在Windows上装OpenSSL绝大多数人不推荐自己从源码编译耗时且容易出问题。直接用第三方预编译包是主流选择但这里面的门道也不少。2.1 确认系统架构x86还是x64下载之前先确认你的Windows 10系统是32位还是64位。右键“此电脑”选“属性”在“系统类型”这一行能看到。绝大多数现代电脑都是64位系统所以64位版本的OpenSSL是首选。但这里有个很容易踩的坑你要想的不是“我的电脑是64位系统”而是“我要跑的那个程序是32位还是64位”。你的程序如果是32位的哪怕系统是64位的也得装32位的OpenSSL。因为程序加载DLL时会去加载匹配自己架构的那个版本你装个64位的反而会报0xc000007b这种异常。判断方法很简单看你的开发环境编译目标比如Java的JVM是32位还是64位Python的安装目录是Program Files还是Program Files (x86)C项目的平台选的是x64还是Win32。跟你用的程序保持一致就对。2.2 安装包版本Light版和Full版的区别OpenSSL在Windows上的预编译包主流来源是Shining Light Productions这个站点slproweb.com他们的下载页面提供了很详细的版本列表。我建议从这里下载因为用的人多遇到问题也容易查到解决方案。下载的时候你会看到每个版本下面有多个选项常见的有Win64 OpenSSL v1.1.1wWin64 OpenSSL v1.1.1w LightWin32 OpenSSL v1.1.1wWin32 OpenSSL v1.1.1w LightLight版是精简版只有可执行文件和必要的DLL体积小适合运行程序用。Full版包含了头文件、静态库、开发文档适合你要做二次开发、编译C/C程序的时候用。这个选择逻辑是这样的如果只是想让某个现成的程序能跑起来比如数据库、脚本之类的调用加密库装Light版就够了。但如果你要在自己的项目里调用OpenSSL的函数比如用C代码读写证书、算哈希那就必须装Full版否则没有头文件和导入库编译阶段就过不去。我个人的建议是安装费不了多大功夫干脆直接装Full版省得后面要用到头文件又要重装一遍。另外提一句下载完安装包以后有空的话可以对一下文件的哈希值页面上会提供SHA1或者SHA256的校验码。这一步不是必须的但做安全相关工作的人最好养成这个习惯防止下载到的文件被篡改。3. 一步步安装目录规划、环境变量与验证前面那些搞清楚以后安装本身其实非常简单因为它是MSI的安装包格式双击就可以走图形界面流程。但怎么规划安装目录、怎么配置环境变量这些直接决定你后面顺手不顺手。3.1 解压到固定目录并规范命名安装程序会让你选择安装路径。这里有一个很多人忽略的点把它装到一个路径固定、没有空格的目录里比如C:\OpenSSL-Win64或者D:\tools\OpenSSL-Win64。为什么要强调没有空格因为很多第三方构建工具或者脚本在拼接路径的时候遇到空格就出问题。默认安装目录有Program Files这种带空格的路径平时手动用没感觉但当你写自动化脚本、配置CMake、给CI/CD配环境的时候分分钟给你颜色看。如果你用的是EXE版本的安装包安装过程中可能还会问你要不要把DLL复制到系统目录通常是C:\Windows\System32。这里我建议选“不要”。原因有两个第一把第三方DLL塞进系统目录是污染系统环境的行为容易和别的软件冲突第二你后面想换版本或者卸载的时候残留在System32里的旧DLL很不好清干净。让它把DLL留在自己的安装目录里然后通过环境变量去引用这才是干净的做法。还有一个点装完之后找一下openssl.cnf文件。它在安装目录的bin文件夹下比如C:\OpenSSL-Win64\bin\cnf\openssl.cnf。这个配置文件的作用很大你后面用openssl命令生成证书、做各种操作的时候很多默认参数都是从它里面读的。有些版本安装时不会自动帮你设置指向这个文件的环境变量结果你运行某些命令的时候会看到Unable to load config info from ...的提示虽然不是致命错误但很烦。所以提前把这个文件位置记下来。3.2 环境变量配置的两种方式和原理装完之后安装程序一般会自动帮你把OpenSSL的bin目录加到系统PATH里。但我建议你检查一遍因为不少情况下这一步会被跳过或者只对当前用户生效。手动配置的两种方式界面操作和命令行操作都可以。先说明怎么做再解释为什么。界面操作流程右键“此电脑”-“属性”-“高级系统设置”-“环境变量”。在“系统变量”列表里找到Path双击编辑然后新建一项填入OpenSSL的bin目录路径比如C:\OpenSSL-Win64\bin保存。命令行操作流程以管理员身份打开PowerShell或者CMD执行这条命令setx /M PATH %PATH%;C:\OpenSSL-Win64\binsetx是Windows自带的命令/M表示修改系统级的环境变量后面跟着追加内容。注意setx有个已知问题就是它会截断超过1024个字符的环境变量如果你的PATH原本就很长用这种方式修改有丢失原有内容的危险。所以如果你的PATH本来就长建议还是走界面操作更稳妥。为什么要把bin目录加到PATH因为openssl.exe这个主程序就在bin目录里。不加PATH你每次只能切到那个目录下去运行openssl.exe或者输入完整路径非常反人类。而OpenSSL运行时会用到的libcrypto-1_1-x64.dll、libssl-1_1-x64.dll也在同一个目录下只要bin在PATH里程序启动时就能自动找到它们不会报找不到DLL的错。顺带说一句如果你装了多个版本的OpenSSL环境变量里的顺序就决定了默认用的是哪个版本。先出现的路径优先。想精确控制的话可以用OPENSSL_HOME这种自定义变量指向具体版本目录然后把%OPENSSL_HOME%\bin加进PATH要切换版本时改一下OPENSSL_HOME就行。3.3 验证安装openssl version 的正确姿势配完环境变量最关键的一步是验证。重新打开一个CMD窗口注意一定要重新打开环境变量修改不会对已打开的窗口生效输入openssl version正常情况下会输出类似OpenSSL 1.1.1w 11 Sep 2023看到这个就说明基本装成功了。如果还想看更详细的信息包括编译参数、配置路径、证书路径等用openssl version -a这个命令会输出一大堆信息重点看OPENSSLDIR这一项它告诉你openssl会在哪个目录找配置文件。如果这个路径指向的目录里没有openssl.cnf那建议你设置一个OPENSSL_CONF环境变量指向刚才提到的cnf文件位置比如setx OPENSSL_CONF C:\OpenSSL-Win64\bin\cnf\openssl.cnf验证是安装过程的最后一步也是最重要的一步。我在实操中见过太多人装完觉得“应该没问题了”结果到了用的时候才发现命令根本找不到或者DLL报错。所以这个验证步骤一定要做而且要在新开的窗口里做。4. 常见问题与排查实录安装OpenSSL本身不难难的是装完以后遇到的各种幺蛾子。下面这几个问题是我在实际操作中遇到过的也是社区里问得最多的几类整理成一个速查表你先收藏着出了问题回来翻。错误现象根本原因解决方案输入openssl提示“不是内部或外部命令”PATH里没加bin目录或加了没生效检查环境变量重新打开窗口重试运行时提示找不到libcrypto-1_1-x64.dll运行的程序和DLL不在同一个可见路径下把bin目录加入PATH或把DLL拷到程序目录程序启动报0xc000007b错误程序架构和OpenSSL架构不匹配确认程序是32位还是64位装对应版本openssl命令能跑但提示找不到配置文件OPENSSL_CONF环境变量未设置设置环境变量指向openssl.cnf版本是3.x但项目需要1.1.1装了高版本且覆盖了旧的单独装1.1.1到独立目录用环境变量切换4.1 运行时提示找不到libcrypto-1_1-x64.dll这个问题在我帮同事排查的时候遇到的频率非常高。表面现象是明明OpenSSL装好了openssl命令也能用但你的程序一启动就报The code execution cannot proceed because libcrypto-1_1-x64.dll was not found。第一反应不要慌这不是你的OpenSSL坏了而是程序在启动时找不到那个DLL。程序加载动态库会按照这个顺序搜索程序所在目录、当前工作目录、系统目录、PATH环境变量里的目录。如果这几个地方都找不到就报错。解决办法很简单要么把OpenSSL的bin目录加到系统PATH里推荐一次性解决多个程序的问题要么把缺的DLL复制到你的程序所在目录治标不治本但能急用。4.2 输入openssl提示不是内部或外部命令这个问题几乎都是环境变量没配好。注意三个细节第一修改环境变量后已经打开的CMD或者PowerShell窗口不会自动刷新必须新开一个窗口。第二如果你是在安装程序里点了“加入PATH”的选项它有时候只改当前用户的环境变量系统级的没动你用管理员权限再检查一遍。第三setx /M命令如果PATH太长会截断安装完以后检查PATH是不是完整的。排查流程就是先echo %PATH%看你当前的PATH里有没有OpenSSL的bin目录。没有就重新配置有就检查是不是别的目录里有个openssl.exe抢先了。用where openssl命令可以列出Windows会搜索到哪些位置的openssl你把输出一条条看过来就知道最终用的是哪个版本。4.3 64位系统装了32位版本程序直接异常这个情况的症状比较诡异程序不提示缺DLL而是直接报0xc000007b或者干脆“应用程序无法正常启动请单击确定关闭应用程序”。排查半天最后发现是架构不匹配。判断方法是确认你的程序是32位还是64位。如果一个64位的程序加载了32位的libcrypto DLLWindows不会说“版本不对”而是抛出一个看起来完全不相干的异常码。反过来也一样。遇到这个问题别瞎调其他东西先确认系统架构、程序架构、OpenSSL架构三者是否匹配。系统是64位的没问题那就看程序是哪种再看你装的OpenSSL是不是对应的。不匹配就卸掉重装对应版本。5. 装好之后怎么用拿它做一个生成证书的真实例子工具装好不是目的用起来才是。我用一个最核心的场景来演示如何用openssl命令生成一套自签名HTTPS证书。这是本地调试HTTPS服务、内网测试环境、开发阶段临时加密通信的必备操作。5.1 生成自签名证书完整命令第一步生成一个私钥。以RSA 2048位为例openssl genrsa -out server.key 2048这条命令会在当前目录下生成一个名为server.key的文件里面是RSA私钥。2048是密钥长度位数越高越安全但性能越差2048是现在的主流选择兼容性和安全性都够。如果你需要更高强度可以选4096但实际使用中2048已经能满足绝大多数场景。第二步基于这个私钥生成一个证书签名请求文件也就是CSRopenssl req -new -key server.key -out server.csr执行后会交互式问你一堆问题包括国家代码、省份、城市、公司名、部门、通用名称。其中通用名称最重要要填你的域名或者IP。如果只是本地用填localhost或者127.0.0.1都可以。不想交互式填的话可以在命令里用-subj参数直接指定openssl req -new -key server.key -out server.csr -subj /CCN/STBeijing/LBeijing/OTest/CNlocalhost第三步用私钥和CSR生成自签名证书。这里指定证书有效期是365天openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt这样就生成了三个文件server.key私钥、server.csr签发请求正式CA用得到、server.crt自签名证书。在Nginx里配HTTPS用的就是server.crt和server.key这两个文件。5.2 其他几个高频命令除了生成证书OpenSSL最常用的就是下面这几个查看证书内容openssl x509 -in server.crt -text -noout这个命令把证书的详细信息都打印出来包括颁发者、使用者、有效期、公钥算法等。排查证书问题的时候第一个就查它。查看系统根证书和证书库Windows下有专门的命令OpenSSL可以用来做各类算法操作openssl dgst -sha256 -sign server.key -out sign.bin data.txt这是对文件做SHA256摘要并签名很多API的加签逻辑底层就是这么干的。生成随机数openssl rand -hex 16这条命令生成16字节的随机数hex编码后是32个字符。生成密钥、盐值、初始化向量的时候随手就用它比手写随机数靠谱得多。这些命令看似零散但组合起来能覆盖大多数日常加密场景。建议装好以后把这些都跑一遍既验证了安装又熟悉了用法。另外再强调一次。OpenSSL 1.1.1在2023年9月之后不再有安全更新如果这个项目是长生命周期的生产系统强烈建议你在团队内部推动环境升级到OpenSSL 3.x尤其是要处理敏感数据、面向公网提供服务的那类应用。1.1.1能不能继续用本质上是安全风险和维护成本之间的权衡。我遇到的老项目里最稳妥的过渡方式是先在独立目录装好3.x用环境变量在开发环境里平行测试等所有依赖项都验证没问题再切换默认版本。这样既不影响现有业务又能逐步完成升级。
返回列表