我运行一个 OpenVPN 网关,可通过两个不同的主机名(一个来自外部,一个来自内部)访问。为此,我创建了一个带有主题备用名称字段的证书,其中包含两个主机名。证书的主题 (DN) 具有内部主机名。
当我将该证书用于 HTTPS 时,一切都按预期工作 - 该证书对任一主机名均被视为有效。
但是,使用 OpenVPN 的verify-x509-name
选项,除非我指定内部名称(如 DN),否则服务器证书将被拒绝。
有没有办法让 OpenVPN 的主题名称验证以与 Web 浏览器相同的方式工作,即接受任何匹配的主题名称?
答案1
简短答案
DNS 主体备用名称,在客户端模式下,它最有用,可以像浏览器一样验证服务器证书中的名称,但不幸的是(从 2.5 版开始)不支持。
长答案
从 2.5 版开始,OpenVPN 有以下三个选项用于验证远程 X.509 证书中包含的名称:
$subject
使用以下方法验证整个 X.509 主题字段是否符合给定条件--verify-x509-name $subject subject
- 使用和
$name
来验证主题的单个 RDN 组件的值是否与给定值相符--verify-x509-name $name name
--x509-username-field $fieldname
- 使用和或验证
email
主体备用名称或email
发行者备用名称。--verify-x509-name $name name
--x509-username-field ext:subjectAltName
--x509-username-field ext:issuerAltName
默认--x509-username-field
值为通用名称CN
。
验证发行者备用名称相当值得怀疑,因为该字段描述了签署远程证书的 CA 证书。
--verify-x509-name $name name-prefix
如果指定了 而不是--verify-x509-name $name name
,则可能只匹配前缀,而不是完整 RDN 组件或电子邮件备用名称的精确匹配。
所有选项在服务器模式下均可用,用于验证远程客户端证书中的名称,在客户端模式下也可用,用于验证远程服务器证书中的名称。这些选项在两种模式下的工作方式完全相同。然而,仅email
支持备用名称并且调用该选项--x509-username-field
这一事实表明,此选项主要用于在服务器端验证客户端证书。
DNS 主体备用名称,在客户端模式下,它最有用,可以像浏览器一样验证服务器证书中的名称,但不幸的是(从 2.5 版开始)不支持。
还值得注意的是,备用名称字段(自 2.5 版起)仅支持OpenVPN 的 OpenSSL 后端和不使用 mbedTLS。