程序员如何在 HTTPS 中高效配置通配符证书?| 技术头条

640?wx_fmt=gif

640?wx_fmt=jpeg

作者 | 阿文

责编 | 郭芮

HTTPS 并不是一个新鲜玩意......2017年1月1日起,苹果公司强制使用HTTPS 协议传输,其开发者必须使用 HTTPS 进行数据传输;2017年2月份,谷歌为了推进 HTTPS 的在网络上的应用,表示 Chrome 浏览器会将用户访问的 HTTP 页面标记为“不安全”——近几年,互联网巨头们都在极力地推广 HTTPS,目的就是为了保证数据安全。


640?wx_fmt=png

 

现在,微信小程序也要求必须使用 HTTPS 协议,新一代的 HTTP/2 协议的支持也需以 HTTPS 为基础。



640?wx_fmt=png

为什么巨头都放弃了 HTTP?



这要从 HTTP 这个协议本身说起。HTTP 是一个明文传输的协议,其协议设计时并没有提供数据加密的机制,因此在数据传输过程中,你的数据就相当于是在“裸奔“,这样带来的问题就是很容易被不法分子劫持。


HTTP 最容易被运营商劫持。当我们访问一个 HTTP 网站,其数据要经过运营商的网络进行数据传输,在传输过程中,运营商可以对 HTTP 协议进行劫持,修改 html 代码,在其中插入 JS 或 DOM 牟利。


除了运营商劫持之外, 通过 HTTP 协议进行数据传输还容易被攻击者监听和中间人攻击,从而获取网站帐户和敏感信息等。


HTTPS 的优势


因为 HTTP 协议不安全,因此有了 HTTPS,多了个 S,就多了一份安全。


HTTPS 是利用 SSL/TLS 来对 HTTP 数据包进行加密传输,这样一来,数据在传输过程中就不再是“裸奔”了。


HTTPS 提供了:


  • 内容加密建立一个信息安全通道,来保证数据传输的安全;

  • 身份认证确认网站的真实性;

  • 数据完整性防止内容被第三方冒充或者篡改。


HTTPS 的信任继承基于预先安装在浏览器中的证书颁发机构,简称 CA。浏览器默认都会内置一些 CA 机构的根证书,只有可信任的 CA 机构颁发的证书,浏览器才会信任。


Let's Encrypt


Let's Encrypt 是一个是非营利性的互联网安全研究组(ISRG),它提供了一个免费、自动化和开放的证书颁发机构。目前 Let's Encrypt 已为 1.5亿个网站提供 SSL 证书。


Let's Encrypt 的优势:


  • 免费:拥有域名的任何人都可以零成本获得可信证书;

  • 自动:在Web服务器上运行的软件可以与其交互,以便轻松获取证书,安全地配置它以供使用,并自动进行续订;

  • 安全:无论是在CA方面还是通过帮助网站运营商正确保护其服务器;

  • 透明:所有颁发或撤销的证书将被公开记录,供任何人查阅;

  • 开放:自动发布和续订协议将作为其他人可以采用的开放标准发布;

  • 合作:就像基础互联网协议本身一样,是一项让社区受益的共同努力。

 

通过 Let's Encrypt 签发一个证书,目前其证书的生命周期为 90天,当证书快过期时,会自动向 Let's Encrypt 服务器发送续签申请,再续签一个周期。这一优势是其他按年签发免费证书无法提供的。


Let's Encrypt 之所以能够实现自动签发证书,实际上是依赖其提供的证书自动续签协议 ACME,目前IETF已将ACME协议标准化为RFC 8555。此外Let's Encrypt 还提供通配符证书,并且还是免费提供的,这也是在 CA 中少有的。


通过 ACME 协议,我们可以实现全自动化的管理证书,对于证书的操作,我们只需要做一次,后续的升级续签完全无需人工干预。


我们可以通过 acme.sh 这个开源项目来进行证书的签发和自动升级。acme.sh 是一个纯 SHELL 实现 ACME 协议的脚本。


 

640?wx_fmt=png

使用 acme.sh 签发一个证书



首先,我们需要安装脚本:


curl https://get.acme.sh | sh


acme.sh 提供了多种方式来进行证书的签发,例如 DNS 模式、独立模式、Apache 模式、Nginx模式等等。


以 DNS 模式为例,我们签发一个证书:


acme.sh --issue --dns -d example.com -d www.example.com -d cp.example.com


如果需要签发一个通配符证书,我们可以这样:


acme.sh --issue --dns -d example.com -d *.example.com 


脚本会发送请求到 CA 机构,CA 机构会要求你对域名进行认证,即需要你添加 TXT 记录来认证域名所有权。认证通过后,执行如下命令签发即可:


acme.sh --renew -d example.com


此外,该脚本最大的优势是支持自动API 集成,上述案例通过 DNS 方式签发证书需要手工干预,你需要到域名解析商添加TXT 记录,这对于做自动持续集成来说很不方便。因此acme.sh 提供了多家域名厂商的 API 集成,经过简单的配置即可完全自动化进行域名申请和域名解析的添加以及续签。


具体的使用方法可以参考说明文档(https://github.com/Neilpang/acme.sh/tree/master/dnsapi)。


以 Googaddy 为例,我们获取 AK 和 SK后执行:


export GD_Key=""
export GD_Secret=""


然后签发证书:


640?wx_fmt=png


脚本会在120秒内调用域名解析商的接口自动添加域名解析然后完成认证。


640?wx_fmt=png


签发完的证书会保存在 ~/.acme.sh/ 目录下,它包含以下几个文件:


640?wx_fmt=png


通常建议加载证书选择公钥文件为fullchain.cer 的公钥文件,这样避免一些浏览器无法识别根证书或中间证书从而导致浏览器报错,例如提示证书不受信任。


接下来,在你的 Web 服务器进行证书的配置即可:

 

  listen 443 http2 ssl;
  server_name www.awen.me awen.me;
  index index.html index.htm;
  ssl_certificate /usr/local/nginx/ssl/awen.me.rsa.cer;
  ssl_certificate_key /usr/local/nginx/ssl/awen.me.rsa.key;
  ssl_ciphers EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+ECDSA+AES128:EECDH+aRSA+AES128:RSA+AES128:EECDH+ECDSA+AES256:EECDH+aRSA+AES256:RSA+AES256:EECDH+ECDSA+3DES:EECDH+aRSA+3DES:RSA+3DES:TLS-CHACHA20-POLY1305-SHA256:TLS-AES-256-GCM-SHA384:TLS-AES-128-GCM-SHA256:EECDH+CHACHA20:EECDH+AESGCM:EECDH+AES:HIGH:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!KRB5:!aECDH:!EDH+3DES;
 ssl_prefer_server_ciphers  on;




640?wx_fmt=jpeg

 热 文 推 荐 

西安到底需不需要互联网?

Google 要进军游戏行业了?!

☞ 华为京东联手,火拼小米生态链!

315 后,等待失业的程序员

☞ 套路贷+套路培训,IT 培训机构造假术大公开 | 程序员有话说

那位13岁就当上老板的开发者是如何炼成的?

☞ 好莱坞大片! 为躲避死亡威胁, 只用15步, 这个密码朋克大叔就从世界"消失"了...

确认!贾扬清加盟阿里,任技术副总裁

都道业务提升坑大事儿多,但英特尔云方案却说“简单”

☞ Python 爬取蔡徐坤的 10 万转发数据,竟是假流量?


 

System.out.println("点个在看吧!");
console.log("点个在看吧!");
print("点个在看吧!");
printf("点个在看吧!\n");
cout << "点个在看吧!" << endl;
Console.WriteLine("点个在看吧!");
Response.Write("点个在看吧!");
alert("点个在看吧!")
echo "点个在看吧!"

640?wx_fmt=gif点击阅读原文,输入关键词,即可搜索您想要的 优快云 文章。

640?wx_fmt=png 喜欢就点击“在看”吧!
### 配置 VSCode 中的 MinGW-w64 以支持通配符编译 在 Windows 环境中,使用 VSCode 配置 MinGW-w64 编译器时,若希望支持通配符(如 `*.c`)进行编译,需要特别注意环境变量和任务配置中的参数设置。 确保 MinGW-w64 的 `bin` 目录已添加到系统环境变量 `PATH` 中。例如,若安装路径为 `D:\mingw64\bin`,则应将该路径添加到系统 `PATH` 变量中。完成设置后,在任意命令行中输入 `gcc --version` 或 `g++ --version` 应能正确显示版本信息[^3]。 在 VSCode 中,通过 `tasks.json` 文件定义编译任务。为了使 GCC 能够识别 `*.c` 等通配符,需在任务配置中设置环境变量 `MSYS2_ARG_CONV_EXCL` 为 `*`,以启用通配符扩展功能。以下是一个完整的 `tasks.json` 配置示例: ```json { "version": "2.0.0", "tasks": [ { "type": "cppbuild", "label": "C/C++: gcc.exe 生成活动文件", "command": "D:/mingw64/bin/gcc.exe", "args": [ "-fdiagnostics-color=always", "-g", "*.c", "-o", "${workspaceFolder}\\${workspaceRootFolderName}.exe" ], "options": { "cwd": "${fileDirname}", "env": { "MSYS2_ARG_CONV_EXCL": "*" } }, "problemMatcher": ["$gcc"], "group": { "kind": "build", "isDefault": true }, "detail": "编译器: D:/mingw64/bin/gcc.exe" } ] } ``` 该配置确保了在调用 `gcc *.c` 命令时,通配符 `*.c` 能被正确展开为当前目录下的所有 `.c` 文件[^1]。 此外,也可以通过 `Makefile` 来管理更复杂的项目构建流程。利用 `wildcard` 函数自动获取所有 `.c` 文件,避免手动维护文件列表: ```makefile CC = gcc CFLAGS = -Wall -Wextra -g SRC = $(wildcard *.c) OBJ = $(SRC:.c=.o) all: $(OBJ) $(CC) $(OBJ) -o main.exe %.o: %.c $(CC) $(CFLAGS) -c $< -o $@ clean: rm -f *.o main.exe ``` 在 VSCode 中,可以配置任务运行 `make` 命令来执行构建和清理操作,从而简化项目管理。 --- ### 常见问题排查 - **编译错误:`*.c: Invalid argument`** 此错误通常出现在 MSYS2 环境下未启用通配符扩展时。确保在任务配置中设置了 `MSYS2_ARG_CONV_EXCL=*`,或避免使用通配符,手动列出所有源文件。 - **找不到输入文件** 若使用 `Makefile` 构建,确保 `wildcard` 函数正确识别所有 `.c` 文件,且文件名无拼写错误。 --- ### 相关问题 1. 如何在 Makefile 中正确使用 wildcard 函数处理多个 C 文件? 2. MSYS2 中为何默认禁用通配符扩展?如何永久启用? 3. 使用 GCC 编译时提示“no input files”,可能的原因有哪些? 4. 如何在 Windows 系统中彻底清理旧版本 MinGW 或 IDE 的残留环境变量?
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

优快云资讯

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值