硬核观察 #1123 无人察觉：窃取密码的 Linux 木马已偷偷下载 3 年
无人察觉：窃取密码的 Linux 木马已偷偷下载 3 年安全研究人员报告，一个下载网站间隔性地向 Linux 用户提供恶意软件，盗取密码和其他敏感信息长达三年多，直到最后销声匿迹。该网站提供了一个名为 “免费下载管理器“ 的 Linux 软件。从 2020 年开始，该网站有时会将用户重定向到另外一个恶意域名，提供该应用的恶意版本，它会在目标设备上安装后门。该后门会窃取包括系统信息、浏览历史、保存的密码、加密货币钱包文件以及云服务凭证等信息。这个恶意重定向于 2022 年结束，原因不明。消息来源：Ars Technica老王点评：与 Windows 相比，Linux 恶意软件很少被发现，这往往让人们更加掉以轻心，现在检查一下你的 Linux 桌面，或许为时不晚。谷歌称它的搜索引擎是最好的在周二开庭的谷歌反垄断诉讼案上，司法部和来自美国各州和地区的 52 位总检察长指控谷歌支付数十亿美元，以换取被设置为手机和网络浏览器的默认搜索引擎，从而非法维持其垄断地位。法官称，谷歌至少在 2010 年就已成为垄断企业，如今控制着超过 89% 的在线搜索市场。谷歌的律师表示，人们选择谷歌作为浏览器和智能手机的默认搜索引擎“是因为谷歌为他们带来了价值，而不是因为他们不得不使用谷歌”。并举例，微软在 Windows 上的默认搜索引擎是必应，但用户切换到谷歌是因为它是搜索市场上更好的产品。而且，谷歌的律师表示，Safari 和 Firefox 通过默认搜索引擎交易换取收入分成，帮助了它们的创新。消息来源：彭博社老王点评：谷歌是不是最好的，和它是不是非法维持垄断没有关系。让我们看看这起新时代的 IT 巨头垄断案将如何走向。OpenSSL 1.1.1 已经走到了生命的尽头OpenSSL 1.1.1 最初于 2018 年作为开源安全通信库的长期支持版本发布。当时，其背后的团队宣称，该版本将至少支持五年，也就是到今年。要想继续获得 OpenSSL 的支持，就必须升级到 OpenSSL 3.0 LTS 或最新的 3.1 版本。但迁移到更高版本的 OpenSSL 会带来风险和危险，一些依赖 OpenSSL 的服务可能会对更新反应迟钝，尤其是那些硬编码 OpenSSL 服务的物联网组件。实际上，企业宁可花钱让 OpenSSL 维护者和作者继续使用发霉的旧代码，比如，可以购买一份针对企业的价值 5 万美元的年度支持合同。消息来源：The Register老王点评：作为一个安全基础组件，这么干净利索的停止服务支持，总是有些不负责任。
硬核观察 #809 安卓占所有操作系统份额的 40% 以上
安卓占所有操作系统份额的 40% 以上Statcounter 是一个网站分析服务，在 150 万个网站上安装了跟踪代码，记录每个网站的数十亿次页面浏览。据 Statcounter 最新数据，安卓占全球所有操作系统份额为 42.37%，Windows 30.11%、iOS 17.6%、OS X 6.24%、除了安卓之外的 Linux 1.04%。而就桌面市场而言，Windows 占 75.93%，OS X 15.74%，Linux 2.6%，Chrome OS 2.38%。对于移动市场，安卓占 70.96%，iOS 28.43%。消息来源：Statcounter老王点评：安卓的成功，也是移动操作系统的成功，也是广义上的 Linux 的成功。英国准备立法废除传真机传真机由施乐公司在 1964 年商业化，1980 年代起被世界各地的企业广泛使用，如今已被电子邮件、扫描仪、云端传真和即时通讯服务所取代。虽然传真机早已过时，但英国卫生服务机构仍在大量使用它，英国国家医疗服务系统现在还有数百台传真机。英国通信监管机构 Ofcom 表示它准备修订电信规则淘汰传真机。消息来源：The Register老王点评：之前利用互联网发送传真都被视作违法，而现今，几乎没有人用传真了。OpenSSL 3 漏洞补丁释出，危险程度比预想要轻由于 OpenSSL 3 出现了严重安全漏洞，原计划在 10 月底发布的 Fedora Linux 37 延迟发布。现在，OpenSSL 3 发布了补丁，修复了两个缓冲溢出漏洞。漏洞等级从之前被认为与“心脏流血”漏洞相当的“超危”降为“高危”。这两个漏洞影响所有 OpenSSL 3.x 系列，不过目前主要使用的版本 OpenSSL 1.x 不受影响。消息来源：Phoronix老王点评：还好，不过互联网安全需要更可靠安全的 SSL 实现。
硬核观察 #681 首颗树莓派卫星完成了创纪录的飞行
首颗树莓派卫星完成了创纪录的飞行第一颗使用树莓派 Zero W 作为飞行计算机的迷你卫星于 5 月重新进入地球大气层，在太空中完成了创纪录的 117 天。这颗卫星于 2022 年 1 月从国际空间站部署，是由美国犹他州立大学的大学生们开发的。它是一个立方体模块，尺寸只有 10 厘米见方，使用现成的组件建造。这颗卫星 80% 以上的软件是用 Python 编写的，并且有个装置检查其“心跳”，如果出现问题就重启解决，事实证明“重启试试”在太空同样有效。其主要目的是测试一个实验性的充气稳定系统，成功地证明了小型航天器可以在轨道上自我稳定。消息来源：ZDNet老王点评：看来放个卫星也没什么难的，希望以后我们自己的空间站上也可以让同学们制造卫星放出去。微软的内部 Linux 发行版支持内核实时补丁上个月，微软发布了 CBL-Mariner 2.0 的第一个生产版本，这个微软内部的 Linux 发行版，用于支持从微软 Azure 到 WSL 用例等服务。CBL-Mariner 2.0 上周末进行了一次相当大的月度更新，增加了 Kpatch 以支持内核补丁，以及为内核启用实时补丁。消息来源：Phoronix老王点评：我感觉微软的这个内部发行版不声不响的也发展的挺快，真有一天抢了后 CentOS 市场，我觉得也不会太吃惊。刚刚发布的 OpenSSL 3.0.4 可能存在一个比心脏流血更严重的漏洞6 月 21 日发布的 OpenSSL 3.0.4 是为了解决一个命令注入漏洞，该漏洞在之前的补丁中没有完全解决。但这个版本本身需要进一步修复，安全研究人员称，它“容易受到远程内存损坏的影响，攻击者可以轻而易举地触发它”，可以被利用来在其中一台设备上运行任意的恶意代码。如果这个缺陷可以被远程利用（现在还不确定），它可能比心脏流血漏洞更严重。好消息是这个漏洞只影响英特尔 2016 年至 2022 年初发布的带有 AVX512 的某些 x64 芯片。消息来源：The Register老王点评：虽然可能影响面有限，但是一旦发布新的版本就赶快升级吧。
Firefox 92 发布Mozilla 释出了 Firefox 92。主要新特性包括：使用 HTTPS DNS 记录自动升级到 HTTPS，如果一个域名支持 HTTPS 那么在浏览器上输入该域名的 HTTP 地址将会自动升级到 HTTPS；添加了对 AVIF 图像格式的默认支持；全域色彩级支持视频播放；此外还有 bug 和安全修正等等。其实这些都不重要，重要的是，如何挽回老用户的心。OpenSSL 3.0 正式发布经过许多开发快照和三年的工作，OpenSSL 发布了 3.0。OpenSSL 3.0 从之前的 OpenSSL 和 SSLeay 双许可证转为在 Apache 2.0 许可证下发布。与之前的 OpenSSL 1.1 相比，OpenSSL 3.0 具有更大的可扩展性，对陈旧代码进行了清理和废弃以及架构上的改进。它迁移到一个基于提供者的架构，支持 Linux 内核的 TLS、完全“可插拔”的 TLSv1.3 组。OpenSSL 的上古代码终于迎来了新的更新。ATM 机加速退场，一年淘汰 6.54 万台短短几年，ATM 机已经从“银行业最有用的发明”逐渐没落。根据央行数据显示，截至 2021 年二季度末，ATM 机具 98.67 万台，相较同期的 105.21 万台一年减少了 6.54 万台。全国 ATM 机数量高峰时期在 2018 年末达 111.08 万台。而从 2019 年开始，ATM 数量开始缩水。信息化带来的影响，可能现在很多人都不带钱包、现金了吧。
硬核观察 #306 国产的全功能 Linux 平板电脑 JingPad A1 众筹成功
国产的全功能 Linux 平板电脑 JingPad A1 众筹成功对于动手能力强的个人用户来说，确实可以尝试在手机或平板电脑上安装“适当的” Linux 发行版。但当前正在 Indiegogo 上众筹的 JingPad Linux 平板，或许是一个更切实际的选择。它的众筹价格为 549 美元，首日就达成了超过五倍的众筹目标。它采用的是之前发布的国产操作系统 JingOS。虽然有着类似苹果 iPadOS 的外观，但 JingOS 的底层还是基于开源的 Linux 桌面。得益于成熟的 Linux 桌面，用户能够轻松体验 LibreOffice、GIMP 等常用软件，以及流行的开发者 / 系统管理工具。看起来不错，但是感觉价格并不便宜，希望我们可以尽早做个测评分享给大家。OpenSSL 3.0 候选版本发布经过了十几个 alpha 版本后，OpenSSL 3.0 今天发布了候选版本，它将在下季度发布正式版本。新的版本号跳过了 2.x，直接从 1.1.x 到了 3.0。OpenSSL 3.0 已经迁移到一个基于提供者的架构，以允许更大的灵活性。完全可插拔的 TLSv1.3组，新的编码器和解码器支持，完整的证书管理协议（CMP）实现，新的 API，以及对内核 TLS 的集成支持是 OpenSSL 3.0 的许多大变化之一。另外 OpenSSL 3.0 现在是在 Apache 2.0 许可证下授权的，而之前是采用 “OpenSSL 许可证”和 “Original SSLeay 许可证”双许可证授权的。在得到更多的关注和支持之后，OpenSSL 开始奋起直追，从公布的特性看，应该值得这个大版本跳跃。联想 ThinkPad 发布驱动支持在 Linux 设置 BIOS联想发布了一个新的 Think-LMI 驱动，即将进入 Linux 主线内核。该驱动允许在支持 WMI 接口的ThinkPad 及其它联想系统上查看和改变 BIOS/固件设置。支持读取/配置的 BIOS 选项通过 sysfs 的 /sys/class/firmware-attributes/* 暴露给用户空间。该驱动预计会进入 Linux 5.14。通过 sysfs 公开 BIOS 设置并不是一个全新的概念。从去年开始，戴尔率先为 Linux 开展了固件属性的工作。虽然不是开源的 BIOS 和固件，但是能在 Linux 内设置感觉是一种进步。
Telnet 缺乏加密，这使得 OpenSSL 成为连接远程系统的更安全的选择。telnet 命令是最受欢迎的网络故障排除工具之一，从系统管理员到网络爱好者都可以使用。在网络计算的早期，telnet 被用来连接到一个远程系统。你可以用 telnet 访问一个远程系统的端口，登录并在该主机上运行命令。由于 telnet 缺乏加密功能，它在很大程度上已经被 OpenSSL 取代了这项工作。然而，作为一种智能的 ping，telnet 的作用仍然存在（甚至在某些情况下至今仍然存在）。虽然 ping 命令是一个探测主机响应的好方法，但这是它能做的 全部。另一方面，telnet 不仅可以确认一个活动端口，而且还可以与该端口的服务进行交互。即便如此，由于大多数现代网络服务都是加密的，telnet 的作用可能要小得多，这取决于你想实现什么。OpenSSL s\_client对于大多数曾经需要 telnet 的任务，我现在使用 OpenSSL 的 s_client 命令。（我在一些任务中使用 curl，但那些情况下我可能无论如何也不会使用 telnet）。大多数人都知道 OpenSSL 是一个加密的库和框架，但不是所有人都意识到它也是一个命令。openssl 命令的 s_client 组件实现了一个通用的 SSL 或 TLS 客户端，帮助你使用 SSL 或 TLS 连接到远程主机。它是用来测试的，至少在内部使用与该库相同的功能。安装 OpenSSLOpenSSL 可能已经安装在你的 Linux 系统上了。如果没有，你可以用你的发行版的软件包管理器安装它：$ sudo dnf install openssl 在 Debian 或类似的系统上：$ sudo apt install openssl 安装后，验证它的响应是否符合预期：$ openssl version OpenSSL x.y.z FIPS 验证端口访问最基本的 telnet 用法是一个看起来像这样的任务：$ telnet mail.example.com 25 Trying 98.76.54.32... Connected to example.com. Escape character is '^]'. 在此示例中，这将与正在端口 25（可能是邮件服务器）监听的任意服务打开一个交互式会话。只要你获得访问权限，就可以与该服务进行通信。如果端口 25 无法访问，连接就会被拒绝。OpenSSL 也是类似的，尽管通常较少互动。要验证对一个端口的访问：$ openssl s_client -connect example.com:80 CONNECTED(00000003) 140306897352512:error:1408F10B:SSL [...] no peer certificate available No client certificate CA names sent SSL handshake has read 5 bytes and written 309 bytes Verification: OK New, (NONE), Cipher is (NONE) Secure Renegotiation IS NOT supported Compression: NONE Expansion: NONE No ALPN negotiated Early data was not sent Verify return code: 0 (ok) 但是，这仅是目标性 ping。从输出中可以看出，没有交换 SSL 证书，所以连接立即终止。为了充分利用 openssl s_client，你必须连接加密的端口。交互式 OpenSSLWeb 浏览器和 Web 服务器进行交互，可以使指向 80 端口的流量实际上被转发到 443，这是保留给加密 HTTP 流量的端口。知道了这一点，你就可以用 openssl 命令连接到加密的端口，并与在其上运行的任何网络服务进行交互。首先，使用 SSL 连接到一个端口。使用 -showcerts 选项会使 SSL 证书打印到你的终端上，一开始的输出要比 telnet 要冗长得多：$ openssl s_client -connect example.com:443 -showcerts [...] 0080 - 52 cd bd 95 3d 8a 1e 2d-3f 84 a0 e3 7a c0 8d 87 R...=..-?...z... 0090 - 62 d0 ae d5 95 8d 82 11-01 bc 97 97 cd 8a 30 c1 b.............0. 00a0 - 54 78 5c ad 62 5b 77 b9-a6 35 97 67 65 f5 9b 22 Tx\\.b[w..5.ge.." 00b0 - 18 8a 6a 94 a4 d9 7e 2f-f5 33 e8 8a b7 82 bd 94 ..j...~/.3...... Start Time: 1619661100 Timeout : 7200 (sec) Verify return code: 0 (ok) Extended master secret: no Max Early Data: 0 - read R BLOCK 你被留在一个交互式会话中。最终，这个会话将关闭，但如果你及时行动，你可以向服务器发送 HTTP 信号：[...] GET / HTTP/1.1 HOST: example.com 按回车键两次，你会收到 example.com/index.html 的数据：[...] Example Domain This domain is for use in illustrative examples in documents. You may use this domain in literature without prior coordination or asking for permission. More information... Email 服务器你也可以使用 OpenSSL 的 s_client 来测试一个加密的 Email 服务器。要做到这点，你必须把你的测试用户的用户名和密码用 Base64 编码。这里有一个简单的方法来做到：$ perl -MMIME::Base64 -e 'print encode_base64("username");' $ perl -MMIME::Base64 -e 'print encode_base64("password");' 当你记录了这些值，你就可以通过 SSL 连接到邮件服务器，它通常在 587 端口：$ openssl s_client -starttls smtp \ -connect email.example.com:587 > ehlo example.com > auth login ##paste your user base64 string here## ##paste your password base64 string here## > mail from: noreply@example.com > rcpt to: admin@example.com > data > Subject: Test 001 This is a test email. . > quit 检查你的邮件（在这个示例代码中，是 admin@example.com），查看来自 noreply@example.com 的测试邮件。OpenSSL 还是 Telnet？telnet 仍然有用途，但它已经不是以前那种不可缺少的工具了。该命令在许多发行版上被归入 “遗留” 网络软件包，而且还没有 telnet-ng 之类的明显的继任者，管理员有时会对它被排除在默认安装之外感到疑惑。答案是，它不再是必不可少的，它的作用越来越小，这 很好。网络安全很重要，所以要适应与加密接口互动的工具，这样你就不必在排除故障时禁用你的保护措施。via: https://opensource.com/article/21/5/drop-telnet-openssl作者：Seth Kenlon 选题：lujun9972 译者：geekpi 校对：wxy本文由 LCTT 原创编译，Linux中国 荣誉推出
OpenSSL 是一个实用工具，它可以确保其他人员无法打开你的敏感和机密消息。加密是对消息进行编码的一种方法，这样可以保护消息的内容免遭他人窥视。一般有两种类型：密钥加密或对称加密公钥加密或非对称加密 密钥加密 secret-key encryption 使用相同的密钥进行加密和解密，而 公钥加密 public-key encryption 使用不同的密钥进行加密和解密。每种方法各有利弊。密钥加密速度更快，而公钥加密更安全，因为它解决了安全共享密钥的问题，将它们结合在一起可以最大限度地利用每种类型的优势。公钥加密公钥加密使用两组密钥，称为密钥对。一个是公钥，可以与你想要秘密通信的任何人自由共享。另一个是私钥，应该是一个秘密，永远不会共享。公钥用于加密。如果某人想与你交流敏感信息，你可以将你的公钥发送给他们，他们可以使用公钥加密消息或文件，然后再将其发送给你。私钥用于解密。解密发件人加密的消息的唯一方法是使用私钥。因此，它们被称为“密钥对”，它们是相互关联的。如何使用 OpenSSL 加密文件OpenSSL 是一个了不起的工具，可以执行各种任务，例如加密文件。本文使用安装了 OpenSSL 的 Fedora 计算机。如果你的机器上没有，则可以使用软件包管理器进行安装：alice $ cat /etc/fedora-release Fedora release 33 (Thirty Three) alice $ alice $ openssl version OpenSSL 1.1.1i FIPS 8 Dec 2020 alice $ 要探索文件加密和解密，假如有两个用户 Alice 和 Bob，他们想通过使用 OpenSSL 交换加密文件来相互通信。步骤 1：生成密钥对在加密文件之前，你需要生成密钥对。你还需要一个 密码短语 passphrase ，每当你使用 OpenSSL 时都必须使用该密码短语，因此务必记住它。Alice 使用以下命令生成她的一组密钥对：alice $ openssl genrsa -aes128 -out alice_private.pem 1024 此命令使用 OpenSSL 的 genrsa 命令生成一个 1024 位的公钥/私钥对。这是可以的，因为 RSA 算法是不对称的。它还使用了 aes128 对称密钥算法来加密 Alice 生成的私钥。输入命令后，OpenSSL 会提示 Alice 输入密码，每次使用密钥时，她都必须输入该密码：alice $ openssl genrsa -aes128 -out alice_private.pem 1024 Generating RSA private key, 1024 bit long modulus (2 primes) ..........+++++ ..................................+++++ e is 65537 (0x010001) Enter pass phrase for alice_private.pem: Verifying - Enter pass phrase for alice_private.pem: alice $ alice $ alice $ ls -l alice_private.pem -rw-------. 1 alice alice 966 Mar 22 17:44 alice_private.pem alice $ alice $ file alice_private.pem alice_private.pem: PEM RSA private key alice $ Bob 使用相同的步骤来创建他的密钥对：bob $ openssl genrsa -aes128 -out bob_private.pem 1024 Generating RSA private key, 1024 bit long modulus (2 primes) ..................+++++ ............................+++++ e is 65537 (0x010001) Enter pass phrase for bob_private.pem: Verifying - Enter pass phrase for bob_private.pem: bob $ bob $ ls -l bob_private.pem -rw-------. 1 bob bob 986 Mar 22 13:48 bob_private.pem bob $ bob $ file bob_private.pem bob_private.pem: PEM RSA private key bob $ 如果你对密钥文件感到好奇，可以打开命令生成的 .pem 文件，但是你会看到屏幕上的一堆文本：alice $ head alice_private.pem -----BEGIN RSA PRIVATE KEY----- Proc-Type: 4,ENCRYPTED DEK-Info: AES-128-CBC,E26FAC1F143A30632203F09C259200B9 [binary] alice $ 要查看密钥的详细信息，可以使用以下 OpenSSL 命令打开 .pem 文件并显示内容。你可能想知道在哪里可以找到另一个配对的密钥，因为这是单个文件。你观察的很细致，获取公钥的方法如下：alice $ openssl rsa -in alice_private.pem -noout -text Enter pass phrase for alice_private.pem: RSA Private-Key: (1024 bit, 2 primes) modulus: 00:bd:e8:61:72:f8:f6:c8:f2:cc:05:fa:07:aa:99: 47:a6:d8:06:cf:09:bf:d1:66:b7:f9:37:29:5d:dc: c7:11:56:59:d7:83:b4:81:f6:cf:e2:5f:16:0d:47: 81:fe:62:9a:63:c5:20:df:ee:d3:95:73:dc:0a:3f: 65:d3:36:1d:c1:7d:8b:7d:0f:79:de:80:fc:d2:c0: e4:27:fc:e9:66:2d:e2:7e:fc:e6:73:d1:c9:28:6b: 6a:8a:e8:96:9d:65:a0:8a:46:e0:b8:1f:b0:48:d4: db:d4:a3:7f:0d:53:36:9a:7d:2e:e7:d8:f2:16:d3: ff:1b:12:af:53:22:c0:41:51 publicExponent: 65537 (0x10001) << 截断 >> exponent2: 6e:aa:8c:6e:37:d0:57:37:13:c0:08:7e:75:43:96: 33:01:99:25:24:75:9c:0b:45:3c:a2:39:44:69:84: a4:64:48:f4:5c:bc:40:40:bf:84:b8:f8:0f:1d:7b: 96:7e:16:00:eb:49:da:6b:20:65:fc:a9:20:d9:98: 76:ca:59:e1 coefficient: 68:9e:2e:fa:a3:a4:72:1d:2b:60:61:11:b1:8b:30: 6e:7e:2d:f9:79:79:f2:27:ab:a0:a0:b6:45:08:df: 12:f7:a4:3b:d9:df:c5:6e:c7:e8:81:29:07:cd:7e: 47:99:5d:33:8c:b7:fb:3b:a9:bb:52:c0:47:7a:1c: e3:64:90:26 alice $ 步骤 2：提取公钥注意，公钥是你可以与他人自由共享的密钥，而你必须将私钥保密。因此，Alice 必须提取她的公钥，并将其保存到文件中：alice $ openssl rsa -in alice_private.pem -pubout > alice_public.pem Enter pass phrase for alice_private.pem: writing RSA key alice $ alice $ ls -l *.pem -rw-------. 1 alice alice 966 Mar 22 17:44 alice_private.pem -rw-rw-r--. 1 alice alice 272 Mar 22 17:47 alice_public.pem alice $ 你可以使用与之前相同的方式查看公钥详细信息，但是这次，输入公钥 .pem 文件：alice $ alice $ openssl rsa -in alice_public.pem -pubin -text -noout RSA Public-Key: (1024 bit) Modulus: 00:bd:e8:61:72:f8:f6:c8:f2:cc:05:fa:07:aa:99: 47:a6:d8:06:cf:09:bf:d1:66:b7:f9:37:29:5d:dc: c7:11:56:59:d7:83:b4:81:f6:cf:e2:5f:16:0d:47: 81:fe:62:9a:63:c5:20:df:ee:d3:95:73:dc:0a:3f: $ Bob 可以按照相同的过程来提取他的公钥并将其保存到文件中：bob $ openssl rsa -in bob_private.pem -pubout > bob_public.pem Enter pass phrase for bob_private.pem: writing RSA key bob $ bob $ ls -l *.pem -rw-------. 1 bob bob 986 Mar 22 13:48 bob_private.pem -rw-r--r--. 1 bob bob 272 Mar 22 13:51 bob_public.pem bob $ 步骤 3：交换公钥这些公钥在 Alice 和 Bob 彼此交换之前没有太大用处。有几种共享公钥的方法，例如使用 scp 命令将密钥复制到彼此的工作站。将 Alice 的公钥发送到 Bob 的工作站：alice $ scp alice_public.pem bob@bob-machine-or-ip:/path/ 将 Bob 的公钥发送到 Alice 的工作站：bob $ scp bob_public.pem alice@alice-machine-or-ip:/path/ 现在，Alice 有了 Bob 的公钥，反之亦然：alice $ ls -l bob_public.pem -rw-r--r--. 1 alice alice 272 Mar 22 17:51 bob_public.pem alice $ bob $ ls -l alice_public.pem -rw-r--r--. 1 bob bob 272 Mar 22 13:54 alice_public.pem bob $ 步骤 4：使用公钥交换加密的消息假设 Alice 需要与 Bob 秘密交流。她将秘密信息写入文件中，并将其保存到 top_secret.txt 中。由于这是一个普通文件，因此任何人都可以打开它并查看其内容，这里并没有太多保护：alice $ alice $ echo "vim or emacs ?" > top_secret.txt alice $ alice $ cat top_secret.txt vim or emacs ? alice $ 要加密此秘密消息，Alice 需要使用 openssls -encrypt 命令。她需要为该工具提供三个输入：秘密消息文件的名称Bob 的公钥（文件）加密后新文件的名称alice $ openssl rsautl -encrypt -inkey bob_public.pem -pubin -in top_secret.txt -out top_secret.enc alice $ alice $ ls -l top_secret.* -rw-rw-r--. 1 alice alice 128 Mar 22 17:54 top_secret.enc -rw-rw-r--. 1 alice alice 15 Mar 22 17:53 top_secret.txt alice $ alice $ 加密后，原始文件仍然是可见的，而新创建的加密文件在屏幕上看起来像乱码。这样，你可以确定秘密消息已被加密：alice $ cat top_secret.txt vim or emacs ? alice $ alice $ cat top_secret.enc �s��uM)M&>��N��}dmCy92#1X�q?��v���M��@��E�~��1�k~&PU�VhHL�@^P��(��zi�M�4p�e��g+R�1�Ԁ���s�������q_8�lr����C�I-��alice $ alice $ alice $ alice $ hexdump -C ./top_secret.enc 00000000 9e 73 12 8f e3 75 4d 29 4d 26 3e bf 80 4e a0 c5 |.s...uM)M&>..N..| 00000010 7d 64 6d 43 79 39 32 23 31 58 ce 71 f3 ba 95 a6 |}dmCy92#1X.q....| 00000020 c0 c0 76 17 fb f7 bf 4d ce fc 40 e6 f4 45 7f db |..v....M..@..E..| 00000030 7e ae c0 31 f8 6b 10 06 7e 26 50 55 b5 05 56 68 |~..1.k..~&PU..Vh| 00000040 48 4c eb 40 5e 50 fe 19 ea 28 a8 b8 7a 13 69 d7 |HL.@^P...(..z.i.| 00000050 4d b0 34 70 d8 65 d5 07 95 67 2b 52 ea 31 aa d4 |M.4p.e...g+R.1..| 00000060 80 b3 a8 ec a1 73 ed a7 f9 17 c3 13 d4 fa c1 71 |.....s.........q| 00000070 5f 38 b9 6c 07 72 81 a6 fe af 43 a6 49 2d c4 ee |_8.l.r....C.I-..| 00000080 alice $ alice $ file top_secret.enc top_secret.enc: data alice $ 删除秘密消息的原始文件是安全的，这样确保任何痕迹都没有：alice $ rm -f top_secret.txt 现在，Alice 需要再次使用 scp 命令将此加密文件通过网络发送给 Bob 的工作站。注意，即使文件被截获，其内容也会是加密的，因此内容不会被泄露：alice $ scp top_secret.enc bob@bob-machine-or-ip:/path/ 如果 Bob 使用常规方法尝试打开并查看加密的消息，他将无法看懂该消息：bob $ ls -l top_secret.enc -rw-r--r--. 1 bob bob 128 Mar 22 13:59 top_secret.enc bob $ bob $ cat top_secret.enc �s��uM)M&>��N��}dmCy92#1X�q?��v���M��@��E�~��1�k~&PU�VhHL�@^P��(��zi�M�4p�e��g+R�1�Ԁ���s�������q_8�lr����C�I-��bob $ bob $ bob $ hexdump -C top_secret.enc 00000000 9e 73 12 8f e3 75 4d 29 4d 26 3e bf 80 4e a0 c5 |.s...uM)M&>..N..| 00000010 7d 64 6d 43 79 39 32 23 31 58 ce 71 f3 ba 95 a6 |}dmCy92#1X.q....| 00000020 c0 c0 76 17 fb f7 bf 4d ce fc 40 e6 f4 45 7f db |..v....M..@..E..| 00000030 7e ae c0 31 f8 6b 10 06 7e 26 50 55 b5 05 56 68 |~..1.k..~&PU..Vh| 00000040 48 4c eb 40 5e 50 fe 19 ea 28 a8 b8 7a 13 69 d7 |HL.@^P...(..z.i.| 00000050 4d b0 34 70 d8 65 d5 07 95 67 2b 52 ea 31 aa d4 |M.4p.e...g+R.1..| 00000060 80 b3 a8 ec a1 73 ed a7 f9 17 c3 13 d4 fa c1 71 |.....s.........q| 00000070 5f 38 b9 6c 07 72 81 a6 fe af 43 a6 49 2d c4 ee |_8.l.r....C.I-..| 00000080 bob $ 步骤 5：使用私钥解密文件Bob 需要使用 OpenSSL 来解密消息，但是这次使用的是 -decrypt 命令行参数。他需要向工具程序提供以下信息：加密的文件（从 Alice 那里得到）Bob 的私钥（用于解密，因为文件是用 Bob 的公钥加密的）通过重定向保存解密输出的文件名bob $ openssl rsautl -decrypt -inkey bob_private.pem -in top_secret.enc > top_secret.txt Enter pass phrase for bob_private.pem: bob $ 现在，Bob 可以阅读 Alice 发送给他的秘密消息：bob $ ls -l top_secret.txt -rw-r--r--. 1 bob bob 15 Mar 22 14:02 top_secret.txt bob $ bob $ cat top_secret.txt vim or emacs ? bob $ Bob 需要回复 Alice，因此他将秘密回复写在一个文件中：bob $ echo "nano for life" > reply_secret.txt bob $ bob $ cat reply_secret.txt nano for life bob $ 步骤 6：使用其他密钥重复该过程为了发送消息，Bob 采用和 Alice 相同的步骤，但是由于该消息是发送给 Alice 的，因此他需要使用 Alice 的公钥来加密文件：bob $ openssl rsautl -encrypt -inkey alice_public.pem -pubin -in reply_secret.txt -out reply_secret.enc bob $ bob $ ls -l reply_secret.enc -rw-r--r--. 1 bob bob 128 Mar 22 14:03 reply_secret.enc bob $ bob $ cat reply_secret.enc �F݇��.4"f�1��\��{o԰$�M��I{5�|�\�l͂�e��Y�V��{�|!$c^a �*Ԫ\vQ�Ϡ9����'��ٮsP��'��Z�1W�n��k���J�0�I;P8������&:bob $ bob $ bob $ hexdump -C ./reply_secret.enc 00000000 92 46 dd 87 04 bc a7 2e 34 22 01 66 1a 13 31 db |.F......4".f..1.| 00000010 c4 5c b4 8e 7b 6f d4 b0 24 d2 4d 92 9b 49 7b 35 |.\..{o..$.M..I{5| 00000020 da 7c ee 5c bb 6c cd 82 f1 1b 92 65 f1 8d f2 59 |.|.\.l.....e...Y| 00000030 82 56 81 80 7b 89 07 7c 21 24 63 5e 61 0c ae 2a |.V..{..|!$c^a..*| 00000040 d4 aa 5c 76 51 8d cf a0 39 04 c1 d7 dc f0 ad 99 |..\vQ...9.......| 00000050 27 ed 8e de d9 ae 02 73 50 e0 dd 27 13 ae 8e 5a |'......sP..'...Z| 00000060 12 e4 9a 31 57 b3 03 6e dd e1 16 7f 6b c0 b3 8b |...1W..n....k...| 00000070 4a cf 30 b8 49 3b 50 38 e0 9f 84 f6 83 da 26 3a |J.0.I;P8......&:| 00000080 bob $ bob $ # remove clear text secret message file bob $ rm -f reply_secret.txt Bob 通过 scp 将加密的文件发送至 Alice 的工作站：$ scp reply_secret.enc alice@alice-machine-or-ip:/path/ 如果 Alice 尝试使用常规工具去阅读加密的文本，她将无法理解加密的文本：alice $ alice $ ls -l reply_secret.enc -rw-r--r--. 1 alice alice 128 Mar 22 18:01 reply_secret.enc alice $ alice $ cat reply_secret.enc �F݇��.4"f�1��\��{o԰$�M��I{5�|�\�l͂�e��Y�V��{�|!$c^a �*Ԫ\vQ�Ϡ9����'��ٮsP��'��Z�1W�n��k���J�0�I;P8������&:alice $ alice $ alice $ alice $ hexdump -C ./reply_secret.enc 00000000 92 46 dd 87 04 bc a7 2e 34 22 01 66 1a 13 31 db |.F......4".f..1.| 00000010 c4 5c b4 8e 7b 6f d4 b0 24 d2 4d 92 9b 49 7b 35 |.\..{o..$.M..I{5| 00000020 da 7c ee 5c bb 6c cd 82 f1 1b 92 65 f1 8d f2 59 |.|.\.l.....e...Y| 00000030 82 56 81 80 7b 89 07 7c 21 24 63 5e 61 0c ae 2a |.V..{..|!$c^a..*| 00000040 d4 aa 5c 76 51 8d cf a0 39 04 c1 d7 dc f0 ad 99 |..\vQ...9.......| 00000050 27 ed 8e de d9 ae 02 73 50 e0 dd 27 13 ae 8e 5a |'......sP..'...Z| 00000060 12 e4 9a 31 57 b3 03 6e dd e1 16 7f 6b c0 b3 8b |...1W..n....k...| 00000070 4a cf 30 b8 49 3b 50 38 e0 9f 84 f6 83 da 26 3a |J.0.I;P8......&:| 00000080 alice $ 所以，她使用 OpenSSL 解密消息，只不过这次她提供了自己的私钥并将输出保存到文件中：alice $ openssl rsautl -decrypt -inkey alice_private.pem -in reply_secret.enc > reply_secret.txt Enter pass phrase for alice_private.pem: alice $ alice $ ls -l reply_secret.txt -rw-rw-r--. 1 alice alice 14 Mar 22 18:02 reply_secret.txt alice $ alice $ cat reply_secret.txt nano for life alice $ 了解 OpenSSL 的更多信息OpenSSL 在加密界是真正的瑞士军刀。除了加密文件外，它还可以执行许多任务，你可以通过访问 OpenSSL 文档页面来找到使用它的所有方式，包括手册的链接、 《OpenSSL Cookbook》、常见问题解答等。要了解更多信息，尝试使用其自带的各种加密算法，看看它是如何工作的。via: https://opensource.com/article/21/4/encryption-decryption-openssl作者：Gaurav Kamathe 选题：lujun9972 译者：MjSeven 校对：wxy本文由 LCTT 原创编译，Linux中国 荣誉推出
硬核观察 | Grafana、Loki 和 Tempo 改用 AGPLv3 许可证
Grafana、Loki 和 Tempo 改用 AGPLv3 许可证过去几年，多个知名的开源项目如 Elastic、Redis Labs 和 MongoDB 出于盈利考虑而修改许可证，切换到非自由的商业授权许可证（SSPL）。开发 Grafana 以及 Loki 和 Tempo 等开源项目的 Grafana Labs 公司决定不这么做，它宣布旗下核心开源项目采用的许可证从 Apache License 2.0 切换到 AGPL v3，允许其他人自由修改和提供服务，但修改的版本需要回馈上游。Grafana Labs 公司表示，它这么做是试图在开源和社区的“价值创造”以及商业化策略的“价值获取”上取得平衡。这也是一个不错的尝试，就是不知道 AGPL 是否能适当的保护开源项目，并与商业组织取得合适的平衡。明尼苏达大学开发者被禁止向 Linux 内核提供代码明尼苏达大学的 Qiushi Wu（博士生）和 Kangjie Lu（助理教授）提交了一篇研究论文《通过伪装的提交在开源软件中隐蔽地引入漏洞》，以看似有益的提交实际上引入了其他关键问题。而根据最近 Linux 内核接到的一些补丁来看，他们选择了 Linux 内核项目来进行他们的实验。负责维护 Linux 内核的格雷（GKH）是仅次于 Linus 的负责人，他对这种行为进行了强烈谴责！但是发送这些补丁的人认为这只是他们写的一个静态分析器提交的补丁，最多只是质量不佳。格雷认为这些是谎言，愤怒之下决定禁止该大学向 Linux 内核提交代码，并撤销了他们之前提交的补丁。简直是够了，Linux 内核不是试验场，供任何人随意摆弄。Google 资助开发 OpenSSL 的替代品 Rustls许多 SSL/TLS 库由于是用 C 语言编写的，所以安全问题由来已久。通过使用 Rust 开发的 OpenSSL 替代品 Rustls，开发人员可以尽可能确保代码是内存安全的，这将大大减少安全问题的数量。互联网安全研究组（ISRG）宣布，谷歌已经为 Rust 开发者提供了资金，以对 Rustls 进行改进。ISRG 将使用 Rustls 来使 Apache HTTP 服务器更加安全。期待看到 Rustls 能证明 Rust 的成功。
通过 OpenSSL 深入了解密码学的细节：哈希值、数字签名、数字证书等。本系列的第一篇文章通过 OpenSSL 库和命令行实用程序介绍了哈希、加密/解密、数字签名和数字证书。这第二篇文章将对细节进行深入探讨。让我们从计算中无处不在的哈希开始，并考虑是什么使哈希函数具备密码学意义。密码学哈希OpenSSL 源代码的下载页面包含了一个带有最新版本的表格。每个版本都有两个 哈希值 hash ：160 位 SHA1 和 256 位 SHA256。这些值可以用来验证下载的文件是否与存储库中的原始文件相匹配：下载者在本地重新计算下载文件的哈希值，然后将结果与原始文件进行比较。现代系统有计算这种哈希值的实用程序。例如，Linux 有 md5sum 和 sha256sum。OpenSSL 本身也提供了类似的命令行实用程序。哈希值被用于计算的许多领域。例如，比特币区块链使用 SHA256 哈希值作为区块标识符。挖比特币就是生成一个低于指定阈值的 SHA256 哈希值，也就是至少有 N 个前导零的哈希值。（N 的值可以上升或下降，这取决于特定时间的挖矿生产力）。作为一个兴趣点，如今的矿机是为并行生成 SHA256 哈希值而设计的硬件集群。在 2018 年的一个高峰期，全球的比特币矿工每秒产生约 7500 万个 太哈希值 terahash —— 这真是一个不可思议的数字。网络协议也使用哈希值（在这里通常叫做“ 校验和 checksum ”）来支持消息的完整性；也就是说，保证收到的消息与发送的消息是一样的。消息发送者计算消息的校验和，并将结果与消息一起发送。当消息到达时，接收方重新计算校验和。如果发送的校验和与重新计算的校验和不一致，那么消息在传输过程中可能出现了一些问题，或者发送的校验和出现了问题，或者两者都出现了问题。在这种情况下，应该重新发送消息和它的校验和，或者至少应该触发一个错误情况。（如 UDP 这样的低级网络协议不会理会校验和。）哈希的其他例子大家都很熟悉。比如一个网站，要求用户用密码进行验证，用户在浏览器中输入密码，然后，他们通过 HTTPS 连接到服务器，密码从浏览器加密发送到服务器。一旦密码到达服务器，就会被解密，然后进行数据库表的查询。在这个查询表中应该存储什么？存储密码本身是有风险的。风险要小得多的方式是存储一个由密码生成的哈希值，也许在计算哈希值之前“加一些 盐 salt （额外的位）改善口味”。你的密码可能会被发送到 Web 服务器上，但网站可以向你保证，密码不会存储在那里。哈希值还出现在安全的各个领域。例如， 基于哈希值的消息认证码 hash-based message authentication code （HMAC）使用一个哈希值和一个秘密的 加密密钥 cryptographic key 来认证通过网络发送的消息。HMAC 码轻量级且易于在程序中使用，在 Web 服务中很受欢迎。一个 X509 数字证书包括一个称为 指纹 fingerprint 的哈希值，它可以方便证书验证。一个存放于内存中的 可信存储 truststore 可以实现为一个以这种指纹为键的查找表 —— 作为一个支持恒定查找时间的 哈希映射 hash map 。来自传入的证书的指纹可以与可信存储中的密钥进行比较，以确定是否匹配。 密码学哈希函数 cryptographic hash function 应该具有什么特殊属性？它应该是 单向 one-way 的，这意味着很难被逆转。一个加密哈希函数应该是比较容易计算的，但是计算它的反函数（将哈希值映射回输入位串的函数）在计算上应该是困难的。下面是一个描述，用 chf 作为加密哈希函数，我的密码 foobar 作为样本输入。 +---+ foobar—>|chf|—>hash value ## 简单直接 +--–+ 相比之下，逆向操作是不可行的： +-----------+ hash value—>|chf inverse|—>foobar ## 棘手困难 +-----------+ 例如，回忆一下 SHA256 哈希函数。对于一个任意长度为 N > 0 的输入位串，这个函数会生成一个 256 位的固定长度的哈希值；因此，这个哈希值甚至不会反映出输入位串的长度 N，更不用说字符串中每个位的值了。顺便说一下，SHA256 不容易受到 长度扩展攻击 length extension attack 。唯一有效的逆向工程方法是通过蛮力搜索将计算出的 SHA256 哈希值逆向返回到输入位串，这意味着需要尝试所有可能的输入位串，直到找到与目标哈希值匹配的位串。这样的搜索在 SHA256 这样一个完善的加密哈希函数上是不可行的。现在，最后一个回顾的知识点是 有序 in order 。加密哈希值是统计学上的唯一，而不是无条件的唯一，这意味着两个不同的输入位串产生相同的哈希值是不太可能的，但也不是不可能的 —— 这称之为 碰撞 collision 。生日问题提供了一个很好的反直觉的碰撞例子。对各种哈希算法的 抗碰撞性 collision resistance 有着广泛的研究。例如，MD5（128 位哈希值）在大约 2 21 次哈希之后，抗碰撞能力就会崩溃。对于 SHA1（160 位哈希值），大约在 2 61 次哈希后开始崩溃。对于 SHA256 的抗碰撞能力的剖析，目前还没有一个很好的估计。这个事实并不奇怪。SHA256 有 2 256 个不同的哈希值范围，这个数字的十进制表示法有 78 位之多！那么，SHA256 哈希会不会发生碰撞呢？当然可能，但可能性极小。在下面的命令行示例中，有两个输入文件被用作位串源：hashIn1.txt 和 hashIn2.txt。第一个文件包含 abc，第二个文件包含 1a2b3c。为了便于阅读，这些文件包含的是文本，但也可以使用二进制文件代替。在命令行（百分号 % 是提示符）使用 Linux sha256sum 实用程序对这两个文件进行处理产生以下哈希值（十六进制）:% sha256sum hashIn1.txt 9e83e05bbf9b5db17ac0deec3b7ce6cba983f6dc50531c7a919f28d5fb3696c3 hashIn1.txt % sha256sum hashIn2.txt 3eaac518777682bf4e8840dd012c0b104c2e16009083877675f00e995906ed13 hashIn2.txt OpenSSL 哈希对应的结果与预期相同：% openssl dgst -sha256 hashIn1.txt SHA256(hashIn1.txt)= 9e83e05bbf9b5db17ac0deec3b7ce6cba983f6dc50531c7a919f28d5fb3696c3 % openssl dgst -sha256 hashIn2.txt SHA256(hashIn2.txt)= 3eaac518777682bf4e8840dd012c0b104c2e16009083877675f00e995906ed13 这种对密码学哈希函数的研究，为我们仔细研究数字签名及其与密钥对的关系奠定了基础。数字签名顾名思义， 数字签字 digital signature 可以附在文件或其他一些电子 工件 artifact （如程序）上，以证明其真实性。因此，这种签名类似于纸质文件上的手写签名。验证数字签名就是要确认两件事：第一，被担保的工件在签名被附上后没有改变，因为它部分是基于文件的加密学哈希值。第二，签名属于一个人（例如 Alice），只有她才能获得一对密钥中的私钥。顺便说一下，对代码（源码或编译后的代码）进行数字签名已经成为程序员的普遍做法。让我们来了解一下数字签名是如何创建的。如前所述，没有公钥和私钥对就没有数字签名。当使用 OpenSSL 创建这些密钥时，有两个独立的命令：一个是创建私钥，另一个是从私钥中提取匹配的公钥。这些密钥对用 base64 编码，在这个过程中可以指定它们的大小。 私钥 private key 由数值组成，其中两个数值（一个 模数 modulus 和一个 指数 exponent ）组成了公钥。虽然私钥文件包含了 公钥 public key ，但提取出来的公钥并不会透露相应私钥的值。因此，生成的带有私钥的文件包含了完整的密钥对。将公钥提取到自己的文件中是很实用的，因为这两把钥匙有不同的用途，而这种提取方式也将私钥可能被意外公开的危险降到最低。接下来，这对密钥的私钥被用来生成目标工件（如电子邮件）的哈希值，从而创建签名。在另一端，接收者的系统使用这对密钥的公钥来验证附在工件上的签名。现在举个例子。首先，用 OpenSSL 生成一个 2048 位的 RSA 密钥对：openssl genpkey -out privkey.pem -algorithm rsa 2048 在这个例子中，我们可以舍去 -algorithm rsa 标志，因为 genpkey 默认为 RSA 类型。文件的名称（privkey.pem）是任意的，但是 隐私增强邮件 Privacy Enhanced Mail （PEM）扩展名 .pem 是默认 PEM 格式的惯用扩展名。（如果需要的话，OpenSSL 有命令可以在各种格式之间进行转换。）如果需要更大的密钥大小（例如 4096），那么最后一个参数 2048 可以改成 4096。这些大小总是二的幂。下面是产生的 privkey.pem 文件的一个片断，它是 base64 编码的：-----BEGIN PRIVATE KEY----- MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBANnlAh4jSKgcNj/Z JF4J4WdhkljP2R+TXVGuKVRtPkGAiLWE4BDbgsyKVLfs2EdjKL1U+/qtfhYsqhkK ... -----END PRIVATE KEY----- 接下来的命令就会从私钥中提取出这对密钥的公钥：openssl rsa -in privkey.pem -outform PEM -pubout -out pubkey.pem 由此产生的 pubkey.pem 文件很小，可以在这里完整地显示出来：-----BEGIN PUBLIC KEY----- MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDZ5QIeI0ioHDY/2SReCeFnYZJY z9kfk11RrilUbT5BgIi1hOAQ24LMilS37NhHYyi9VPv6rX4WLKoZCmkeYaWk/TR5 4nbH1E/AkniwRoXpeh5VncwWMuMsL5qPWGY8fuuTE27GhwqBiKQGBOmU+MYlZonO O0xnAKpAvysMy7G7qQIDAQAB -----END PUBLIC KEY----- 现在，有了密钥对，数字签名就很容易了 —— 在本例中，源文件 client.c 是要签名的工件：openssl dgst -sha256 -sign privkey.pem -out sign.sha256 client.c client.c 源文件的摘要是 SHA256，私钥在前面创建的 privkey.pem 文件中。由此产生的二进制签名文件是 sign.sha256，这是一个任意的名字。要得到这个文件的可读版本（比如 base64），后续命令是：openssl enc -base64 -in sign.sha256 -out sign.sha256.base64 文件 sign.sha256.base64 现在包含如下内容：h+e+3UPx++KKSlWKIk34fQ1g91XKHOGFRmjc0ZHPEyyjP6/lJ05SfjpAJxAPm075 VNfFwysvqRGmL0jkp/TTdwnDTwt756Ej4X3OwAVeYM7i5DCcjVsQf5+h7JycHKlM o/Jd3kUIWUkZ8+Lk0ZwzNzhKJu6LM5KWtL+MhJ2DpVc= 或者，可执行文件 client 也可以被签名，由此产生的 base64 编码签名将如预期的不同：VMVImPgVLKHxVBapJ8DgLNJUKb98GbXgehRPD8o0ImADhLqlEKVy0HKRm/51m9IX xRAN7DoL4Q3uuVmWWi749Vampong/uT5qjgVNTnRt9jON112fzchgEoMb8CHNsCT XIMdyaPtnJZdLALw6rwMM55MoLamSc6M/MV1OrJnk/g= 这一过程的最后一步是用公钥验证数字签名。作为验证的一个重要步骤，应重新计算用于签署工件（在本例中，是可执行的 client 程序）的哈希值，因为验证过程应表明工件在签署后是否发生了变化。有两个 OpenSSL 命令用于这个目的。第一条命令是对 base64 签名进行解码。openssl enc -base64 -d -in sign.sha256.base64 -out sign.sha256 第二条是核实签名：openssl dgst -sha256 -verify pubkey.pem -signature sign.sha256 client 第二条命令的输出，应该是这样的：Verified OK 为了了解验证失败时的情况，一个简短但有用的练习是将最后一个 OpenSSL 命令中的可执行的 client 文件替换为源文件 client.c，然后尝试验证。另一个练习是改变 client 程序，无论多么轻微，然后再试一次。数字证书 数字证书 digital certificate 汇集了到目前为止所分析的各个部分：哈希值、密钥对、数字签名和加密/解密。生产级证书的第一步是创建一个 证书签名请求 certificate signing request （CSR），然后将其发送给 证书颁发机构 certificate authority （CA）。在 OpenSSL 的例子中，要做到这一点，请运行：openssl req -out myserver.csr -new -newkey rsa:4096 -nodes -keyout myserverkey.pem 这个例子生成了一个 CSR 文档，并将该文档存储在文件 myserver.csr（base64 文本）中。这里的目的是：CSR 文档要求 CA 保证与指定域名相关联的身份，域名也就是 CA 所说的 通用名 common name （CN）。尽管可以使用现有的密钥对，但这个命令也会生成一个新的密钥对。请注意，在诸如 myserver.csr 和 myserverkey.pem 等名称中使用 server 暗示了数字证书的典型用途：作为与 www.google.com 等域名相关的 Web 服务器的身份担保。然而，无论数字证书如何使用，同样使用这个命令都会创建一个 CSR。它还会启动一个问题/回答的交互式会话，提示有关域名的相关信息，以便与请求者的数字证书相连接。这个交互式会话可以通过在命令中提供基本的信息，用反斜杠来续行一步完成。-subj 标志提供了所需的信息。% openssl req -new \ -newkey rsa:2048 -nodes -keyout privkeyDC.pem \ -out myserver.csr \ -subj "/C=US/ST=Illinois/L=Chicago/O=Faulty Consulting/OU=IT/CN=myserver.com" 产生的 CSR 文件在发送给 CA 之前可以进行检查和验证。这个过程可以创建具有所需格式（如 X509）、签名、有效期等的数字证书。openssl req -text -in myserver.csr -noout -verify 这是输出的一个片断：verify OK Certificate Request: Data: Version: 0 (0x0) Subject: C=US, ST=Illinois, L=Chicago, O=Faulty Consulting, OU=IT, CN=myserver.com Subject Public Key Info: Public Key Algorithm: rsaEncryption Public-Key: (2048 bit) Modulus: 00:ba:36:fb:57:17:65:bc:40:30:96:1b:6e:de:73: … Exponent: 65537 (0x10001) Attributes: a0:00 Signature Algorithm: sha256WithRSAEncryption … 自签证书在开发 HTTPS 网站的过程中，手头有一个不用经过 CA 流程的数字证书是很方便的。在 HTTPS 握手的认证阶段， 自签证书 self-signed certificate 就能满足要求，尽管任何现代浏览器都会警告说这样的证书毫无价值。继续这个例子，自签证书的 OpenSSL 命令（有效期为一年，使用 RSA 公钥）如下：openssl req -x509 -sha256 -nodes -days 365 -newkey rsa:4096 -keyout myserver.pem -out myserver.crt 下面的 OpenSSL 命令呈现了生成的证书的可读版本：openssl x509 -in myserver.crt -text -noout 这是自签证书的部分输出：Certificate: Data: Version: 3 (0x2) Serial Number: 13951598013130016090 (0xc19e087965a9055a) Signature Algorithm: sha256WithRSAEncryption Issuer: C=US, ST=Illinois, L=Chicago, O=Faulty Consulting, OU=IT, CN=myserver.com Validity Not Before: Apr 11 17:22:18 2019 GMT Not After : Apr 10 17:22:18 2020 GMT Subject: C=US, ST=Illinois, L=Chicago, O=Faulty Consulting, OU=IT, CN=myserver.com Subject Public Key Info: Public Key Algorithm: rsaEncryption Public-Key: (4096 bit) Modulus: 00:ba:36:fb:57:17:65:bc:40:30:96:1b:6e:de:73: ... Exponent: 65537 (0x10001) X509v3 extensions: X509v3 Subject Key Identifier: 3A:32:EF:3D:EB:DF:65:E5:A8:96:D7:D7:16:2C:1B:29:AF:46:C4:91 X509v3 Authority Key Identifier: keyid:3A:32:EF:3D:EB:DF:65:E5:A8:96:D7:D7:16:2C:1B:29:AF:46:C4:91 X509v3 Basic Constraints: CA:TRUE Signature Algorithm: sha256WithRSAEncryption 3a:eb:8d:09:53:3b:5c:2e:48:ed:14:ce:f9:20:01:4e:90:c9: ... 如前所述，RSA 私钥包含的值是用来生成公钥的。但是，给定的公钥不会泄露匹配的私钥。关于底层数学理论的介绍，见 https://simple.wikipedia.org/wiki/RSA_algorithm。数字证书与用于生成该证书的密钥对之间存在着重要的对应关系，即使证书只是自签的：数字证书包含构成公钥的指数和模数值。这些值是最初生成的 PEM 文件中密钥对的一部分，在本例中，是文件 myserver.pem。 指数 exponent 几乎总是 65,537（如本例中），所以可以忽略。密钥对的 模数 modulus 应该与数字证书的模数相匹配。模数是一个很大的值，为了便于阅读，可以进行哈希处理。下面是两个 OpenSSL 命令，它们检查相同的模数，从而确认数字证书是基于 PEM 文件中的密钥对。% openssl x509 -noout -modulus -in myserver.crt | openssl sha1 ## 证书中的模数 (stdin)= 364d21d5e53a59d482395b1885aa2c3a5d2e3769 % openssl rsa -noout -modulus -in myserver.pem | openssl sha1 ## 密钥中的模数 (stdin)= 364d21d5e53a59d482395b1885aa2c3a5d2e3769 所产生的哈希值匹配，从而确认数字证书是基于指定的密钥对。回到密钥分发问题上让我们回到第一部分末尾提出的一个问题：client 程序和 Google Web 服务器之间的 TLS 握手。握手协议有很多种，即使是用在 client 例子中的 Diffie-Hellman 版本也有不同的方式。尽管如此，client 例子遵循了一个共同的模式。首先，在 TLS 握手过程中，client 程序和 Web 服务器就 加密套件 cipher suite 达成一致，其中包括要使用的算法。在本例中，该套件是 ECDHE-RSA-AES128-GCM-SHA256。现在值得关注的两个要素是 RSA 密钥对算法和 AES128 块密码，用于在握手成功的情况下对消息进行加密和解密。关于加密/解密，这个过程有两种流派： 对称 symmetric 和 非对称 asymmetric 。在对称流派中，加密和解密使用的是相同的密钥，这首先就引出了 密钥分发问题 key distribution problem 。如何将密钥安全地分发给双方？在非对称流派中，一个密钥用于加密（在这种情况下，是 RSA 公钥），但另一个密钥用于解密（在这种情况下，是来自同一对密钥的 RSA 私钥）。client 程序拥有来认证证书的 Google Web 服务器的公钥，而 Web 服务器拥有来自同一对密钥的私钥。因此，client 程序可以向 Web 服务器发送加密信息，而 Web 服务器可以单独对该通信进行解密。在 TLS 的情况下，对称方式有两个显著的优势：在 client 程序与 Google Web 服务器之间的互动中，认证是单向的。Google Web 服务器向 client 程序发送三张证书，但 client 程序并没有向 Web 服务器发送证书，因此，Web 服务器没有来自客户端的公钥，无法加密发给客户端的消息。使用 AES128 的对称加密/解密比使用 RSA 密钥的非对称加密/解密快了近千倍。TLS 握手将两种加密/解密方式巧妙地结合在一起。在握手过程中，client 程序会生成随机位，即所谓的 预主密 pre-master secret （PMS）。然后，client 程序用服务器的公钥对 PMS 进行加密，并将加密后的 PMS 发送给服务器，服务器再用 RSA 密钥对的私钥对 PMS 信息进行解密： +-------------------+ encrypted PMS +--------------------+ client PMS--->|server’s public key|--------------->|server’s private key|--->server PMS +-------------------+ +--------------------+ 在这个过程结束时，client 程序和 Google Web 服务器现在拥有相同的 PMS 位。每一方都使用这些位生成一个 主密码 master secret ，并立即生成一个称为 会话密钥 session key 的对称加密/解密密钥。现在有两个不同但等价的会话密钥，连接的每一方都有一个。在 client 的例子中，会话密钥是 AES128 类的。一旦在 client 程序和 Google Web 服务器两边生成了会话密钥，每一边的会话密钥就会对双方的对话进行保密。如果任何一方（例如，client 程序）或另一方（在这种情况下，Google Web 服务器）要求重新开始握手，握手协议（如 Diffie-Hellman）允许整个 PMS 过程重复进行。总结在命令行上说明的 OpenSSL 操作也可以通过底层库的 API 完成。这两篇文章重点使用了这个实用程序，以保持例子的简短，并专注于加密主题。如果你对安全问题感兴趣，OpenSSL 是一个很好的开始地方，并值得深入研究。via: https://opensource.com/article/19/6/cryptography-basics-openssl-part-2作者：Marty Kalin 选题：lujun9972 译者：wxy 校对：wxy本文由 LCTT 原创编译，Linux中国 荣誉推出
介绍OpenSSL 是一个多功能的命令行工具，可以用于与 公钥基础设施 （ Public Key Infrastructure ） （PKI）和 HTTPS（HTTP over TLS）相关的大量任务。这本小抄风格的指南提供了 OpenSSL 命令的快速参考，这些命令在常见的日常场景中非常有用。这包括生成私钥、 证书签署请求 （ certificate signing request ） （CSR）和证书格式转换的 OpenSSL 示例，但它并没有涵盖 OpenSSL 的所有用途。如何使用本指南如果你不熟悉证书签署请求（CSR），请阅读第一部分。除了第一部分，本指南采用了简单的小抄格式：自带了命令行代码片段。跳到与你准备完成的任务相关的任何部分。大多数命令都是单行的，为了清晰起见，已经扩展到多行（使用 \ 符号）。关于证书签署请求（CSR）如果你想从 证书颁发机构 （ certificate authority ） （CA）那里获得 SSL 证书，你必须生成一个 证书签署请求 （ certificate signing request ） （CSR）。一个 CSR 主要是由一个密钥对的公钥和一些附加信息组成。当证书被签署时，这两部分都会被插入到证书中。每当你生成一个 CSR 时，你会被提示提供有关证书的信息。这些信息被称为 区分名称 （ Distinguised Name ） （DN）。DN 中的一个重要字段是 通用名称 （ Common Name ） （CN），它应该是你打算使用证书的主机的 完全合格域名 （ Fully Qualified Domain Name ） （FQDN）。当创建 CSR 时，也可以通过命令行或文件传递信息来跳过交互式提示。DN 中的其他项目提供了有关你的业务或组织的附加信息。如果你是从证书机构购买 SSL 证书，通常要求这些附加字段（如“ 组织 （ Organization ） ”）准确地反映你的组织的详细信息。下面是一个 CSR 信息提示的例子：--- Country Name (2 letter code) [AU]:US State or Province Name (full name) [Some-State]:New York Locality Name (eg, city) []:Brooklyn Organization Name (eg, company) [Internet Widgits Pty Ltd]:Example Brooklyn Company Organizational Unit Name (eg, section) []:Technology Division Common Name (e.g. server FQDN or YOUR name) []:examplebrooklyn.com Email Address []:如果你想非交互式地回答 CSR 信息提示，你可以通过在任何请求 CSR 信息的 OpenSSL 命令中添加 -subj 选项来实现。这里是该选项的一个例子，使用上面代码块中显示的相同信息：-subj "/C=US/ST=New York/L=Brooklyn/O=Example Brooklyn Company/CN=examplebrooklyn.com"现在你已经了解了 CSR，可以自由跳转到本指南中涵盖你的 OpenSSL 需求的任何一节。生成 CSR本节介绍了与生成 CSR（以及私钥，如果它们还不存在的话）有关的 OpenSSL 命令。CSR 可以用来向证书颁发机构请求 SSL 证书。请记住，你可以通过上一节中提到的 -subj 选项非交互式地添加 CSR 信息。生成一个私钥和一个 CSR如果你想使用 HTTPS（HTTP over TLS）来保护你的 Apache HTTP 或 Nginx Web 服务器的安全，并且你想使用一个证书颁发机构（CA）来颁发 SSL 证书，那么就使用这个方法。生成的 CSR 可以发送给 CA，请求签发由 CA 签名的 SSL 证书。如果你的 CA 支持 SHA-2，请添加 -sha256 选项，用 SHA-2 签署 CSR。这条命令从头开始创建一个 2048 位的私钥（domain.key）和一个 CSR（domain.csr）：openssl req \ -newkey rsa:2048 -nodes -keyout domain.key \ -out domain.csr回答 CSR 信息提问，完成该过程。选项 -newkey rsa:2048 指定密钥应该是 2048 位，使用 RSA 算法生成。选项 -nodes 指定私钥没有用密码加密。这里没有包含 -new 选项，而是隐含在其中，表示正在生成一个 CSR。从现有的私钥中生成一个 CSR如果你已经有了私钥，并想用它向 CA 申请证书，请使用这个方法。该命令基于现有的私钥（domain.key）创建一个新的 CSR（domain.csr）：openssl req \ -key domain.key \ -new -out domain.csr回答 CSR 信息提问，完成该过程。选项 -key 指定一个现有的私钥（domain.key)，它将被用来生成一个新的 CSR。选项 -new 表示正在生成一个 CSR。从现有的证书和私钥生成 CSR如果你想更新现有的证书，但由于某些原因，你或你的 CA 没有原始的 CSR，请使用这个方法。基本上可以省去重新输入 CSR 信息的麻烦，因为它是从现有证书中提取信息的。该命令基于现有的证书（domain.crt）和私钥（domain.key）创建一个新的 CSR（domain.csr）：openssl x509 \ -in domain.crt \ -signkey domain.key \ -x509toreq -out domain.csr选项 -x509toreq 指定你使用一个 X509 证书来制作 CSR。生成 SSL 证书如果你想使用 SSL 证书来确保服务的安全，但你不需要 CA 签名的证书，一个有效的（和免费的）解决方案是签署你自己的证书。你可以自己签发的一种常见证书是 自签证书 （ self-signed certificate ） 。自签证书是用自己的私钥签署的证书。自签证书和 CA 签名证书一样可以用来加密数据，但是你的用户会显示一个警告，说这个证书不被他们的计算机或浏览器信任。因此，只有当你不需要向用户证明你的服务身份时，才可以使用自签名证书（例如非生产或非公开服务器）。本节介绍与生成自签名证书相关的 OpenSSL 命令。生成自签证书如果你想使用 HTTPS（HTTP over TLS）来保护你的 Apache HTTP 或 Nginx Web 服务器，并且你不需要你的证书由 CA 签名，那么就使用这个方法。这个命令可以从头开始创建一个 2048 位的私钥（domain.key）和一个自签证书（domain.crt）：openssl req \ -newkey rsa:2048 -nodes -keyout domain.key \ -x509 -days 365 -out domain.crt回答 CSR 信息提问，完成该过程。选项 -x509 告诉 req 子命令创建一个自签名的证书。-days 365 选项指定证书的有效期为 365 天。它会生成一个临时的 CSR，以收集与证书相关的信息。从现有私钥生成自签名证书如果你已经有了一个私钥，并且你想用它来生成一个自签证书，请使用这个方法。这条命令可以从现有的私钥（domain.key）中创建一个自签证书（domain.crt）：openssl req \ -key domain.key \ -new \ -x509 -days 365 -out domain.crt回答 CSR 信息提问，完成该过程。选项 -x509 告诉 req 子命令创建一个自签证书。-days 365 选项指定证书的有效期为 365 天。选项 -new 启用 CSR 信息提问。从现有的私钥和 CSR 生成自签证书如果你已经有了私钥和 CSR，并且你想用它们生成一个自签证书，请使用这个方法。这条命令将从现有的私钥（domain.key）和（domain.csr）中创建一个自签证书（domain.crt）。openssl x509 \ -signkey domain.key \ -in domain.csr \ -req -days 365 -out domain.crt选项 -days 365 指定证书的有效期为 365 天。查看证书证书和 CSR 文件是以 PEM 格式编码的，不适合被人读取。本节介绍的 OpenSSL 命令将输出 PEM 编码文件的实际条目。查看 CSR 条目该命令允许你查看和验证纯文本的 CSR（domain.csr）的内容：openssl req \ -text -noout -verify \ -in domain.csr查看证书条目该命令允许你查看纯文本证书（domain.crt）的内容：openssl x509 \ -text -noout \ -in domain.crt验证证书由 CA 签署使用此命令验证证书（domain.crt）是否由特定的 CA 证书（ca.crt）签署：openssl verify \ -verbose -CAFile ca.crt \ domain.crt私钥本节介绍了用于创建和验证私钥的 OpenSSL 命令。创建私钥使用该命令创建一个受密码保护的 2048 位私钥（domain.key）：openssl genrsa \ -des3 -out domain.key 2048在提示时输入密码以完成该过程。验证私钥使用此命令检查私钥（domain.key）是否为有效密钥：openssl rsa \ -check -in domain.key如果你的私钥已经加密，系统会提示你输入它的密码，成功后，未加密的密钥会在终端上输出。验证私钥是否与证书和 CSR 匹配使用这些命令来验证私钥（domain.key）是否匹配证书（domain.crt）和 CSR（domain.csr）：openssl rsa -noout -modulus -in domain.key | openssl md5 openssl x509 -noout -modulus -in domain.crt | openssl md5 openssl req -noout -modulus -in domain.csr | openssl md5如果每条命令的输出都是相同的，那么私钥、证书和 CSR 就极有可能是相关的。加密私钥这需要一个未加密的私钥（unencrypted.key），并输出它的加密版本（encrypted.key）：openssl rsa -des3 \ -in unencrypted.key \ -out encrypted.key输入你所需的密码，以加密私钥。解密私钥这需要一个加密的私钥（encrypted.key），并输出一个解密的版本（decrypted.key）：openssl rsa \ -in encrypted.key \ -out decrypted.key在提示时，输入加密密钥的密码。转换证书格式我们一直在使用的所有证书都是 ASCII 码 PEM 编码的 X.509 证书。还有很多其他的证书编码和容器类型；一些应用程序喜欢某些格式而不是其他格式。此外，这些格式中的许多格式可以在一个文件中包含多个项目，如私钥、证书和 CA 证书。OpenSSL 可以用来将证书在则西格式间转换。本节将介绍一些可能的转换。将 PEM 转换为 DER如果要将 PEM 编码的证书（domain.crt）转换为 DER 编码的证书（domain.der），即二进制格式，请使用此命令：openssl x509 \ -in domain.crt \ -outform der -out domain.derDER 格式通常与 Java 一起使用。将 DER 转换为 PEM如果要将 DER 编码的证书（domain.der）转换为 PEM 编码的证书（domain.crt），请使用此命令：openssl x509 \ -inform der -in domain.der \ -out domain.crt将 PEM 转换为 PKCS7如果你想把 PEM 证书（domain.crt 和 ca-chain.crt）添加到 PKCS7 文件（domain.p7b）中，请使用该命令：openssl crl2pkcs7 -nocrl \ -certfile domain.crt \ -certfile ca-chain.crt \ -out domain.p7b请注意，你可以使用一个或多个 -certfile 选项来指定要添加到 PKCS7 文件中的证书。PKCS7 文件，也被称为 P7B，通常用于 Java Keystores 和 Microsoft IIS（Windows）。它们是 ASCII 文件，可以包含证书和 CA 证书。将 PKCS7 转换为 PEM如果你想将 PKCS7 文件（domain.p7b）转换为 PEM 文件，请使用该命令：openssl pkcs7 \ -in domain.p7b \ -print_certs -out domain.crt请注意，如果你的 PKCS7 文件中有多个项目（如证书和 CA 中间证书)，创建的 PEM 文件将包含其中的所有项目。将 PEM 转换为 PKCS12如果你想使用私钥（domain.key）和证书（domain.crt），并将它们组合成一个 PKCS12 文件（domain.pfx），请使用这个命令：openssl pkcs12 \ -inkey domain.key \ -in domain.crt \ -export -out domain.pfx系统会提示你输入导出密码，你可以留空。请注意，在这种情况下，你可以通过将多个证书连接到一个 PEM 文件（domain.crt）中来添加一个证书链到 PKCS12 文件中。PKCS12 文件，也被称为 PFX 文件，通常用于在 Micrsoft IIS（Windows）中导入和导出证书链。将 PKCS12 转换为 PEM如果你想转换 PKCS12 文件（domain.pfx）并将其转换为 PEM 格式（domain.combined.crt），请使用此命令：openssl pkcs12 \ -in domain.pfx \ -nodes -out domain.combined.crt请注意，如果你的 PKCS12 文件中有多个项目（如证书和私钥），创建的 PEM 文件将包含其中的所有项目。OpenSSL 版本openssl version 命令可以用来检查你正在运行的版本。你正在运行的 OpenSSL 版本，以及编译时使用的选项会影响到你可以使用的功能（有时也会影响到命令行选项）。下面的命令显示了你正在运行的 OpenSSL 版本，以及它被编译时的所有选项：openssl version -a本指南是使用具有如下细节的 OpenSSL 二进制文件编写的（参见前面命令的输出）：OpenSSL 1.0.1f 6 Jan 2014 built on: Mon Apr 7 21:22:23 UTC 2014 platform: debian-amd64 options: bn(64,64) rc4(16x,int) des(idx,cisc,16,int) blowfish(idx) compiler: cc -fPIC -DOPENSSL_PIC -DOPENSSL_THREADS -D_REENTRANT -DDSO_DLFCN -DHAVE_DLFCN_H -m64 -DL_ENDIAN -DTERMIO -g -O2 -fstack-protector --param=ssp-buffer-size=4 -Wformat -Werror=format-security -D_FORTIFY_SOURCE=2 -Wl,-Bsymbolic-functions -Wl,-z,relro -Wa,--noexecstack -Wall -DMD32_REG_T=int -DOPENSSL_IA32_SSE2 -DOPENSSL_BN_ASM_MONT -DOPENSSL_BN_ASM_MONT5 -DOPENSSL_BN_ASM_GF2m -DSHA1_ASM -DSHA256_ASM -DSHA512_ASM -DMD5_ASM -DAES_ASM -DVPAES_ASM -DBSAES_ASM -DWHIRLPOOL_ASM -DGHASH_ASM OPENSSLDIR: "/usr/lib/ssl"总结这应该涵盖了大多数人如何使用 OpenSSL 来处理 SSL 证书的情况！它还有很多其他的用途，在这里没有介绍，所以请在评论中随时询问或建议其他用途。如果你在使用这些命令时遇到了问题，请一定要评论（并附上你的 OpenSSL 版本输出）。via: https://www.digitalocean.com/community/tutorials/openssl-essentials-working-with-ssl-certificates-private-keys-and-csrs 作者：Mitchell Anicas 选题：wxy 译者：wxy 校对：wxy本文由 LCTT 原创编译，Linux中国 荣誉推出