- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我以为我明白了,但它不起作用!
我读过其他http://binblog.info/2010/02/02/lengthy-chains/这是我找到的最清晰的解释。
背景:Comodo 的廉价 PositiveSSL 服务器证书带有一个根证书和两个中间 CA 证书(我用 myserver.com 替换了我的 FQDN):
$ unzip ../myserver_com.commodo.certificate.zip
Archive: ../myserver_com.commodo.certificate.zip
extracting: AddTrustExternalCARoot.crt
extracting: COMODORSAAddTrustCA.crt
extracting: COMODORSADomainValidationSecureServerCA.crt
extracting: myserver_com.crt
请注意,字母顺序类似于从根 CA 到服务器证书的反向证书链。根 CA 不是 Comodo,但这不是重点。
考虑以下输出:
openssl x509 -noout -subject -issuer -in myserver_com.crt
subject= /OU=Domain Control Validated/OU=PositiveSSL/CN=myserver.com
issuer= /C=GB/ST=Greater Manchester/L=Salford/O=COMODO CA Limited/CN=COMODO RSA Domain Validation Secure Server CA
openssl x509 -noout -subject -issuer -in COMODORSADomainValidationSecureServerCA.crt
subject= /C=GB/ST=Greater Manchester/L=Salford/O=COMODO CA Limited/CN=COMODO RSA Domain Validation Secure Server CA
issuer= /C=GB/ST=Greater Manchester/L=Salford/O=COMODO CA Limited/CN=COMODO RSA Certification Authority
openssl x509 -noout -subject -issuer -in COMODORSAAddTrustCA.crt
subject= /C=GB/ST=Greater Manchester/L=Salford/O=COMODO CA Limited/CN=COMODO RSA Certification Authority
issuer= /C=SE/O=AddTrust AB/OU=AddTrust External TTP Network/CN=AddTrust External CA Root
openssl x509 -noout -subject -issuer -in AddTrustExternalCARoot.crt
subject= /C=SE/O=AddTrust AB/OU=AddTrust External TTP Network/CN=AddTrust External CA Root
issuer= /C=SE/O=AddTrust AB/OU=AddTrust External TTP Network/CN=AddTrust External CA Root
前一个证书的颁发者是后者的主题 - 直到来自 AddTrust AB 的根 CA 证书是自签名的。链是完整的。
验证单个证书给出:
$ openssl verify *.crt
AddTrustExternalCARoot.crt: OK
COMODORSAAddTrustCA.crt: OK
COMODORSADomainValidationSecureServerCA.crt: C = GB, ST = Greater Manchester, L = Salford, O = COMODO CA Limited, CN = COMODO RSA Domain Validation Secure Server CA
error 20 at 0 depth lookup:unable to get local issuer certificate
myserver_com.crt: OU = Domain Control Validated, OU = PositiveSSL, CN = myserver.com
error 20 at 0 depth lookup:unable to get local issuer certificate
前两个证书已经安装在服务器上,剩下两个证书需要连接,但我还是将它们全部链接起来。
来自 RFC5246 https://www.rfc-editor.org/rfc/rfc5246#section-7.4.2
certificate_list
This is a sequence (chain) of certificates. The sender's
certificate MUST come first in the list. Each following
certificate MUST directly certify the one preceding it. Because
certificate validation requires that root keys be distributed
independently, the self-signed certificate that specifies the root
certificate authority MAY be omitted from the chain, under the
assumption that the remote end must already possess it in order to
validate it in any case.
当我以正确的方式链接时,证书被识别为 TLS session 的服务器证书,但未经过验证。
$ cat myserver_com.crt COMODORSADomainValidationSecureServerCA.crt COMODORSAAddTrustCA.crt AddTrustExternalCARoot.crt > chained.crt
$ openssl verify chained.crt
chained.crt: OU = Domain Control Validated, OU = PositiveSSL, CN = das.email
error 20 at 0 depth lookup:unable to get local issuer certificate
当连接到服务器时
$ openssl s_client -crlf -connect myserver:465
证书被接受并且链被识别,但根证书未被识别为受信任的,尽管它存在于/etc/ssl/mozilla/中的受信任证书中。
我错过了什么?我可以简单地忽略命令行 openssl 工具的错误吗?
最佳答案
openssl verify chained.crt
并不像您想象的那样(直接)验证一条链;它从文件中读取一个(第一个)证书并根据信任库对其进行验证。这里的第一个证书是您的服务器(叶)证书,它是由您的第一个中间(Comodo DV 服务器)颁发的,它不在信任库中,因此查找失败。要(几乎)由 SSL 客户端对协议(protocol)中接收到的链进行验证,请执行以下操作:
openssl verify -purpose sslclient -untrusted restofchain myserver.crt
其中 restofchain
是一个至少包含链中其他证书的文件除了根可以省略,所以在你的情况下两个 Comodo 中间证书和可选的 AddTrust 根证书。openssl 不像 5246 那样要求它们按向上顺序排列,但如果他们是的话也没关系。事实上,如果叶证书存在在 this 文件中它将被忽略,因此您可以只使用 chained.crt
。
对于 s_client
我不确定您所说的“证书已被接受......但根证书未被识别为受信任”是什么意思。如果 s_client
调用的 libssl-client 代码成功验证接收到的链,那么用于该链的根必须在本地信任库中,因为这是 openssl 认为验证成功的唯一情况——至少通过 1.0 .1,甚至在最近的 1.0.2 中它仍然是默认值——但它从不输出“可信”一词。
一个可能的混淆来源:与浏览器或 Java 程序等真正的客户端不同,后者会在收到的证书/链未验证时中止连接,或者至少需要手动覆盖才能继续,s_client
是一个测试工具,无论证书状态如何,它总是继续连接。您必须专门查看验证错误(靠近输出顶部)和/或“验证返回码”(通常在最底部)。
编辑 4/21:OpenSSL 到 1.0.2a 至少有一个错误; s_client
(以及 s_server
和 s_time
)实际上并没有使用默认信任库,如果您不这样做,它应该这样做t 指定 -CAfile
或 -CApath
参数。参见 https://serverfault.com/questions/607233/how-to-make-openssl-s-client-using-default-ca ;已宣布为开发人员修复,但除非您从头开始自己构建直到发布和分发,否则您需要明确指定 -CA*
参数,即使它看起来是多余的。
关于ssl - 如何将 SSL 服务器证书与中间和根 CA 证书链接起来?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29436967/
我正在尝试执行 vagrant up 但一直遇到此错误: ==> default: IOError: [Errno 13] Permission denied: '/usr/local/lib/pyt
我在容器 div 中有一系列动态创建的不同高度的 div。 Varying text... Varying text... Varying text... Varying text.
通过 cygwin 运行 vagrant up 时遇到以下错误。 stderr: /bin/bash: /home/vagrant/.ansible/tmp/ansible-tmp-14872260
今天要向小伙伴们介绍的是一个能够快速地把数据制作成可视化、交互页面的 Python 框架:Streamlit,分分钟让你的数据动起来! 犹记得我在做机器学习和数据分析方面的毕设时,
我是 vagrant 的新手,正在尝试将第二个磁盘添加到我正在用 vagrant 制作的虚拟机中。 我想出了如何在第一次启动虚拟机时连接磁盘,但是当我关闭机器时 然后再次备份(使用 'vagrant
我是一名优秀的程序员,十分优秀!