我正在云中的Ubuntu12.10服务器(AWS)上运行Apache1.3.0版本的CouchDB实例。我正在尝试让SSL在我的couchDB实例上工作。
基本的SSL设置非常简单。我已经将我的证书和密钥放在目录中,并在我的local.ini文件中取消了以下行的注释
httpsd = {couch_httpd, start_link, [https]}
cert_file = /usr/local/etc/couchdb/certs/mycouchdbserver_cert.pem
key_file = /usr/local/etc/couchdb/certs/mycouchdbserver_key.pem我还确保这些文件的所有权是正确的。
这很好,couchDB服务器启动,您可以导航到功用/,没有问题。
使用openssl进行测试
openssl s_client -showcerts -connect mycouchdbserver.com:443给出标准SSL配置的正确结果。
在DigiCert网站上测试安装程序时(该公司的SSL证书是通过- test链接:http://www.digicert.com/help/购买的),我得到以下错误:
服务器没有发送所需的中间证书。
在购买SSL证书时,我从DigiCert获得了一个中间证书,并下载了DigiCert的根证书。
在用于local.ini的couchDB配置文件中,可以将这些配置与以下配置字段一起使用:
verify_ssl_certificates = true
cacert_file = xxxx我的问题是,我不能让这个工作,并尝试了每一个可能的组合,以使这个工作。以下是我尝试过的:
以上所有这些都会在couchDB日志中抛出错误。有些人在错误日志中给出了大量的输出,但是使用数字3,我得到了
=ERROR REPORT==== 11-Jun-2013::11:35:30 ===
SSL: hello: ssl_handshake.erl:252:Fatal error: internal error以及使用openssl进行测试
CONNECTED(00000003)
16871:error:14094438:SSL routines:SSL3_READ_BYTES:tlsv1 alert internal error:s3_pkt.c:1099:SSL alert number 80
16871:error:140790E5:SSL routines:SSL23_WRITE:ssl handshake failure:s23_lib.c:188:有没有人知道如何在verify_ssl_certificates中正确地使用根证书和中间证书?
我在网上读过所有的文档,没有任何帮助。
事先谢谢安德鲁
发布于 2013-06-14 07:33:19
对任何感兴趣的人来说,这就是我们最终解决问题的方法:
似乎我们无法让couchDB与我们的中间证书一起正常工作。
由于我们在AWS EC2实例上运行我们的EC2服务器,我刚刚创建了一个ELB (弹性负载均衡器)实例,并将我的证书上传到ELB,然后在负载均衡器下添加EC2实例,并将我的DNS重新路由到负载均衡器(这里也使用Route53 )。
然后,我在couchDB上完全关闭SSL,并将SSL握手交给负载平衡器,后者支持使用中间证书。
这确实意味着ELB和couchDB之间的通信是不安全的,但对我们来说,这很好。
这也意味着,我们现在可以在ELB下添加更多的couchDB服务器,以实现可伸缩性,因此,可以使用2Birs1stone解决方案。
你也可以用Nginx做同样的解决方案,但是添加和管理一个ELB很容易并且很稳定,所以我们使用了ELB解决方案。
发布于 2013-07-21 19:00:00
有几件事CouchDB是敏感的。其中一个问题是Namec堆的重新发布表单。如果使用Namec堆处理CSR,则会出现问题。例如,我通过Namec堆购买了一个RapidSSL证书,为了正确地重新颁发它,我必须直接到GeoTrust获得一个工作证书:https://products.geotrust.com/orders/orderinformation/authentication.do
为了创建SSL证书,我执行了以下操作:
$ openssl genrsa -des3 -out server.pem 2048使用了密码。它必须用于其他命令,请不要忘记它。
创建证书请求:
$ openssl req -new -key server.pem -out server.csr只回答以下问题:
所有其他问题都是空白的。
此命令创建CouchDB将使用的未加密私钥:
$ openssl rsa -in server.pem -out server.key当请求csr时,将server.csr文件的内容传递到文本框中。
经过一堆电子邮件,你最终会得到证书。另一个问题是CouchDB如何处理链接的证书。不要担心创建链接证书;忽略中间crt,您只需要特定的证书即可使couchdb正常工作。
修改CouchDB local.ini文件中的下列行:
[daemons]
; enable SSL support by uncommenting the following line and supply the PEM's below.
; the default ssl port CouchDB listens on is 6984
httpsd = {couch_httpd, start_link, [https]}
[ssl]
cert_file = /path/to/ssl/cert/server.crt
key_file = /path/to/ssl/cert/server.key我不确定这是否会产生影响,但请确保SSL证书的权限设置为600。还请确保由CouchDB进程用户设置证书:
# in the ssl cert directory
sudo chmod 600 ./*
sudo chown couchdb:couchdb ./*并重新启动服务器:
sudo /etc/init.d/couchdb restart发布于 2016-09-17 20:20:17
摘要:您需要CouchDB 1.6.0或更高版本才能工作(或修补当前版本)。
我在运行CouchDB 1.4.0或Raspberry (raspbian )时也遇到了同样的问题。
我使用以下命令确认,CouchDB服务器只是发送自己的证书,而不是按照TLS规范的要求发送整个证书链:
openssl s_client -connect myhostname:6984 -showcerts这只显示了一份证书。此外,它报告了一次核查失败。我的证书是Namec堆的。虽然我已经在客户端机器上安装了颁发者(COMODO )的根证书,但至少需要一个中间证书才能完成该链。
请注意,一些浏览器能够自动获取中间证书,并且所有这些都看起来很好。不过,大多数命令行工具(curl、perl、python、openssl)都失败了。同样有趣的是,在Android的Chrome浏览器上,它偶尔会显示出绿色锁(这一切都很好),而在其他时候,据报道该网站无法被验证。我怀疑它使用的是本地证书缓存。如果我碰巧浏览了一个提供相同中间证书的站点,那么验证将随后对我的CouchDB服务器成功,直到缓存被清除。
在深入研究CouchDB和Erlang源代码之后,我发现: Erlang可以作为“cacertfile”传递一个PEM文件。这既用于验证客户端证书(如果启用),也用于组成要发送到TLS证书消息中的客户端的完整证书链。但是,我的CouchDB版本并没有传递cacertfile参数,除非其中一个指定了cacert_file 和 verify_ssl_certificates = true。但是,如果满足这些条件,则忽略服务器密钥和证书!
我发现这已经作为bug COUCHDB-2028归档了。请注意,bug说这个问题已经在1.7.0版本中解决了,我认为这个版本并不存在。
我发现修补程序已应用于正式的CouchDB存储库。在2014-01-30.不幸的是,官方的修订历史没有显示修复,但深入研究git显示,修补程序是在CouchDB 1.6.0中首次正式发布的。
在我的例子中,我能够从源代码下载、编译和安装CouchDB 1.6.1。现在,上面的openssl命令显示了由CouchDB服务器发送的4个证书链。我提供服务器密钥和证书,加上从Namec堆下载的CA包的cacert_file。verify_ssl_certificates是假的。我测试过的所有浏览器都信任这个站点,而且我的命令行工具可以在没有黑客攻击的情况下禁用验证。
https://stackoverflow.com/questions/17043233
复制相似问题