使用Let's Encrypt证书配置Icinga 2 API:趣味性实现

作者:API传播员 · 2025-11-23 · 阅读时间:5分钟
本文详细介绍了使用Let's Encrypt证书配置Icinga 2 API的优缺点和具体步骤,包括自动化证书管理、广泛的TLS客户端信任以及FQDN要求等长尾关键词,帮助实现安全的集群通信。

使用 Let’s Encrypt 证书配置 Icinga 2 API 的优缺点

在本文中,我们将探讨如何使用 Let’s Encrypt 证书配置 Icinga 2 API,并分析其优缺点。通过这种方式,您可以实现更安全的通信,同时简化证书管理流程。


优点

  • 广泛的 TLS 客户端信任:Icinga 2 集群的通信可以被所有支持 TLS 的客户端信任,包括 `Icinga 2 API 的 GET 请求,也可以直接在浏览器中运行。
  • 自动化证书颁发:证书的生成和更新完全自动化,无需节点之间的直接交互,也不需要跨节点复制文件,例如:
    • icinga2-pki 标志 CSR
    • icinga2-pki 票证
    • icinga2-ca 标志
  • 无需外部 CA 提供 ACME 支持:通过 Let’s Encrypt,您可以轻松实现自动化证书管理。
  • 趣味性实现:这种方法不仅实用,还能激发技术兴趣。

缺点

  • FQDN 要求:每个 Icinga 节点必须有一个实际的完全限定域名 (FQDN),建议使用主机名,例如 master1.example.com
  • 公开证书信息:所有颁发的证书都会列在公共数据库(如 crt.sh)中。
  • 获取证书的条件
    • 每个节点的 80 端口必须运行 Web 服务器,并且能够从互联网访问(HTTP-01 挑战)。
    • 或者,节点需要能够管理自己的 ACME DNS 记录(DNS-01 挑战)。
  • 证书安装权限:证书必须以正确的权限安装到 /var/lib/icinga2/certs/ 目录中。
  • 定期重载守护进程:Icinga 不会自动检测证书文件的外部更改,因此需要定期重载守护进程以避免使用过期证书。

配置步骤详解

以下是使用 Let’s Encrypt 证书配置 Icinga 2 API 的具体实现步骤。

环境准备

  • 操作系统:两台带有公共 IP 的 Debian 12 虚拟机。
  • 防火墙规则
    • 开放 80 端口(外部访问)。
    • 内部通信需要开放 22 和 5665 端口。
  • DNS 记录
    • 91-198-2115.nip.io
    • 91-198-2157.nip.io

配置主机名

/etc/hostname 文件的内容替换为对应的 FQDN,并通过以下命令应用更改:

cat /etc/hostname
hostname --fqdn

默认情况下,Icinga 2 会将主机名用作 NodeName。


安装必要的软件

在每台虚拟机上安装以下软件包:

  • icinga2-bin:Icinga 2 的核心组件。
  • nginx:用于处理 80 端口的 Web 服务器。
  • certbot[python](https://www.explinks.com/blog/ua-python-shi-shi-m-quan-mian-fen-xi-python-de-shi-jie/)3-certbot-nginx:用于获取和管理 Let’s Encrypt 证书。

安装命令如下:

apt install icinga2-bin nginx certbot python3-certbot-nginx

获取 Let’s Encrypt 证书

使用 certbot 获取证书非常简单:

certbot certonly --nginx -n --agree-tos --email example@example.com -d hostname --fqdn

成功后,证书和私钥将分别保存在以下路径:

  • 证书路径:/etc/letsencrypt/live//fullchain.pem
  • 私钥路径:/etc/letsencrypt/live//privkey.pem

同时,certbot 会自动创建一个任务以定期更新证书:

tail -1 /etc/cron.d/certbot

配置 Icinga 证书目录

将证书和私钥复制到 /var/lib/icinga2/certs/ 目录,并设置正确的权限:

mkdir -p /var/lib/icinga2/certs
wget https://letsencrypt.org/certs/isrgrootx1.pem
wget https://letsencrypt.org/certs/isrg-root-x2.pem
cat isrg* > /var/lib/icinga2/certs/ca.crt
cp /etc/letsencrypt/live/hostname --fqdn/fullchain.pem /var/lib/icinga2/certs/hostname --fqdn.crt
cp /etc/letsencrypt/live/hostname --fqdn/privkey.pem /var/lib/icinga2/certs/hostname --fqdn.key
chown nagios: /var/lib/icinga2/certs/*

为了避免证书过期,创建一个定期刷新证书的任务:

cat </etc/cron.d/le-icinga
30 8 * * 1  root  cp /etc/letsencrypt/live/hostname --fqdn/fullchain.pem /var/lib/icinga2/certs/hostname --fqdn.crt; cp /etc/letsencrypt/live/hostname --fqdn/privkey.pem /var/lib/icinga2/certs/hostname --fqdn.key; chown nagios: /var/lib/icinga2/certs/*; systemctl reload icinga2
EOF

配置集群

编辑 /etc/icinga2/zones.conf 文件,定义节点和区域:

object Endpoint "91-198-2-115.nip.io" {
  host = "91-198-2-115.nip.io"
}
object Zone "91-198-2-115.nip.io" {
  endpoints = [ "91-198-2-115.nip.io" ]
}

object Endpoint "91-198-2-157.nip.io" {
  host = "91-198-2-157.nip.io"
}
object Zone "91-198-2-157.nip.io" {
  endpoints = [ "91-198-2-157.nip.io" ]
  parent = "91-198-2-115.nip.io"
}

启用 API 功能并重新加载 Icinga 2:

icinga2 feature enable api
systemctl reload icinga2

验证配置

在完成上述步骤后,节点间应能够正常通信。通过以下命令验证 TLS 客户端连接:

openssl s_client -connect 91-198-2-157.nip.io:5665

输出中应显示 Verify return code: 0 (ok),表示连接成功。


总结

通过本文的配置指南,您可以成功为 Icinga 2 API 配置 Let’s Encrypt 证书,实现安全的集群通信。虽然存在一些限制和挑战,但自动化证书管理和广泛的客户端信任使得这种方法非常值得尝试。

原文链接: https://icinga.com/blog/icinga-2-api-with-lets-encrypt-certificates-just-for-fun/