我们有一台测试服务器,我正尝试将其更改为 HTTPS/SSL,它既有内部 IP,也有外部 IP。我们必须为这台特定的服务器使用自签名证书。过去有一次,我使用 Flash 对 RTMPS 进行了一些研发,因此我仍有一份步骤列表,用于为内部 IP 创建自签名证书,并将其放在客户端计算机上的受信任存储中。
话虽如此,我需要让这个功能同时适用于内部和外部 IP。当我尝试使用相同的步骤为外部 IP 生成并信任证书时,即使客户端使用外部 IP,服务器也会不断尝试欺骗内部 IP 的证书。这显然与它通过 HTTP 标头并获取默认站点的证书有关。因此,即使外部 IP 的证书是可信的,客户端计算机在浏览外部 IP 上的站点时也会不断生成安全警告。
抛开我之前关于如何使用内部 IP 执行此操作的注释,如何同时处理内部和外部 IP?如何对两个 IP 使用自签名证书,而不会在客户端浏览器中生成安全警告?
请注意,这不是重复的。 我知道有关于主题备用名称、通配符证书等的信息。但是:
其中大部分用于 Apache;我正在使用 IIS 7。
其中大部分适用于 Linux;我使用的是 Windows。
它还倾向于处理域名,这似乎是通配符证书所必需的;我只使用 IP。
此时剩下的一些内容希望我在 IIS 或 Windows 中拥有一些并非普遍可用的选项。
剩下的几部分可能有点超出我的理解范围,而且他们使用的步骤需要一些预先存在的知识,而这些知识我根本不了解。换句话说,他们会跳过步骤,直接跳到高级主题,等等。
假设服务器是 IIS 7 / Windows Server 2008 R2,并且客户端计算机使用 Windows 7(有时是 Windows Embedded Standard)和不同版本的 IE,那么完成此操作的明确步骤列表是什么?客户端通过 IP 地址访问页面、Web 服务等,我一直在使用 OpenSSL(尽管我也接受其他选项)。谢谢。
答案1
请参阅 Massimo 的回答正确的的方法。
否则,您可以通过创建包含以下内容的配置文件(以及您想要的任何其他选项)将 IP 添加到证书的 SAN:
[ v3_ca ]
subjectAltName = IP:1.2.3.4
或者如果你有一堆IP....
[ v3_ca ]
subjectAltName = @alt_names
[alt_names]
IP.1 = 1.2.3.4
IP.2 = 2.3.4.5
IP.3 = 3.4.5.6
然后发出正常的 OpenSSL 命令来创建证书,并附加以下内容:
-extfile configuration_file_mentioned_above.cnf -extensions v3_ca
openssl x509 -req
注意:如果您遇到问题,上面的行通常以以下内容开始。
最简单的有效配置文件应该是这样的(我将其保存为example.cfg
):
[req]
distinguished_name = req_distinguished_name
x509_extensions = v3_ca
[ req_distinguished_name ]
commonName = TypeCommonNameHere
[v3_ca]
subjectAltName = @alt_names
[alt_names]
IP.1 = 203.0.113.1
IP.2 = 192.0.2.1
IP.3 = 198.51.100.1
然后运行:
openssl req -x509 -nodes -days 3653 -newkey rsa:2048 -keyout example.key -out example.pem -config example.cfg
它会要求输入证书的通用名称,并分别用私钥和公钥写出 example.key 和 example.pem。此外,您必须将 IP 放入配置文件中,但不能将通用名称放入其中(您可以,但当 OpenSSL 提示时,您仍需要输入它)。
此外,此示例使用了一个完整的配置文件,上面的原始答案假设您已经有一个配置文件,并使用扩展配置文件中的 SAN 信息对其进行扩充(这可能更令人困惑,但我没有使用原始答案中给出的参数的原因)
答案2
您确实不应该在 SSL 证书中使用 IP 地址;您应该设置适当的 DNS 基础设施,以便 feinternal.yourdomain.com
指向内部 IP 地址,并external.yourdomain.com
指向外部 IP 地址;然后您必须将两个名称都作为主题备用名称放在证书中,这样它就可以完美地工作了。
话虽如此,你能使用 IP 地址作为 SAN;但具体如何做到这一点取决于您用来请求证书的工具以及将颁发证书的证书颁发机构。
在这两种情况下,您都应该使用单身的具有两个 SAN 的证书;使用两个证书没有意义,甚至不起作用,因为您不能将两个不同的证书绑定到同一个网站。
答案3
如果您有两个 IP 地址或基于名称的地址,则需要两个证书和两个 https 定义。在 Apache httpd 上,这将是两个 vhost 部分。