本文使用「署名 4.0 国际 (CC BY 4.0)」许可协议,欢迎转载、或重新修改使用,但需要注明来源。 [署名 4.0 国际 (CC BY 4.0)](https://creativecommons.org/licenses/by/4.0/deed.zh) 本文作者: 苏洋 创建时间: 2022年10月22日 统计字数: 3579字 阅读时间: 8分钟阅读 本文链接: https://soulteary.com/2022/10/22/make-docker-tools-image-with-only-3md-self-signed-certificate-certs-maker.html ----- # 只有 3MB 的自签名证书制作 Docker 工具镜像:Certs Maker 本篇文章介绍一个小巧的 SSL 证书生成工具,考虑到跨平台运行,我将它构建成了 Docker 工具镜像,镜像尺寸只有 3MB 左右,还没有一张手机拍出来的照片大,应该算比较轻量了。 你可以使用它简单快速的生成包含多个域名的自签名证书,用在生产或者开发环境中。 ## 关于项目 这个工具的完整实现代码,我上传到了 GitHub:[https://github.com/soulteary/certs-maker](https://github.com/soulteary/certs-maker),相较两年前 1.x 版本中,我使用 Node.js 实现,在当前 2.x 新版本中,我选择使用 Go 进行替代实现。 在保持原有功能的前提下,Docker 镜像尺寸从 40多MB 骤降到了 3MB+;原本使用手动构建的镜像,也切换到了使用 GitHub Actions 自动构建,构建产物更加干净透明,“零添加、零污染”,用着更为放心。 ## 快速上手 如果你本地已经安装好 Docker 或者 ctr(`containerd`),可以直接使用下面这条命令快速生成包含(`*.lab.com` 和 `*.data.lab.com`)两个不同域名的证书: ```bash docker run --rm -it -v `pwd`/ssl:/ssl soulteary/certs-maker "--CERT_DNS=lab.com,*.lab.com,*.data.lab.com" ``` 在命令执行完毕之后,我们查看执行命令的目录,将能够看到创建了一个名为 `ssl` 的目录,里面包含了证书生成配置,以及我们可以直接使用的证书文件: ```bash ssl ├── lab.com.conf ├── lab.com.crt └── lab.com.key ``` 在去年年初,我分享过如何《[如何制作和使用自签名证书](https://soulteary.com/2021/02/06/how-to-make-and-use-a-self-signed-certificate.html)》,文章中分享了如何使用 OpenSSL 和自制的证书生成工具来生成自签名的证书。以及聊过了如何在各种系统、常见的 Java 应用中导入我们的生成的证书,有需要的同学可以自行前往了解,这里就不过多展开了。 当然,有的同学会更喜欢使用声明式的“配置文件”,这样做更利于使用 Git 等 CVS 的方式进行保存,便于长期进行生成内容和配置的管理。我们可以考虑使用一个简单的 `compose` 编排文件来进行证书生成: ```yaml version: '2' services: certs-maker: image: soulteary/certs-maker environment: - CERT_DNS=lab.com,*.lab.com,*.data.lab.com volumes: - ./ssl:/ssl ``` 将上面的内容保存为 `docker-compose.yml`,然后执行 `docker-compose up` 即可。当命令执行完毕,同样的,我们将能够在当前目录中看到生成好的证书文件和证书配置。 ## 详细定制证书信息 如果你是实用主义者,上面的方案已经能够解决我们在特殊场景或本地开发时的证书签名需求了。 但是,通过上面方式生成的证书文件,使用的信息是程序的默认信息。 ![使用默认配置生成的证书基础信息](https://attachment.soulteary.com/2022/10/22/certs-maker-with-default-info.png) 如果你是细节控,可以通过调整下面的参数来变更生成证书的相关信息。 ### 调整生成的命令行参数 假如我们使用 `docker run` 这种 CLI 的方式来生成证书,那么可以在参数中继续添加新的参数来调整证书的生成配置: ```bash docker run --rm -it -v `pwd`/ssl:/ssl soulteary/certs-maker "--CERT_DNS=lab.com,*.lab.com,*.data.lab.com" "--CERT_CN=SOULTEARY" ``` 再次查看生成证书信息,就能够看到信息已经发生了变化。 ![添加一个参数后生成证书的信息](https://attachment.soulteary.com/2022/10/22/certs-maker-with-custom-info.png) 工具支持的完整参数列表如下,可以根据自己的需求来选择使用: | 类型 | 名称 | 如何在环境变量中使用 | | ------------------------ | ----------- | --------------------------------------------- | | Country Name | CERT\\\_C | `--CERT_C=CN` | | State Or Province Name | CERT\\\_ST | `--CERT_ST=BJ` | | Locality Name | CERT\\\_L | `--CERT_L=HD` | | Organization Name | CERT\\\_O | `--CERT_O=Lab` | | Organizational Unit Name | CERT\\\_OU | `--CERT_OU=Dev` | | Common Name | CERT\\\_CN | `--CERT_CN=Hello World` | | Domains | CERT\\\_DNS | `--CERT_DNS=lab.com,*.lab.com,*.data.lab.com` | | Issue for K8s | FOR\\\_K8S | `--FOR_K8S=ON` | ### 通过调整环境变量 除了使用命令行参数之外,我们还能够通过改变环境变量来调整生成证书的结果。 比如在上文中的 `docker-compose.yml` 中,我们想调整城市展示为 `TY`,组织名称为 `Home Lab`,那么可以这样调整配置: ```yaml version: '2' services: certs-maker: image: soulteary/certs-maker environment: - CERT_DNS=lab.com,*.lab.com,*.data.lab.com - CERT_ST=TY - CERT_O=Home Lab volumes: - ./ssl:/ssl ``` 完整的环境变量和上文中的参数列表一致,使用起来更简单一些,在使用的时候,我们不需要添加 `--CERT_C=CN` 参数开头的 “`--`”,直接使用参数 `CERT_C=CN` 即可。 | 类型 | 名称 | 如何在环境变量中使用 | | ------------------------ | ----------- | ------------------------------------------- | | Country Name | CERT\\\_C | `CERT_C=CN` | | State Or Province Name | CERT\\\_ST | `CERT_ST=BJ` | | Locality Name | CERT\\\_L | `CERT_L=HD` | | Organization Name | CERT\\\_O | `CERT_O=Lab` | | Organizational Unit Name | CERT\\\_OU | `CERT_OU=Dev` | | Common Name | CERT\\\_CN | `CERT_CN=Hello World` | | Domains | CERT\\\_DNS | `CERT_DNS=lab.com,*.lab.com,*.data.lab.com` | | Issue for K8s | FOR\\\_K8S | `FOR_K8S=ON` | ## 生成 K8s 友好的证书配置 在上一篇文章《[轻量高可用的 K8s 集群搭建方案:MicroK8s](https://soulteary.com/2022/10/15/lightweight-and-highly-available-k8s-cluster-construction-solution-microk8s.html#%E8%A7%A3%E5%86%B3-k8s-dashboard-%E8%AF%81%E4%B9%A6%E9%97%AE%E9%A2%98)》中,我们在解决 K8s Dashboard 证书问题的时候,有提过可以通过添加 `FOR_K8S=ON` 参数来生成证书。 如果你参考上文生成的证书是为了 K8s 的 Dashboard 使用,可以参考上文使用配置的方式添加这个参数。 ## 最后 这篇文章就先写到这里了。在后续的实战的内容中,我们会有比较多的场景使用到证书,而自签名证书无疑就是最简单、成本最低、比较安全的方案之一啦。 --EOF