Jellyfin HTTPS 教程:安全访问你的媒体 – wiki词典


Jellyfin HTTPS 教程:安全访问你的媒体

Jellyfin 是一个免费、开源的媒体服务器,它能让你在任何设备上流式传输你的电影、电视节目、音乐和照片。然而,默认情况下,Jellyfin 通常通过 HTTP(未加密)连接提供服务,这意味着你的数据在传输过程中可能被窃听或篡改。为了保护你的隐私和数据安全,为 Jellyfin 设置 HTTPS(超文本传输安全协议)至关重要。

本教程将详细指导你如何使用 Nginx 作为反向代理,并结合 Let’s Encrypt 提供的免费 SSL 证书,为你的 Jellyfin 服务器启用 HTTPS。

为什么需要 HTTPS?

  1. 数据加密:HTTPS 对客户端和服务器之间的所有通信进行加密,防止密码、个人信息和媒体播放记录等敏感数据被第三方截获。
  2. 数据完整性:它确保数据在传输过程中不被修改或损坏,保证你接收到的内容是原始的、未被篡改的。
  3. 身份验证:HTTPS 证书验证服务器的身份,防止中间人攻击(Man-in-the-Middle attacks),确保你连接的是真正的 Jellyfin 服务器。
  4. 改善SEO和浏览器信任:虽然对于个人媒体服务器不那么重要,但现代浏览器会明确警告用户访问不安全的 HTTP 网站。HTTPS 可以提升用户对你服务器的信任。

先决条件

在开始之前,请确保你满足以下条件:

  1. 一个注册的域名:例如 your_domain.com,并且你希望通过一个子域名(例如 jellyfin.your_domain.com)来访问 Jellyfin。
  2. 域名DNS记录:你的域名已正确配置 ACNAME 记录,指向你的服务器的公共 IP 地址。
  3. 开放端口:你的服务器防火墙和路由器已开放 TCP 端口 80 (HTTP) 和 443 (HTTPS)。
  4. 已安装的 Jellyfin:Jellyfin 已安装并运行在你的服务器上(通常监听在 http://localhost:8096)。本教程假设你在 Linux 环境(例如 Ubuntu/Debian)中操作。
  5. SSH访问:拥有服务器的 sudo 权限,并可以通过 SSH 访问。

核心方案:Nginx 反向代理 + Let’s Encrypt

我们将采取以下步骤:
1. 安装 Nginx。
2. 配置 Nginx 作为 Jellyfin 的 HTTP 反向代理。
3. 使用 Certbot 获取 Let’s Encrypt SSL 证书并自动配置 Nginx。
4. 优化 Nginx 配置以增强安全性。
5. 调整 Jellyfin 网络设置以识别真实客户端 IP。
6. 验证证书自动续订。


步骤 1:安装 Nginx

如果你的服务器上尚未安装 Nginx,请使用以下命令进行安装:

bash
sudo apt update
sudo apt install nginx -y

安装完成后,启动 Nginx 服务并使其在系统启动时自动运行:

bash
sudo systemctl start nginx
sudo systemctl enable nginx

步骤 2:配置 Nginx 作为 Jellyfin 的 HTTP 反向代理

在获取 SSL 证书之前,我们将首先配置 Nginx 作为 HTTP 反向代理。

  1. 创建 Nginx 配置文件:
    为 Jellyfin 创建一个新的 Nginx 配置文件。请将 jellyfin.your_domain.com 替换为你的实际域名。

    bash
    sudo nano /etc/nginx/sites-available/jellyfin

  2. 添加 Nginx 配置内容:
    将以下内容粘贴到文件中。请确保将 jellyfin.your_domain.com 替换为你的 Jellyfin 访问域名,并将 127.0.0.1:8096 替换为你的 Jellyfin 实例的实际 IP 地址和端口(如果 Jellyfin 不在同一台服务器上或使用不同端口)。

    “`nginx
    server {
    listen 80;
    listen [::]:80;
    server_name jellyfin.your_domain.com;

    # 将所有 HTTP 请求重定向到 HTTPS。Certbot 将在下一步中自动配置 HTTPS 部分。
    return 301 https://$host$request_uri;
    

    }
    “`
    注意:此配置中只定义了 HTTP 监听部分,并将其重定向到 HTTPS。HTTPS 服务器块将在 Certbot 运行时自动生成和填充。

  3. 启用 Nginx 站点:
    创建从 sites-availablesites-enabled 的符号链接,以启用此配置。

    bash
    sudo ln -s /etc/nginx/sites-available/jellyfin /etc/nginx/sites-enabled/

  4. 测试 Nginx 配置并重新加载:
    检查配置是否有语法错误,然后重新加载 Nginx 服务使其生效。

    bash
    sudo nginx -t
    sudo systemctl reload nginx

    如果测试成功,现在你尝试通过 http://jellyfin.your_domain.com 访问 Jellyfin 时,它应该会自动重定向。由于 HTTPS 尚未完全配置,浏览器可能会显示证书错误。

步骤 3:安装 Certbot 并获取 Let’s Encrypt SSL 证书

Certbot 是获取和管理 Let’s Encrypt 证书的官方工具。

  1. 安装 Certbot 和 Nginx 插件:

    bash
    sudo apt install certbot python3-certbot-nginx -y

  2. 运行 Certbot 获取证书:
    运行以下命令。Certbot 将自动检测你的 Nginx 配置,获取证书,并配置 Nginx 以使用 HTTPS。请将 jellyfin.your_domain.com 替换为你的实际域名,并将 [email protected] 替换为你的电子邮件地址。

    bash
    sudo certbot --nginx -d jellyfin.your_domain.com --email [email protected] --agree-tos --no-eff-email

    Certbot 会询问你是否希望将所有 HTTP 流量重定向到 HTTPS。选择 2 (Redirect) 是推荐的做法,这会强制所有访问都使用加密连接。

    如果一切顺利,你将看到一条祝贺消息,表明你的证书已成功部署。Certbot 还会自动设置一个 cron 作业来续订你的证书。

步骤 4:调整 Nginx 配置(可选,但推荐)

Certbot 会自动修改你的 Nginx 配置文件,添加 SSL 相关的指令。我们可以进一步优化配置以增强安全性。

  1. 编辑 Nginx 配置文件:

    bash
    sudo nano /etc/nginx/sites-available/jellyfin

  2. 检查并添加推荐的配置:
    Certbot 应该已经为你添加了 listen 443 ssl;ssl_certificate 等行。现在,你需要添加 Jellyfin 反向代理所需的 location / 块,并可以添加一些安全头部以提升安全性:

    “`nginx
    server {
    listen 80;
    listen [::]:80;
    server_name jellyfin.your_domain.com;
    return 301 https://$host$request_uri;
    }

    server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;
    server_name jellyfin.your_domain.com;

    # Certbot 管理的 SSL 证书路径
    ssl_certificate /etc/letsencrypt/live/jellyfin.your_domain.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/jellyfin.your_domain.com/privkey.pem;
    include /etc/letsencrypt/options-ssl-nginx.conf; # Certbot 推荐的 SSL 选项
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # Certbot 生成的 DH 参数
    
    # 可选:更强的 SSL 协议和密码套件 (根据客户端兼容性需求调整)
    ssl_protocols TLSv1.3 TLSv1.2;
    ssl_ciphers 'TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256:TLS_AES_128_GCM_SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256';
    ssl_prefer_server_ciphers on;
    
    # 安全头部 (强烈推荐)
    add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;
    add_header X-Frame-Options "SAMEORIGIN" always;
    add_header X-Content-Type-Options "nosniff" always;
    add_header Referrer-Policy "no-referrer-when-downgrade" always;
    
    # 可选:增加 client_max_body_size 如果你需要上传大文件 (例如图片封面)
    client_max_body_size 20M;
    
    # Jellyfin 的反向代理设置
    location / {
        proxy_pass http://127.0.0.1:8096; # 如果 Jellyfin 在不同 IP/端口,请调整
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header X-Forwarded-Host $host;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "Upgrade";
        proxy_redirect off;
    
        # WebSockets 所需设置
        proxy_http_version 1.1;
        proxy_buffering off;
    }
    

    }
    “`

  3. 测试 Nginx 配置并重新加载:
    保存文件后,再次测试 Nginx 配置并重新加载服务。

    bash
    sudo nginx -t
    sudo systemctl reload nginx

步骤 5:配置 Jellyfin 网络设置

为了让 Jellyfin 正确识别通过 Nginx 反向代理访问的客户端的真实 IP 地址,你需要将其添加到 Jellyfin 的“已知代理”列表中。

  1. 访问 Jellyfin 仪表板:
    通过 https://jellyfin.your_domain.com 访问你的 Jellyfin 实例。
  2. 导航到网络设置:
    进入 管理仪表板 -> 网络
  3. 添加已知代理:
    在“已知代理”部分,添加你的 Nginx 服务器的 IP 地址。如果 Nginx 和 Jellyfin 在同一台服务器上,通常是 127.0.0.1。如果 Nginx 在不同的服务器上,请输入该服务器的内部 IP 地址。
  4. 保存更改。

步骤 6:验证自动证书续订

Certbot 通常会自动设置一个 cron 作业来定期(例如每 90 天)续订你的 Let’s Encrypt 证书。你可以执行一次 dry-run 来测试续订过程是否正常工作,而不会真正续订:

bash
sudo certbot renew --dry-run

如果 dry-run 命令成功完成,则表示自动续订已正确配置,你无需担心证书过期。


总结

恭喜!现在你已经成功为你的 Jellyfin 服务器配置了 HTTPS。通过 Nginx 作为反向代理和 Let’s Encrypt 提供的免费 SSL 证书,你的媒体访问现在是安全的、加密的,并且你的数据得到了有效保护。你可以放心地通过 https://jellyfin.your_domain.com 访问你的媒体库了。

滚动至顶部