我想要做的事情:
现在我使用的是自签名 SSL 证书,效果很好。但我想用 的官方证书替换它们lets encrypt
。
我所拥有的(自签名证书): 下面是我现在拥有的 ssl 重要设置(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 = /etc/couchdb/certs/server.crt // these are my self made certificates
key_file = /etc/couchdb/certs/server.key // these are my self made certificates
; set to true to validate peer certificates
verify_ssl_certificates = false
; Path to file containing PEM encoded CA certificates (trusted
; certificates used for verifying a peer certificate). May be omitted if
; you do not want to verify the peer.
;cacert_file = /full/path/to/cacertf
; The verification fun (optional) if not specified, the default
; verification fun will be used.
;verify_fun = {Module, VerifyFun}
; maximum peer certificate depth
ssl_certificate_max_depth = 1
我尝试过的(让我们加密):
按照 lets encrypt 的文档操作后,我得到一个/etc/letsencrypt/live/[domain]
包含以下文件的文件夹:
-cert.pem // seems to be the public certificate
-chain.pem // seems to be the public certificate from the keychain
-fullchain.pem // seems to be the cert.pem + chain.pem
-privkey.pem // seems to be the private certificate
因此我尝试用 local.ini 中的旧证书替换新证书
[ssl]
cert_file = /etc/letsencrypt/live/[domain]/cert.pem // new certificate
key_file = /etc/letsencrypt/live/[domain]/privkey.pem // new certificate
问题:
重新启动 CouchDB 后,非 SSL 方式端口 5984 仍然有效。但在端口 6984 上使用 SSL 时,我connection reset error
在 chrome 中遇到了问题。PS:我也为我的 nginx 使用相同的 letsencrypt 证书,它们运行完美。
有任何想法吗?
Openssl调试信息:
1)使用 SSL 和自签名证书,我可以获得一份打印的证书和大量我输入过的信息。
2)不使用 SSL 和 letsencryptopenssl s_client -connect localhost:5984
CONNECTED(00000003)
140581663061872:error:140770FC:SSL routines:SSL23_GET_SERVER_HELLO:unknown protocol:s23_clnt.c:795:
---
no peer certificate available
---
No client certificate CA names sent
---
SSL handshake has read 7 bytes and written 207 bytes
---
New, (NONE), Cipher is (NONE)
Secure Renegotiation IS NOT supported
Compression: NONE
Expansion: NONE
3)使用 SSL 和 letsencryptopenssl s_client -connect localhost:6984
CONNECTED(00000003)
write:errno=104
---
no peer certificate available
---
No client certificate CA names sent
---
SSL handshake has read 0 bytes and written 207 bytes
---
New, (NONE), Cipher is (NONE)
Secure Renegotiation IS NOT supported
Compression: NONE
Expansion: NONE
答案1
使用 CouchDB 1.6.x
复制文件/etc/letsencrypt/archive/xxxx
到/var/lib/couchdb/cert1/
检查 CouchDB 的访问权限
将以下值放入其中/usr/local/etc/couchdb/local.ini
。注意,以下文件夹与上面复制到的文件夹相匹配。
cert_file = /var/lib/couchdb/cert1/cert1.pem
key_file = /var/lib/couchdb/cert1/privkey1.pem
cacert_file = /var/lib/couchdb/cert1/fullchain1.pem```
答案2
如何使 https ssl 在 Ubuntu 18.04 上的 CouchDB 2.3.0 上工作:
- 设置文件位于:/opt/couchdb/etc/local.ini
- 原始问题中的 [deamons] 容器是不需要的。
- 只有真正将文件复制到couchdb文件夹(参见frederics答案)并将文件所有者(使用chown couchdb:couchdb)更改为couchdb用户才是唯一有效的方法。 (符号链接或直接深度链接到letsencrypt文件夹都将失败)。
在 local.ini 中编辑后,不要忘记重新启动 couchdb
systemctl 停止 couchdb;systemctl 启动 couchdb
使用 tail -f /opt/couchdb/var/log/couchdb.log 查看 couchdb 的启动错误
检查端口 6984 是否未被防火墙保护,请执行 ufw allow 6984
现在转到https://yourdomain.com:6984并且couchdb将通过https工作。
当 letsencrypt 更新证书时,不要忘记重复步骤 3。
答案3
我正在使用以下解决方案。在 certbot 中,我有一个post renewal-hook
包含以下几行的脚本:
rm -rf /opt/couchdb/letsencrypt
mkdir /opt/couchdb/letsencrypt
cp -rfL /etc/letsencrypt/live/ /opt/couchdb/letsencrypt
chown -R couchdb:couchdb /opt/couchdb/letsencrypt/
这会将证书复制到 couchdb 文件夹,并将所有权更改为 couchdb 用户/组。无论出于何种原因,证书文件必须归 couchdb 用户所有,而正常的读取权限/etc/letsencrypt
似乎不够。
暗示:一开始我没有前两行rm
,mkdir
这导致了一些问题,因为cp -rfL
根据目标文件夹的存在,行为会有所不同。在一种情况下,生成的目录结构是,/opt/letsencrypt/live/<subfolders>
而在另一种情况下是/opt/letsencrypt/<subfolders>
。这第一次破坏了我的自动证书更新过程。
我local.ini
有:
cert_file = /opt/couchdb/letsencrypt/live/<my-hostname>/cert.pem
key_file = /opt/couchdb/letsencrypt/live/<my-hostname>/privkey.pem
cacert_file = /opt/couchdb/letsencrypt/live/<my-hostname>/fullchain.pem
这适用于 Ubuntu 20.04