【发布时间】:2019-07-23 01:43:01
【问题描述】:
我们如何删除关于重复问题的错误横幅?
此问题与Why does requestjs reject a self-signed SSL certificate that works with Firefox? 不重复。虽然该问题的答案可能会产生类似的配置文件,但该问题并未在subjectAltName 中使用DNS:。这是一个关键点,因为我们可以通过 Google 轻松找到的所有示例都使用DNS:,这不适用于 IP 地址。
此问题与Exception on using IP address in certificate name 不重复。虽然该问题的答案可能会产生类似的配置文件,但该问题完全没有subjectAltName。
出于同样的原因,此问题也不与Using ip address for common name in server certificate does not work in Android? 重复。
回到实际问题
我想编写一个同时响应localhost 和127.0.0.1 的SSL 服务器。各种网站都说这可以使用subjectAltName 来实现。所以我使用下面的openssl 配置文件创建了一个服务器证书:
distinguished_name = dn
x509_extensions = v3_ca
[req]
prompt = no
[dn]
0.CN = localhost
1.CN = 127.0.0.1
[v3_ca]
subjectAltName = DNS:localhost,DNS:127.0.0.1
subjectAltName 正在由服务器发送。例如,经s_client验证:
% echo | openssl s_client -showcerts -CAfile keys/cert.pem -connect localhost:8443 | grep -i -A 2 certificate
depth=0 CN = localhost, CN = 127.0.0.1
verify return:1
DONE
Certificate chain
0 s:/CN=localhost/CN=127.0.0.1
i:/CN=localhost/CN=127.0.0.1
-----BEGIN CERTIFICATE-----
MIIC9jCCAd6gAwIBAgIJANlipKdvxVlUMA0GCSqGSIb3DQEBCwUAMCgxEjAQBgNV
BAMMCWxvY2FsaG9zdDESMBAGA1UEAwwJMTI3LjAuMC4xMB4XDTE5MDcyMzAxMjcw
--
-----END CERTIFICATE-----
---
Server certificate
subject=/CN=localhost/CN=127.0.0.1
issuer=/CN=localhost/CN=127.0.0.1
--
No client certificate CA names sent
Peer signing digest: SHA512
Server Temp Key: X25519, 253 bits
我们也可以用一个简单的 Python 客户端来验证它,它会报告:
Cipher is ECDHE-RSA-AES256-GCM-SHA384, SSL protocol is TLSv1.2, bits=256
Peer cert is {'subjectAltName': (('DNS', 'localhost'), ('DNS', '127.0.0.1')), 'notBefore': u'Jul 23 01:27:02 2019 GMT', 'serialNumber': u'D962A4A76FC55954', 'notAfter': 'Jul 22 01:27:02 2020 GMT', 'version': 3L, 'subject': ((('commonName', u'localhost'),), (('commonName', u'127.0.0.1'),)), 'issuer': ((('commonName', u'localhost'),), (('commonName', u'127.0.0.1'),))}
Hello from SSL server!
很遗憾,curl 只能识别名字:
% curl --cacert keys/cert.pem https://localhost:8443
Hello from SSL server!
% curl --cacert keys/cert.pem https://127.0.0.1:8443
curl: (51) SSL: no alternative certificate subject name matches target host name '127.0.0.1'
%
我们如何让curl(和其他程序)注意到subjectAltName、整个subjectAltName,以及除了subjectAltName之外什么都没有?
更新
也许它适用于这个:
distinguished_name = dn
x509_extensions = v3_ca
[req]
prompt = no
[dn]
CN = IGNORED
[v3_ca]
subjectAltName = DNS:localhost,IP:127.0.0.1
这些东西,比如,在任何地方都有记录吗?
【问题讨论】:
-
查看 security.stackexchange over here 上的相关讨论。
-
“像这样的东西,在任何地方都有记录吗?” - RFC 5280。除此之外:
127.0.0.1显然不是 DNS 名称,而是 IP 地址。不过,您可能也需要它为DNS:..,因为一些损坏的实现期望它是这样的。 -
@Steffen:加上 2818 用于 https,或参见 6125 用于其他。旁白:您的“由 s_client 验证”是错误的; s_client 显示仅 v1/未扩展的主题,不 SAN。如果您指定
-verify_host[name]或-verify_ip,则 FWIW 在 1.0.2 以上 s_client 可以检查 SAN-或-CN;请参阅手册页。 (虽然它在这里将错误视为非致命错误,就像其他验证错误一样,默认情况下。) -
@Steffen。不,RFC 5280 没有提到
IP:语法。是的,有一个ipAddress表达式,但不,它的定义方式并未与openssl工具一起使用。事实上,RFC 5280 明确指出 ipAddress 是一个 OCTET_STRING,它可能是 ASN.1,它没有IP:前缀,这是我希望工作但没有的一种选择。此外,不,问题不是重复的。我在顶部添加了解释。 -
@dave_thompson 你说得对,
s_client没有显示 subjectAltName。我同意,CN 被忽略。因此在我更新的示例中使用了CN = IGNORED。
标签: ssl