除非使用CApath或CAfile,否则无法validationCA证书

由于信任问题,我有OpenSSL连接到服务器的麻烦。 我将CA证书放在/etc/ssl/certs/ ,并运行sudo c_rehash ,可以看到正确的文件已经被创build。 我可以看到CA证书在ca-certificates.crt中。 但是,如果我运行:

 openssl s_client -connect servername.domain.com:636 

该命令失败,validation返回码:21(无法validation第一个证书)

如果我做:

 openssl s_client -connect servername.domain.com:636 -CApath /etc/ssl/certs/ 

我得到validation返回码:0(好)

我该怎么做,所以我不必指定CApath?

我使用Ubuntu 13.04。

由于信任问题,OpenSSL连接到服务器。

与几乎所有人都信任的浏览器不同,OpenSSL默认信任任何东西。

由你决定什么是值得信赖的。 使用OpenSSL和s_client时必须指定一些东西。

如果您使用OpenSSL API以编程方式工作,则可以使用更多选项。 但是这似乎与使用OpenSSL命令有关。


我可以做什么,所以我不需要指定CApath

您可以使用CAfile 。 它避免了重新哈希,并为域的信任创建1:1映射。 也就是说,你只相信一个发行人的问题。 如果任何其他发行人声称是发行人,则不会信任发行人或服务器。

您可以看到如何从OpenSSL的s_client提取所需的信息,并在如何获取OpenSSL中的SSL证书中使用CAfile

在使用CAPath所有证书时,即使不是真正的发行者,也要信任任何发行人。 这发生在过去和它的不好。

角落案例是一个坏家伙妥协了你信任的CA,并为域名发布伪造证书。 这也发生在过去,也是不好的。

在上述两种负面情况下,您可以放弃对DNS和CA的信任,并使用证书或公钥固定等安全多样化技术。 如果您和站点之间存在预先存在的关系,那么您知道服务器的预期公钥。 在这种情况下,不需要信任CA.

您还可以设置和导出环境变量SSL_CERT_FILE或SSL_CERT_DIR …

export SSL_CERT_FILE=/path/to/ca_bundle.crt

export SSL_CERT_DIR=/path/to/ca/dir

然后,您不必在每个openssl命令中指定CAfile或CApath。

如果我正确理解了这个问题,你必须在你的域名上分配证书。

你可以做到(在Apache)到/etc/httpd/vhost.d/servername.domain.com (如果你使用虚拟主机)

 SSLEngine On SSLProtocol all -SSLv2 SSLCipherSuite HIGH:MEDIUM SSLCertificateFile /etc/httpd/ssl/yourcert.crt SSLCertificateKeyFile /etc/httpd/ssl/yourcert.key SSLCertificateChainFile /etc/httpd/ssl/yourcert.ca-bundle