由于在内网环境部署的Bitwarden,不能通过安装脚本自动申请Let’s Encrypt 的证书。
起初我用了一个自签名证书,发现特别不好使,虽然在firefox 跟 chrome 内核的浏览器上都能通过插件访问,但必须添加信任才行,特别是用Bitwarden Desktop 客户端连的时候,一直报错,可能是不认自签名证书。 于是琢磨了下怎么手动申请Let’s Encrypt的证书用于内网,对过程简单梳理如下。
自签名证书 | Self-Signed Certificate
如果你在内网环境只需要自签名证书,可以参考Bitwarden的帮助文档(Installing and depoying)进行设置:
1、生成自签名证书:
//一条命创建私钥和证书:
openssl req -x509 -newkey rsa:4096 -sha256 –nodes -days 10950 \
-keyout privite.key -out identity.crt \
-subj "/C=US/ST=New York/L=New York/O=Company Name/OU=CREAST /CN=bw.creast.win"
将生成的文件放到 /ssl 目录下:
privite.key ~/bwdata/ssl/bw.creast.win/private.key
identity.crt ~/bwdata/ssl/bw.creast.win/identity.crt
2、生成.pfx格式证书文件:
//一条命令将前面生成的私钥和证书打包成需要的pfx格式文件
openssl pkcs12 -export -out ./identity.pfx -inkey privite.key \
-in identity.crt -certfile identity.crt -passout pass:IDENTITY_CERT_PASSWORD注意 IDENTITY_CERT_PASSWORD 跟./env/global.override.env 配置内容保持一致;
执行成功后将生成的 文件,放到 /identity 目录下:
identity.pfx ~/bwdata/identity/identity.pfx
以上操作直接在部署Bitwardern 的机器上执行。
证书申请前提条件
- 有公网DNS解析正常的域名 (用于通过Let's Encrypt 证书申请的验证)
- 该域名指向公网上的一台能正常响应的主机(能ping通,该主机上不要求运行任何服务)
- 一台能访问外网的机器,安装Let's Encrypt 的命令行工具Certbot ,以ubuntu 为例:
$ sudo apt-get install certbot
申请 Let's Encrypt 证书
关于 certbot 的功能跟原理这里不多讲,这里重点说一下如何以 manual 方式申请证书。以下操作步骤在一台能访问外网的机器上执行,如果你部署bitwarden的机器可以访问外网可以直接在上面执行:
1、选择以dns认证方式申请证书:
sudo certbot certonly --manual --preferred-challenges dns
填写完基本信息后会要求你在dns记录里添加一条指定内容的的 TXT 记录,如:
_acme-challenge.bw.creast.win. 300 IN TXT "gfj9Xqa2gVbHjl….FtkDRg85nM"
2、登录你的域名服务商后台,添加 TXT 记录:
3、验证TXT DNS 记录
在回车确认前,先用dig 检查一下dns 记录是否已经生效:
dig -t txt _acme-challenge.bw.creast.win
确认;; ANSWER SECTION: 部分跟验证指定的内容一致后再回车;
4、成功生成证书
待 certbot 程序验证通过后会生成多个pem格式的证书相关文件,并存放在 /etc/letsencrypt/live/ 目录下,分别是:
let’s Encrypt 文件 | 文件说明 | 对应nginx ssl 设置 |
`privkey.pem` | the private key for your certificate | ssl_certificate_key |
`fullchain.pem` | the certificate file used in most server software. | ssl_certificate |
`chain.pem` | used for OCSP stapling in Nginx >=1.3.7. | |
`cert.pem` | will break many server configurations, and should not be used without reading further documentation |
这里 privkey.pem 跟 fullchain.pem 是需要用到的私钥和证书文件,将他们复制一份到部署Bitwarden机器 bwdata/ssl/bw.creast.win 目录下
5、生成.pfx格式证书文件:
//同自签名证书一样,命令中的私钥和证书文件将使用通过 certbot 申请获得的:
openssl pkcs12 -export -out ./identity.pfx -inkey privkey.pem \
-in fullchain.pem -certfile fullchain.pem -passout pass:IDENTITY_CERT_PASSWORD
注意 IDENTITY_CERT_PASSWORD 跟./env/global.override.env 配置内容保持一致;
执行成功后将生成的 文件,放到部署Bitwarden机器的 bwdata/identity 目录下。至此,配置Bitwarden nginx SSL所需的证书文件都准备就绪。
更新SSL相关配置
1、更新 bwdata/config.yml 配置文件,将ssl相关配置修改为实际环境值,例如:
url: https://bw.creast.win
ssl: true
ssl_managed_lets_encrypt: false
ssl_certificate_path: /etc/ssl/bw.creast.win/fullchain.pem
ssl_key_path: /etc/ssl/bw.creast.win/privkey.pem
2、更新 Bitwarden docker 配置文件,重启bitwarden服务
./bitwarden.sh stop
./bitwarden.sh rebuild
./bitwarden.sh start
待所有服务重新起来后,在浏览器访问可以看到已经是绿标,显示证书来自“ Let's Encrypt”。用 Bitwarden Desktop 客户端连接也正常了。
Comments
Post a Comment