如何为Docker部署的LinuxForHealth FHIR Server配置Let's Encrypt可信SSL证书
别慌,我之前帮朋友处理过几乎一模一样的场景,核心就是把Let's Encrypt的PEM格式证书转换成FHIR Server要求的PKCS12(.p12)密钥库,再调整Docker挂载和服务器配置就行,一步步来:
第一步:把Let's Encrypt的PEM文件转换成PKCS12格式
LinuxForHealth FHIR Server确实依赖PKCS12格式的密钥库,所以先处理证书格式转换。假设你手里有这两个关键文件:
fullchain.pem:包含你的域名证书+Let's Encrypt的中间证书链privkey.pem:你的域名专属私钥
在宿主机上执行这条openssl命令(记得替换成你的实际文件路径,还要设置一个自定义密码,这个密码后面要用到):
openssl pkcs12 -export -out fhir-server-cert.p12 -inkey /path/to/privkey.pem -in /path/to/fullchain.pem -name "fhir-server"
执行后会提示你输入导出密码,一定要记牢,后续配置要用到它。
第二步:准备Docker可访问的证书与配置目录
因为Docker容器需要读取证书和配置文件,先在宿主机上创建专门的目录:
mkdir -p /opt/linuxforhealth/fhir/certs mkdir -p /opt/linuxforhealth/fhir/config
把刚才生成的fhir-server-cert.p12移动到证书目录,还要调整权限确保容器能读取:
mv fhir-server-cert.p12 /opt/linuxforhealth/fhir/certs/ chmod 644 /opt/linuxforhealth/fhir/certs/fhir-server-cert.p12
第三步:配置FHIR Server的SSL参数
创建或修改FHIR Server的application.yaml配置文件,放到刚才的/opt/linuxforhealth/fhir/config/目录下,重点配置SSL部分:
server: ssl: enabled: true key-store-type: PKCS12 key-store: /opt/certs/fhir-server-cert.p12 key-store-password: 你刚才设置的导出密码 key-alias: fhir-server
注意这里的key-store是容器内部的路径,后面挂载时要对应上。
第四步:修改Docker启动命令(或docker-compose配置)
让容器挂载我们准备好的证书和配置目录,替换原来的启动命令。如果用docker run:
docker run -d \ --name linuxforhealth-fhir \ -p 9443:9443 \ -v /opt/linuxforhealth/fhir/config:/opt/fhir/config \ -v /opt/linuxforhealth/fhir/certs:/opt/certs \ linuxforhealth/fhir-server:latest
如果用docker-compose,对应的配置块如下:
services: fhir-server: image: linuxforhealth/fhir-server:latest container_name: linuxforhealth-fhir ports: - "9443:9443" volumes: - /opt/linuxforhealth/fhir/config:/opt/fhir/config - /opt/linuxforhealth/fhir/certs:/opt/certs
第五步:验证配置是否生效
启动容器后,先查看日志确认没有报错:
docker logs linuxforhealth-fhir
然后用浏览器或curl访问https://你的域名:9443/fhir/metadata,如果能正常返回FHIR元数据,且浏览器显示证书是Let's Encrypt的可信证书,就说明配置成功了。
另外要注意:Let's Encrypt证书90天会过期,你需要设置自动续签,续签后重复第一步的转换命令,再重启FHIR容器即可。可以写个简单的shell脚本配合cron来自动完成这个流程。
备注:内容来源于stack exchange,提问作者Sundaresan-JSE

