从Homebrew找到openssl.cnf文件并拷贝到Go项目下使用

article/2025/9/9 0:41:14

安装OpenSSL

在 macOS 上下载和安装 OpenSSL 最常见和推荐的方式是使用 Homebrew,这是一个 macOS 缺失的包管理器。

如果您还没有安装 Homebrew,请先安装它。安装 Homebrew 后,安装 OpenSSL 只需要一条命令。

步骤 1:安装 Homebrew(如果尚未安装)

打开您的终端应用程序 (可以在 Spotlight 搜索中输入 “Terminal” 找到),然后粘贴并运行以下命令:

/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"

按照屏幕上的指示完成安装。这可能需要您输入您的用户密码。

步骤 2:使用 Homebrew 安装 OpenSSL

Homebrew 默认会安装最新稳定版的 OpenSSL 3。在终端中运行:

brew install openssl@3

Homebrew 会下载并安装 OpenSSL。安装完成后,它会告诉您 OpenSSL 的安装路径,通常是 /opt/homebrew/opt/openssl@3

步骤 3:配置您的 shell 环境 (重要!)

Homebrew 安装的 OpenSSL 不会自动链接到 /usr/local/bin/usr/bin,以避免与 macOS 内置的旧版本 OpenSSL 发生冲突。这意味着您需要手动配置您的 shell 环境,以便程序能够找到 Homebrew 安装的 OpenSSL。

Homebrew 在安装完成后通常会给出配置提示,类似这样:

==> openssl@3
openssl@3 is keg-only, which means it was not symlinked into /opt/homebrew.
If you need to have openssl@3 first in your PATH, run:echo 'export PATH="/opt/homebrew/opt/openssl@3/bin:$PATH"' >> ~/.zshrcFor compilers to find openssl@3 you may need to set:export LDFLAGS="-L/opt/homebrew/opt/openssl@3/lib"export CPPFLAGS="-I/opt/homebrew/opt/openssl@3/include"

请按照 Homebrew 的提示进行操作。以下是通用的做法:

对于 zsh 用户(macOS Ventura 及更高版本的默认 shell):

打开终端,运行以下命令将 OpenSSL 路径添加到您的 PATH 环境变量中,并设置 LDFLAGS 和 CPPFLAGS,这些是编译时需要的环境变量:

echo 'export PATH="/opt/homebrew/opt/openssl@3/bin:$PATH"' >> ~/.zshrc
echo 'export LDFLAGS="-L/opt/homebrew/opt/openssl@3/lib"' >> ~/.zshrc
echo 'export CPPFLAGS="-I/opt/homebrew/opt/openssl@3/include"' >> ~/.zshrc

然后,重新加载您的 .zshrc 文件使更改生效:

source ~/.zshrc

对于 bash 用户(旧版 macOS 的默认 shell 或您手动切换的):

将上述命令中的 ~/.zshrc 替换为 ~/.bash_profile~/.bashrc (取决于您的配置),然后重新加载:

echo 'export PATH="/opt/homebrew/opt/openssl@3/bin:$PATH"' >> ~/.bash_profile # 或者 ~/.bashrc
echo 'export LDFLAGS="-L/opt/homebrew/opt/openssl@3/lib"' >> ~/.bash_profile # 或者 ~/.bashrc
echo 'export CPPFLAGS="-I/opt/homebrew/opt/openssl@3/include"' >> ~/.bash_profile # 或者 ~/.bashrc
source ~/.bash_profile # 或者 source ~/.bashrc

步骤 4:验证安装

配置完成后,关闭并重新打开您的终端应用程序,或者再次运行 source 命令。然后,您可以运行以下命令来验证 OpenSSL 是否已正确安装且您的系统正在使用 Homebrew 版本:

openssl version

输出应该显示类似 OpenSSL 3.x.x ... 的信息。

您还可以验证 which openssl 的输出:

which openssl

这应该显示 /opt/homebrew/opt/openssl@3/bin/openssl (或者如果您将其链接到 /usr/local/bin,则显示 /usr/local/bin/openssl)。

这样,您的 macOS 系统就成功安装了 OpenSSL,并且您的开发环境也配置好了,以便在编译需要 OpenSSL 的其他软件时能够找到它。
macOS 和 Windows 在文件系统结构和 Homebrew 的安装方式上有所不同,导致 openssl.cnf 文件不容易找到。

在 Windows 上,当您安装 OpenSSL 时,openssl.cnf 文件通常会放在安装目录的 binconf 文件夹下,方便直接复制。

然而,在 macOS 上,使用 Homebrew 安装的 OpenSSL (例如 openssl@3),其 openssl.cnf 文件默认位于 Homebrew 的 Cellar 目录中,并且通常不会直接在 bin 目录下。

找到 openssl.cnf 文件

  1. 找到 OpenSSL 的安装路径:
    首先,确定 Homebrew 安装的 OpenSSL 的具体路径。最简单的方法是使用 brew --prefix 命令:

    brew --prefix openssl@3
    

    这个命令通常会返回类似 /opt/homebrew/opt/openssl@3 的路径(如果您使用的是 Apple Silicon Mac)。如果是 Intel Mac,可能是 /usr/local/opt/openssl@3

  2. 查找 openssl.cnf 文件:
    进入上一步找到的 OpenSSL 安装路径,然后查找 openssl.cnf。它通常位于 etc/openssl/ssl/ 目录下。

    假设上一步返回的路径是 /opt/homebrew/opt/openssl@3,您可以尝试:

    find /opt/homebrew/opt/openssl@3 -name openssl.cnf
    

    这条命令会在 /opt/homebrew/opt/openssl@3 目录下搜索名为 openssl.cnf 的文件。

    最常见的位置是:
    /opt/homebrew/opt/openssl@3/etc/openssl/openssl.cnf (对于 OpenSSL 3)

    /usr/local/etc/openssl@3/openssl.cnf (对于 OpenSSL 3,可能是符号链接)

    /opt/homebrew/etc/openssl@3/openssl.cnf (对于 OpenSSL 3,也是符号链接)

    如果您安装的是 openssl (而不是 openssl@3,通常指的是 OpenSSL 1.1),它可能在:
    /opt/homebrew/etc/openssl/openssl.cnf

    /usr/local/etc/openssl/openssl.cnf

如果没有找到
在这里插入图片描述
这表明它可能不在 openssl@3 的顶层安装目录中,或者它位于一个更深的子目录。

根据 Homebrew 安装 OpenSSL 的惯例,openssl.cnf 通常位于以下路径:

  • 对于 OpenSSL 3: /opt/homebrew/etc/openssl@3/openssl.cnf
  • 对于 OpenSSL 1.1: /opt/homebrew/etc/openssl/openssl.cnf

这些路径是 Homebrew 创建的符号链接,指向实际安装在 Cellar 目录下的文件。Homebrew 通常会将配置文件放在 etc 目录下,以便于管理。

请尝试直接查看这些路径:

  1. 检查 OpenSSL 3 的配置文件路径:

    ls -l /opt/homebrew/etc/openssl@3/openssl.cnf
    

    在这里插入图片描述

  2. 如果您不确定自己安装的是 OpenSSL 哪个版本,可以同时检查 OpenSSL 1.1 的路径:

    ls -l /opt/homebrew/etc/openssl/openssl.cnf
    

找到文件后,如何复制到项目目录下?

一旦您找到了 openssl.cnf 文件的确切路径,您就可以使用 cp 命令将其复制到您的项目目录下。

假设您的项目目录是 /path/to/your/project,并且您找到了 openssl.cnf/opt/homebrew/opt/openssl@3/etc/openssl/openssl.cnf

cp /opt/homebrew/opt/openssl@3/etc/openssl/openssl.cnf /path/to/your/project/

请将 /path/to/your/project/ 替换为您实际的项目路径。
在这里插入图片描述

重要提示:

  • 默认配置: 在大多数情况下,生成普通的证书和私钥,您不需要修改 openssl.cnf 文件。当老师要求复制时,通常是为了修改一些默认参数(如默认国家、省份等信息),或者启用一些高级功能(如扩展字段)。
  • 环境变量: OpenSSL 默认会查找 /usr/local/ssl/openssl.cnf 或通过 OPENSSL_CONF 环境变量指定的路径。如果您只是想临时使用自定义的 openssl.cnf,可以将该文件的路径通过环境变量传递给 openssl 命令,而不是直接复制到项目目录:
    OPENSSL_CONF=/path/to/your/project/openssl.cnf openssl req -new -x509 ...
    

http://www.hkcw.cn/article/RQvYCkiEJJ.shtml

相关文章

Socket编程基础

这篇博客我们主要用来讲解TCP和UDP的socket编程。 概念 大多数网络协议都是由软件实现的(特别是协议栈中的高层协议),而且绝大多数计算机系统都将运输层以下的网络协议在操作系统的内核中进行实现。应用程序要想执行网络操作,必…

什么是物化视图(Materialized View)?

分析师和工程师经常面临一个共同的困境:随着数据量激增,查询性能急剧下降。一个看似简单的多表联合查询可能需要耗时数分钟甚至数小时,一个常规的实时大屏可能因数据处理缓慢而失去时效价值。当数据规模从 GB 级增长到 TB 甚至 PB 级时&#…

USB Redirector对比国产USB Server方案:软硬之争与技术突围

在远程设备共享领域,‌USB Redirector‌以其轻量级跨平台特性长期占据国际主流市场,支持Windows/Linux系统下的无缝USB设备网络共享。然而,随着国产化替代需求的爆发,以‌朝天椒USB Server‌为代表的软硬一体化方案,凭…

PP-OCRv5 C++封装DLL C#调用源码分享

目录 说明 效果 C#调用效果 项目 C# C 头文件 源文件 C#调用 下载 说明 C封装DLL&#xff0c;C#调用源码分享 效果 C#调用效果 项目 C# C 头文件 #include <windows.h> #include <iostream> #include <opencv2/opencv.hpp> #include <stri…

RISC-V PMA、PMP机制深入分析

1 PMA PMA&#xff08;Physical Memory Attributes&#xff09;&#xff0c;物理内存属性&#xff0c;顾名思义就是用来设置物理内存属性的&#xff0c;但这里说“设置”&#xff0c;并不合理&#xff0c;因为一般情况下各存储的属性&#xff0c;在芯片设计时就固定了&#xf…

桂花网体育运动监测方案:开启幼儿园运动健康管理新篇章

在幼儿教育领域&#xff0c;运动能力的培养与健康监测始终是备受关注的核心环节。随着科技的飞速发展&#xff0c;如何科学、有效地监测幼儿的运动状态&#xff0c;成为了幼儿园教育者面临的一大挑战。桂花网体育运动监测方案凭借其高效、精准、智能化的特性&#xff0c;为幼儿…

第6讲、 Odoo 18 `tools` 模块深度分析

Odoo 18 中的 odoo/tools 目录是核心工具模块的集合&#xff0c;封装了大量通用功能&#xff0c;包括数据处理、安全校验、缓存优化、文件处理、时间转换、国际化、多线程处理等。这些工具模块在整个 Odoo 框架中被频繁引用&#xff0c;是系统高效运行和代码解耦的重要基础。 &…

如何在矩池云实例上开启应用服务的访问端口

AI 应用开发越来越火热&#xff0c;矩池云平台上也相应出现了越来越多的 AI 应用开发者&#xff0c;这里详细介绍下大家在使用过程中经常遇到的一个问题&#xff1a;在矩池云的实例上&#xff0c;如何为应用服务开启外部可访问的端口&#xff1f; 根据开发者有没有启动实例&…

首发支持! 基于昇腾MindIE玩转InternVL3多模态理解最新模型

2025年4月16日&#xff0c;上海人工智能实验室&#xff08;上海AI实验室&#xff09;升级并开源了通用多模态大模型书生万象3.0&#xff08;InternVL3&#xff09;。通过采用创新的多模态预训练和后训练方法&#xff0c;InternVL3 多模态基础能力全面提升&#xff0c;在专家级基…

深入解析Java8核心新特性(Optional、新的日期时间API、接口增强)

文章目录 前言一、Optional&#xff1a;优雅处理null1.1 Optional设计哲学1.2 Optional基础操作1.3 Optional链式操作1.4 高级应用1.5 Optional实战案例 二、新的日期时间API&#xff1a;解决历史痛点2.1 java.time 设计哲学与核心架构2.2 核心类详解与使用基本日期时间类时区相…

深入理解C#中的委托与事件:从基础到高级应用

在C#编程语言中&#xff0c;委托和事件是两个强大且独特的特性&#xff0c;它们为方法封装、回调机制和事件驱动编程提供了语言级别的支持。作为.NET框架的核心组件&#xff0c;委托和事件广泛应用于Windows Forms、WPF、ASP.NET等各类应用程序中。本文将全面探讨委托与事件的概…

设备制造行业项目管理难点解析,如何有效解决?

在设备制造行业&#xff0c;项目管理是企业运营的核心环节&#xff0c;直接影响项目交付效率、成本控制和盈利能力。然而&#xff0c;由于行业特性复杂、项目周期长、涉及部门多&#xff0c;企业在实际操作中常常面临诸多管理痛点。金众诚工程项目管理系统&#xff0c;依托金蝶…

如何应对客户对项目进度的过度干预

当客户对项目进度进行过度干预时&#xff0c;企业应采取明确项目边界、建立透明沟通机制、提升客户信任感、提供详实进度报告等措施。其中&#xff0c;明确项目边界尤为关键&#xff0c;它能有效帮助企业和客户共同确认项目的权责范围&#xff0c;防止客户的过度干预影响项目整…

11:QT界面设计—模态UI对话框

1.模态UI对话框 1.创建dialog的界面模板 2.进行模板界面设计 3.在主程序调用此界面 需要包含此类和实例化此类&#xff0c;然后调用下面的程序m_pShapeMatch->setModal(false); //如果改为true&#xff0c;则弹出对话框之后无法进行其它操作m_pShapeMatch->show(); 2.…

重温经典算法——选择排序

版权声明 本文原创作者&#xff1a;谷哥的小弟作者博客地址&#xff1a;http://blog.csdn.net/lfdfhl 基本原理 选择排序属于简单的原地排序算法&#xff0c;通过将待排序序列分为已排序和未排序两部分&#xff0c;每次从未排序部分选择最小元素&#xff0c;与未排序部分的起…

RFID测温芯片助力新能源产业安全与能效提升

在“双碳”目标驱动下&#xff0c;新能源产业正经历爆发式增长。无论是电动汽车、储能电站还是风光发电场&#xff0c;设备安全与能效提升始终是行业核心命题。而温度&#xff0c;这个看似普通的物理参数&#xff0c;却成为破解这一命题的关键密码。RFID测温芯片&#xff08;集…

数据的类型——认识你的数据

第02篇&#xff1a;数据的类型——认识你的数据 写在前面&#xff1a;嗨&#xff0c;大家好&#xff01;我是蓝皮怪。在上一篇文章中&#xff0c;我们聊了统计学的基本概念&#xff0c;今天我们来深入了解一个非常重要的话题——数据的类型。你可能会想&#xff1a;"数据就…

【JVM】初识JVM 从字节码文件到类的生命周期

初识JVM JVM&#xff08;Java Virtual Machine&#xff09;即 Java 虚拟机&#xff0c;是 Java 技术的核心组件之一。JVM的本质就是运行在计算机上的一个程序&#xff0c;通过软件模拟实现了一台抽象的计算机的功能。JVM是Java程序的运行环境&#xff0c;负责加载字节码文件&a…

WebVm:无需安装,一款可以在浏览器运行的 Linux 来了

WebVM 是一款可以在浏览器中运行的Linux虚拟机。不是那种HTMLJavaScript模拟的UI&#xff0c;完全通过HTML5/WebAssembly技术实现客户端运行。通过集成CheerpX虚拟化引擎&#xff0c;可直接在浏览器中运行未经修改的Debian系统。 Stars 数13054Forks 数2398 主要特点 完整 Lin…

动态规划-931.下降路径最小和-力扣(LeetCode)

一、题目解析 从最顶上出发&#xff0c;有三个位置选择&#xff0c;左中下(边界除外)&#xff0c;使其走到最下面时下降路径最小。 二、算法原理 1、状态表示 我们需要的是到达[i,j]的最小路径和&#xff0c;所以此时dp[i][j]表示&#xff1a;到达[i,j]位置时&#xff0c;最…