在 Windows 上从 bash 脚本运行 Openssl - 主题不以“/”开头

2024-02-08

在我的脚本中我有:

openssl req \
  -x509 \
  -new \
  -nodes \
  -key certs/ca/my-root-ca.key.pem \
  -days 3652 \
  -out certs/ca/my-root-ca.crt.pem \
  -subj "/C=GB/ST=someplace/L=Provo/O=Achme/CN=${FQDN}"

在 Windows 上的 Git Bash 3.1 中运行它会给出:

Subject does not start with '/'.

尝试像这样转义主题: -subj \"/C=UK/ST=someplace/L=Provo/O=Achme/CN=${FQDN}\"

还是不行。有任何想法吗?


这个问题具体针对明GW/MSYS这通常用作适用于 Windows 的 Git包裹。

解决方案是通过-subj与领导争论//(双正斜杠)然后使用\(反斜杠)分隔键/值对。像这样:

"//O=Org\CN=Name"

然后这将神奇地传递给openssl以预期的形式:

"/O=Org/CN=Name"

因此,要回答具体问题,您应该更改-subj将脚本中的行添加到以下内容。

-subj "//C=GB\ST=someplace\L=Provo\O=Achme\CN=${FQDN}"

这应该就是您所需要的。

这是什么魔法?

对于那些好奇到底发生了什么的人,我可以解释这个谜团。原因是 MSYS 合理地假设包含斜杠的参数实际上是路径。当这些参数传递给尚未专门为 MSYS 编译的可执行文件时(例如openssl在这种情况下)那么它会将 POSIX 路径转换为 ​​Win32 路径 http://www.mingw.org/wiki/Posix_path_conversion。这种转换的规则相当复杂,因为 MSYS 尽力涵盖最常见的互操作场景。这也解释了为什么使用openssl从 Windows 命令提示符(cmd.exe)工作正常,因为没有进行神奇的转换。

您可以像这样测试转换。

$ cmd //c echo "/CN=Name"
"C:/Program Files (x86)/Git/CN=Name"

我们不能使用echoMSYS 附带的可执行文件,因为它是为 MSYS 编译的,我们将使用echo内置于cmd。请注意,自从cmd开关以/(对于 Windows 命令很常见)我们需要用双斜杠来处理它。正如我们在输出中看到的,参数被扩展为 Windows 路径,原因就很清楚了openssl确实声称Subject does not start with '/'..

让我们看看更多的转换。

$ cmd //c echo "//CN=Name"
/CN=Name

双斜杠使 MSYS 相信该参数是一个 Windows 风格的开关,这会导致剥离/仅(无路径转换)。您可能会认为这样我们就可以使用斜杠来添加更多键/值对。让我们试试吧。

$ cmd //c echo "//O=Org/CN=Name"
//O=Org/CN=Name

突然,开头的双斜杠没有被删除。这是因为现在,在最初的双斜杠后面有一个斜杠,MSYS 认为我们正在引用 UNC 路径(例如 //server/path)。如果这被传递给openssl它会跳过第一个键/值说Subject Attribute /O has no known NID, skipped.

以下是相关规则MinGW 维基 http://www.mingw.org/wiki/Posix_path_conversion解释这种行为:

  • An argument starting with 2 or more / is considered an escaped Windows style switch and will be passed with the leading / removed and all \ changed to /.
    • 但如果 / 的前导块后面有一个 /,则该参数将被视为 UNC 路径,并且前导 / 不会被删除。

在这条规则中,我们可以看到可以用来创建我们想要的参数的方法。既然所有\后面的论证以//将被转换为普通/。让我们尝试一下。

$ cmd //c echo "//O=Org\CN=Name"
/O=Org/CN=Name

正如我们所看到的,它确实有效。

希望这能稍微揭开魔法的神秘面纱。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Windows 上从 bash 脚本运行 Openssl - 主题不以“/”开头 的相关文章

  • 如何在 Windows 上为 GeoDjango 安装 GEOS

    我正在使用 Python 2 5 Django 1 2 MySQL 和 Apache 启动一个 GeoDjango 项目 该项目将上传到 Linux 服务器 但开发将在 Windows 上进行 问题是我无法通过安装 GEOS 这是怎么完成的
  • 如何将数据通过管道传输到交互式 bash 脚本并将输出通过管道传输到另一个命令?

    我想将数据通过管道传输到交互式命令中 并将交互式命令的输出作为另一个命令的输入接收 例如 我希望能够执行以下操作 echo Zaphod hello sh goodbye sh 并让输出为 再见 你好 赞福德 这是我对此的初步破解 但我遗漏
  • 错误:“字符串”无法转换为“字符串!”

    mapView rac valuesForKeyPath userTrackingMode observer self subscribeNextAs block handling 我收到一个错误 String is not convert
  • 如何使用 Jquery 或 Javascript 更改原始字符串中的 HTML 属性?

    我想获取一堆锚标记并确保它们全部在新选项卡中打开 我知道我应该做这样的事情 a attr target blank 但问题是我试图修改的 HTML 位于字符串变量中 参见示例 我在一个字符串中有一堆原始 HTML 如下所示 var rawH
  • 如何在 IIS 上设置 Mercurial 和 hgweb?

    我一直在寻找关于如何让 hgweb 在 IIS 上工作的不错的说明 但我没有发现太多有价值的信息 There s 这个 一步一步 https www mercurial scm org wiki HgWebDirStepByStep在 Me
  • String.Format - 它如何工作以及如何实现自定义格式字符串

    With String Format 例如可以格式化DateTime对象以许多不同的方式 每次我寻找所需的格式时 我都需要在互联网上搜索 我几乎总能找到一个可以使用的例子 例如 String Format 0 MM dd yyyy Date
  • 在 SYSTEMTIME 上执行算术

    我有一个以 SYSTEMTIME 表示的时间值 我想从中添加 减去 1 小时并获取新获得的 SYSTEMTIME 我希望转换应该处理加法 减法或月份更改或 e1 年更改的日期更改 如果有一些 Windows api 在 SYSTEMTIME
  • “openssl 编程简介。”文章。过期的证书

    我是 openSSL 库和 PKI 的新手 我有一个简单的问题要问 openSSL 专家 有谁知道如何为本文中的代码示例创建证书 OpenSSL 编程简介 第一部分 第二部分 作者 Eric Rescorla www rtfm com op
  • Bash 参数引号和 eval

    我编写了一个 bash 日志记录库 用我公司当前正在使用的一些复杂脚本来实现 在进行日志调用时 我一直致力于提供调用脚本的脚本文件名 BASH SOURCE 和行号 LINENO 但是 我不想依赖用户或实现脚本来将这两个变量作为参数传递 如
  • PHP:从字符串中修剪子字符串的最佳方法

    想要处理一组字符串 并修剪一些结尾 myEnding 从最后每个字符串的如果存在的话 最简单的方法是什么 我知道使用正则表达式一切皆有可能 但这似乎是一项简单的任务 我想知道是否存在一个简单的工具来实现这一点 Thanks Gidi 我选择
  • 直接向pbs脚本传递参数

    有没有办法在提交作业之前直接将参数传递给 pbs 脚本 我需要循环遍历由不同数字表示的文件列表 并应用脚本来分析每个文件 我能想到的最好的办法如下 bin sh for i 1 i lt 10 i do export FILENUM i q
  • 未定义的符号:SSLv2_client_method

    我正在尝试将 openssl 1 0 1e 更新到 1 0 1s 这是源码编译的 当我完成以下步骤后 cd openssl 1 0 1s config 共享 make 进行安装 apachectl 配置测试 我收到错误 httpd usr
  • bash:清理三个文件的外连接,保留文件成员资格

    考虑以下三个文件 其标题位于第一行 file1 id name in1 1 jon 1 2 sue 1 file2 id name in2 2 sue 1 3 bob 1 file3 id name in3 2 sue 1 3 adam 1
  • Inno Setup 安装程序的文本编码错误

    对于某些 Windows 安装 我的安装程序 Inno Setup 的俄语文本编码很差 所有机器都安装了Windows XP SP3 英文版 但有些机器可以运行 有些机器则没有 Windows 上有什么设置可以解决这个问题吗 Thanks
  • 字符串的 gnuplot 图

    是否可以传递字符串中的绘图数据 我的意思是做这样的事情 plot 09 13 2010 2263 80 09 14 2010 2500 using 1 2 with lines 可以做类似的事情 set xdata time set tim
  • 如何将查找结果传递给 CP,以便带空格的文件名起作用 [重复]

    这个问题在这里已经有答案了 我正在尝试将带有特定附件的文件复制到不同的目录 并保留其相对路径 从我调用的原始顶部路径 cp parents find name pdf print new path 我相信这有效 但仅当找到的文件名称中没有空
  • 如何使用 VB6 调用 Windows shell 命令?

    究竟如何使用 VB6 才能像从命令行一样调用任何 Windows shell 命令 例如 一些微不足道的事情 echo foo 操作方法如下 Shell cmd echo foo vbNormalFocus
  • f.read 为空

    我在解释器中完成这一切 loc1 council council1 file1 open loc1 r 此时我可以执行 file1 read 并将文件的内容作为字符串打印到标准输出 但如果我添加这个 string1 file1 read 字
  • Excel的解析路径

    其实我想问以下问题 对于位于 目录中定义的 PATH 怎么能 我找出这些目录中的哪个 找到了 因为我需要使用 Process Run 从 C 运行 Excel 并且只需指示 Excel 即可正常工作 Windows 似乎知道在哪里可以找到它
  • 如何使用 Sequel Pro 在导入过程中将字符串更改为日期?

    我正在尝试使用 Sequel Pro 将文件导入到 MySQL 表中 我知道我需要使用 STR TO DATE 但我无法找出正确的语法 我在每一行都收到一堆这样的错误 ERROR in row 1 You have an error in

随机推荐