本教程将向您展示如何为 FileZilla Server 生成 CSR。先说最能节省您时间的部分:FileZilla Server 无法创建证书签名请求。管理界面的任何版本中都没有这样的按钮。服务器可以生成自签名证书,可以自动从 Let’s Encrypt 获取证书,也可以加载您自己提供的证书和私钥,而来自商业证书颁发机构的证书正是通过第三种方式使用的。因此,请求是在 FileZilla Server 之外用 OpenSSL 或在线生成器构建的,最终只有生成好的密钥和证书才会交给服务器。
在讲命令之前,先说说版本方面的一个注意事项,因为它决定了您要打开哪种终端。FileZilla Server 在 2021 年 9 月针对 1.0 版本进行了重写,当前发布版本是1.12.6,发布于 2026 年 5 月。Debian 和 macOS 软件包是随 2021 年 12 月发布的 1.2.0 版本一起推出的;在此之前,该服务器仅支持 Windows 运行,而大多数安装实例目前仍在 Windows 上。那些以”通过 SSH 登录”开头的老旧说明,其实是默认假设您用的是 Linux 主机。较早的 0.9.x 系列在 2017 年 2 月发布 0.9.60.2 后就已终止,此后再未获得安全更新,因此如果您仍在使用该版本,请将升级计划与证书更换一并考虑。
FileZilla Server 如何处理证书
在构建请求之前,先了解最终目的地是值得的,因为它会告诉您文件需要具备什么样的格式。打开 FileZilla Server 管理界面,连接到服务器,然后从菜单栏中选择Server和Configure…(键盘快捷键为Ctrl+F)。在左侧的树形菜单中,依次打开Protocols settings、FTP and FTP over TLS (FTPS),然后进入Connection Security选项卡。
该页面包含两项内容:一个提供 v1.2 和 v1.3 选项的Minimum allowed TLS version菜单,以及一个只有三个选项的TLS credentials选择器:
- Provide a X.509 certificate and private key.两个字段,Certificate和Private key,两者都可以接受直接粘贴到界面中的原始 PEM 数据,也可以接受服务器文件系统上的文件路径。密钥字段还额外支持 PKCS#11 URL(如果密钥存放在硬件令牌中)。在这两个字段下方是Private key password (stored in plaintext)。CA 颁发的证书就应放置在这里。
- Use a self-signed X.509 certificate.一个Generate new按钮,用于创建服务器自签名的证书。适用于封闭式测试,但没有任何客户端会信任它,因此每次连接都会产生警告。
- Use a Let’s Encrypt® certificate.内置的 ACME 支持,自 FileZilla Server 1.0 版起添加。服务器会自行请求并续期证书,您无需处理任何 CSR。
这三个选项都不会生成可发送给证书颁发机构的证书签名请求。FileZilla Server 确实会在 Let’s Encrypt 交互过程中在内部构建一个请求,但它从不写入磁盘,也不会显示在界面中,而且它是与该自动化订购流程绑定的。
该页面中有两个细节值得在下一部分中留意。首先,路径字段是在运行服务器引擎的那台机器上解析的,而不是在运行管理界面的机器上解析的,这一点很重要,因为这两者通常是不同的计算机。其次,由于该界面也支持以粘贴文本的方式提供证书和密钥,因此您严格来说完全不必将文件复制到服务器上。无论采用哪种方式,您即将创建的私钥都必须以某种方式送达那台机器,而在那台机器上直接生成是最简单的途径。
为 FileZilla Server 生成 CSR
如果您已经生成了 CSR,请跳过本节,在证书签发后直接前往在 FileZilla Server 上安装 SSL 证书。否则,请从以下两种方式中选择一种。它们会生成同样的一对文件。
选项一:使用 SSL Dragon CSR 生成器
我们的CSR Generator可通过一个表单同时生成请求和对应的私钥,从而避免了仅为运行一条命令就在 Windows 服务器上安装 OpenSSL 的麻烦。请保存它生成的私钥,并妥善保管。没有私钥,CA 颁发的证书就毫无用处,而且任何人都无法为您重新发放一份替代密钥。
选项二:使用 OpenSSL 生成 CSR
运行命令的地方取决于托管 FileZilla Server 的操作系统:
- Windows。打开命令提示符或 PowerShell。Windows 本身不自带 OpenSSL,因此您需要安装一个:Git for Windows 内置了一个可在 Git Bash 中直接调用的版本,您也可以安装独立的 Windows 版 OpenSSL 软件包,或使用 Windows Subsystem for Linux。无论选择哪种方式,请先运行
openssl version确认能得到响应。 - Linux。在服务器上打开终端,或通过 SSH 连接。主流发行版默认已安装 OpenSSL。
- macOS。打开终端。macOS 上的
openssl命令实际上是 LibreSSL 构建版本而非 OpenSSL,这一点会影响下文提到的几个选项。本教程中的每条命令都在这两种构建版本上运行过,且均可正常工作。
切换到一个您以后还能找到的目录,然后运行下面这条命令。它会同时创建私钥和请求文件:
openssl req -new -newkey rsa:2048 -nodes -keyout ftp.yourdomain.com.key -out ftp.yourdomain.com.csr -addext "subjectAltName=DNS:ftp.yourdomain.com"
各部分的作用:
req -new创建一个新的证书签名请求。-newkey rsa:2048同时生成一个新的 2048 位 RSA 密钥。这是公共 CA 会签发的最小密钥长度。如果您的安全策略有要求,可以使用rsa:4096。-nodes会写出没有密码保护的私钥,这样 FileZilla Server 在重启后就能无需人工干预地读取它。请使用这种写法,而不要用更新的-noenc别名:OpenSSL 3.x 两者都能接受,但 macOS 自带的 openssl 命令实际上是 LibreSSL 构建版本,它会拒绝-noenc,并打印用法说明而不是执行命令。-keyout和-out用于命名两个输出文件。以主机名来命名它们,比用 server.key 和 server.csr 这类通用名称要好得多,因为一年后您可能会积累好几个文件。-addext "subjectAltName=..."会将主机名放入使用者备用名称扩展字段中。不要跳过这一步。CA/浏览器论坛的基准要求现已将 Common Name 描述为不建议使用的字段,并要求其中的任何值都必须来自 SAN 条目,因此 SAN 列表才是权威依据。
如需支持多个主机名,或需要通配符,可用逗号分隔的列表扩展同一个选项。请在其中重复填写通用名称:
-addext "subjectAltName=DNS:ftp.yourdomain.com,DNS:files.yourdomain.com"
-addext "subjectAltName=DNS:*.yourdomain.com,DNS:yourdomain.com"
如果您希望使用椭圆曲线密钥,可以使用下面这条等效命令。请先确认您购买的产品所属的证书颁发机构会为其颁发 ECDSA 证书,因为并非每个品牌都支持。
openssl req -new -newkey ec -pkeyopt ec_paramgen_curve:prime256v1 -pkeyopt ec_param_enc:named_curve -nodes -keyout ftp.yourdomain.com.key -out ftp.yourdomain.com.csr -addext "subjectAltName=DNS:ftp.yourdomain.com"
第二个 -pkeyopt 并非可有可无的装饰。在 OpenSSL 上它不会改变任何行为,因为命名曲线本来就是默认选项,但在 macOS 自带的 LibreSSL 构建版本中,缺少它会导致请求文件通过写出全部参数而不是直接命名曲线的方式来描述曲线。RFC 5480 禁止在公共证书中使用这种形式,而以这种方式构建出的请求根本无法标识任何曲线。
回答提示问题
OpenSSL 现在会按以下顺序询问填入请求中的详细信息:
- Country Name (2 letter code):您所在国家的两字母代码,例如 US。这是国家代码完整列表。
- State or Province Name (full name):需拼写完整。是 California,而不是 CA。
- Locality Name (eg, city):城市的全称,例如 San Jose。
- Organization Name (eg, company):您组织的确切法定名称,例如 Example Holding LLC。如果您购买的是域名验证证书,CA 不会验证或使用此字段,可以留空。
- Organizational Unit Name (eg, section):请留空。自 2022 年 9 月 1 日起,CA/浏览器论坛的基准要求已将此属性列为 CA 不得包含的字段,因此无论您输入什么内容都会被舍弃。
- Common Name:您的 FTPS 客户端连接所使用的完全限定主机名,例如 ftp.yourdomain.com,或者通配符 *.yourdomain.com。不同构建版本中该提示的措辞略有差异,但在默认配置下它是第六个问题。
- Email Address:可选,通常留空。
- A challenge password:请留空。它是请求本身的一个遗留属性,永远不会出现在颁发的证书中,证书订购表单也不会要求填写这个字段。
- An optional company name:同样请留空。
在您开始输入之前,有一个值得了解的陷阱。“留空”并不意味着”直接按 Enter”。有几个字段带有来自 OpenSSL 配置文件的默认值,会显示在提示语末尾的方括号中,直接按 Enter 会采用该默认值,而不是让字段保持空白。在默认的 OpenSSL 配置下,直接对前几个问题按 Enter 会得到一个写着 C=AU、ST=Some-State 和 O=Internet Widgits Pty Ltd 的请求,而这显然不是任何人希望发送给证书颁发机构的内容。若要让某个字段真正留空,请输入一个句点然后按 Enter。OpenSSL 在提问上方打印的说明文字中也明确提到了这一点。
回答完最后一个问题后,当前目录中会出现两个新文件:
- ftp.yourdomain.com.csr:证书签名请求文件。这是您要粘贴到订购表单中的文件。
- ftp.yourdomain.com.key:私钥。它绝不会发送给证书颁发机构,也绝不能脱离您的掌控。任何持有它的人都可以冒充您的服务器,因此请限制能读取它的人员,并将其备份到三年后您仍能访问到的地方。一旦丢失,颁发的证书就会无法使用:您必须重新生成请求并申请重新签发。
下单前检查 CSR
请求中的一个拼写错误就会导致 CA 颁发一个您无法使用的证书,而修复这个问题又需要再走一遍验证流程。提交之前,请先回读一下请求内容:
openssl req -noout -text -verify -in ftp.yourdomain.com.csr
请在输出中检查三项内容:Subject 行是否包含您原本要输入的详细信息,Subject Alternative Name 部分是否列出了客户端将使用的每一个主机名,以及签名检查是否通过。OpenSSL 3.x 会将最后这项报告为Certificate request self-signature verify OK,而 macOS 上的 LibreSSL 构建版本则会将其简化为verify OK。两者含义相同。如果您不想使用命令行,也可以将请求粘贴到我们的CSR 解码器中。
此外,确认磁盘上的密钥确实就是构建该请求时所使用的那一个也很值得一做,尤其是当您生成过多个密钥的情况下。比较公钥的方法适用于任意密钥类型,并且在 OpenSSL 和 LibreSSL 上均可使用:
openssl req -noout -pubkey -in ftp.yourdomain.com.csr
openssl pkey -pubout -in ftp.yourdomain.com.key
这两段输出必须逐字符完全一致。这是更常见的模数与 md5 比较方法的可移植版本,后者仅适用于 RSA 密钥,并且会把一对完全正常的椭圆曲线密钥误报为不匹配。
最后,用记事本或 TextEdit 等纯文本编辑器打开 .csr 文件,并复制整个代码块,包括首尾两行:
-----BEGIN CERTIFICATE REQUEST-----
MIICvDCCAaQCAQAwdzELMAkGA1UEBhMCVVMxEzARBgNVBAgMCkNhbGlmb3JuaWEx
... (many lines of base64) ...
-----END CERTIFICATE REQUEST-----
每一行标记都是恰好五个连字符,接着是相应文字,再接五个连字符。请不要手动重新输入这些标记,也不要通过文字处理软件粘贴,因为它可能会把连续的连字符转换为破折号,从而生成一个被 CA 判定为格式错误而拒绝的请求。
完全不需要 CSR 的情况
自 1.0 版起,FileZilla Server 可以自行获取并续期免费的 Let’s Encrypt 证书,您无需生成任何请求,也无需导入任何文件。同一个设置对话框中,在树形菜单里Logging下方,有一个顶级的Let’s Encrypt®页面。勾选Enable Let’s Encrypt® certificate generation,点击Create new account并接受服务条款,然后在How to perform the challenges下选择让 FileZilla Server 使用其自带的内部 Web 服务器来应答验证(默认建议使用 80 端口),或者让它指向现有 Web 服务器用于在 /.well-known/acme-challenge/ 下应答请求的文件夹。之后,在Connection Security选项卡中选择Use a Let’s Encrypt® certificate,并保持Automatically try to renew the certificate in due time处于勾选状态。
有两个限制决定了这种方式是否适合您。服务器仅能应答基于 HTTP 的验证质询,因此在证书颁发以及每次续期期间,该主机名都必须能从互联网上通过验证端口访问到。而且,由于 Let’s Encrypt 的通配符证书需要基于 DNS 的验证方式,而 FileZilla Server 并不支持执行该验证,因此您无法通过这种方式获取通配符证书。
因此,如果您需要通配符证书、组织验证或扩展验证证书,或者需要为一台不暴露在互联网上的服务器申请证书,上文所述的 CSR 方式仍然是您应采用的方法。我们的ACME 教程更深入地介绍了自动化签发流程。剩下的一个选项,即Use a self-signed X.509 certificate下的Generate new按钮,仅适用于测试用途:它能在几秒钟内让 FTPS 运行起来,但也会让每个客户端都显示一条警告,而用户很快就会习惯性地点击忽略它。
常见问题
不能。管理界面提供了三种为服务器配置证书的方式,但没有一种能生成可发送给证书颁发机构的请求:提供您已有的证书和私钥、生成自签名证书,或自动从 Let’s Encrypt 获取证书。请使用 OpenSSL 或我们的CSR Generator生成 CSR,然后通过这三个选项中的第一个来加载生成的密钥和颁发的证书。
在托管 FileZilla Server 的机器上运行以下命令,并将主机名替换为您自己的:openssl req -new -newkey rsa:2048 -nodes -keyout ftp.yourdomain.com.key -out ftp.yourdomain.com.csr -addext "subjectAltName=DNS:ftp.yourdomain.com"
它会同时写出请求文件和私钥文件,然后询问您的组织信息。
在服务器本机的命令提示符、PowerShell 或 Git Bash 中运行。Windows 没有内置 OpenSSL,因此需要先安装一个:Git for Windows 自带一个适用的构建版本,此外也有独立的 Windows 版软件包可供安装。在继续操作之前,请先运行 openssl version 确认命令可用。那些提示您通过 SSH 连接的说明,其实是默认假设您使用的是 Linux 主机,而 FileZilla Server 是从 1.2.0 版才开始支持这一点的。
不需要。.pfx 或 .p12 文件包本身已经包含证书及其私钥,因此没有什么需要再申请的了。不过它的格式不对:FileZilla Server 文档中说明证书和密钥字段应为 PEM 格式,粘贴框的标签也注明需要 PEM 格式。请按照提示输入该文件包的密码,将其拆分为服务器所需的两个 PEM 文件:openssl pkcs12 -in bundle.pfx -nokeys -out certificate.pemopenssl pkcs12 -in bundle.pfx -nocerts -nodes -out privatekey.pem
两个文件生成后,每个代码块上方都会带有几行 Bag Attributes 信息,这些是无害的,可以保留也可以删除。
不需要。创建请求只会在磁盘上写出两个文件,并不会改变服务器正在进行的任何操作。在您加载已颁发的证书之前,FileZilla Server 并不知道该请求的存在,而加载证书是通过Connection Security选项卡完成的,无需重新安装。
请求本身是相同的,因为无论哪种情况都是用 OpenSSL 构建的。发生变化的是生成好的文件该放到哪里。0.9.x 的管理界面将证书设置放在Edit和Settings下,而 1.x 版本则使用上文所述的Server、Configure…以及Connection Security选项卡。0.9.x 系列最后一次发布是在 2017 年 2 月,此后不再获得安全更新,因此在其上进行的任何操作都应视为临时方案。


