由于信任问题,我无法将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。
答案 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