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

时间:2014-03-10 15:38:01

标签: ubuntu openssl ldap

由于信任问题,我无法将OpenSSL连接到服务器。我将CA证书放在/etc/ssl/certs/上并运行sudo c_rehash,并且可以看到已经生成了正确的文件。我可以看到CA证书在ca-certificates.crt中。但是如果我跑:

openssl s_client -connect servername.domain.com:636

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

如果我这样做:

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

我得到验证返回代码:0(确定)

我能做什么,所以我不必指定CApath?

我正在使用Ubuntu 13.04。

3 个答案:

答案 0 :(得分:9)

您还可以设置和导出环境变量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。

答案 1 :(得分:8)

  

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

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

由您决定应该信任什么。使用OpenSSL和s_client时,您必须指定一些内容。

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


  

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

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

您可以看到如何从OpenSSL s_client中提取所需信息,并在How to Grab SSL Certificate in OpenSSL使用CAfile

使用CAPath中的所有证书时,您信任任何发行人,即使其不是真正的发行人。这发生在过去和坏事上。

最坏的情况是,坏人会破坏您信任的CA并为域发布虚假证书。这也发生在过去,而且很糟糕。

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

答案 2 :(得分:-1)

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

你可以(在apache上)进入/etc/httpd/vhost.d/servername.domain.com(如果你使用vhosts)

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