Orthanc与pynetDicom间DICOM TLS连接失败问题求助
解决Orthanc与pynetDicom的TLS连接问题
问题背景
本地Mac的Orthanc客户端与EC2上的pynetDicom服务器通过Let's Encrypt证书建立TLS连接时出现异常:
- openssl测试需加
-partialChain才能返回成功码0,但存在意外EOF错误;不加则提示“无法获取颁发者证书” - Orthanc发送DICOM数据失败,报错:
ErrorCode: 9 ErrorDescription: Error in the network protocol ErrorDetails: DicomAssociation - connecting to AET "MY_AET": TLS error: OpenSSL error - 关闭TLS后连接正常,尝试过NLB终止TLS、pynetDicom层加密、本地Orthanc测试均无效
解决方案
1. 确保Let's Encrypt证书链完整
Let's Encrypt证书需要包含域名证书+中间证书的完整链,单独的域名证书会导致客户端无法验证颁发者:
- 使用certbot生成的
fullchain.pem作为服务器证书文件,该文件已包含完整链 - 若手动拼接,将域名证书(
cert.pem)和中间证书(chain.pem)按顺序合并成一个文件,无多余空行
2. 修正pynetDicom的SSL上下文配置
调整Python SSL上下文,确保证书链正确加载并启用安全协议:
# 初始化TLS上下文 context = ssl.create_default_context(ssl.Purpose.CLIENT_AUTH) # 加载完整证书链和私钥 context.load_cert_chain(certfile="/path/to/fullchain.pem", keyfile="/path/to/privkey.pem") # 禁用老旧TLS协议,仅保留安全版本 context.options |= ssl.OP_NO_TLSv1 | ssl.OP_NO_TLSv1_1 # 设置安全加密套件(可选) context.set_ciphers('ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384') ae.tls_server_context = context # 启动服务器 assoc = ae.start_server( (NODE_IP, NODE_PORT), ae_title=AE_TITLE, evt_handlers=handlers, ssl_context=ae.tls_server_context )
注意:无需单独调用
load_verify_locations,fullchain.pem已包含中间证书
3. 调整NLB的TLS配置(若使用NLB终止加密)
如果在NLB层处理TLS:
- NLB上传的证书必须是
fullchain.pem,不能仅上传域名证书 - NLB安全策略仅启用TLS 1.2及以上版本
- 确认目标组正确转发到EC2的pynetDicom端口,且健康检查正常
- 此时EC2上的pynetDicom无需再配置TLS,直接使用明文连接
4. 验证证书链有效性
使用openssl重新测试,无需加-partialChain:
openssl s_client -connect <你的NLB或EC2 IP>:<端口> -CAfile /etc/ssl/certs/ca-certificates.crt
返回Verify return code: 0 (ok)则证书链配置正确。若仍有问题,检查Mac本地是否包含Let's Encrypt的ISRG Root X1根证书(Mac默认已预装,缺失则手动安装)
5. 配置Orthanc的TLS参数
修改Orthanc配置文件:
- 设置
SslEnabled: true启用TLS - 若需验证服务器证书,设置
SslVerifyPeers: true,并将SslCaCertificates指向包含ISRG Root X1的证书文件(如Mac的/etc/ssl/certs/ca-certificates.crt) - 确认DICOM目标配置的端口为TLS端口(DICOM TLS默认端口1235,自定义端口需对应)
常见问题排查
- 意外EOF错误:检查EC2安全组是否开放目标端口,同时确认pynetDicom服务器启动后未异常退出
- 无法获取颁发者证书:确认服务器提供的是完整
fullchain.pem,而非单独的域名证书 - Orthanc OpenSSL错误:查看Orthanc日志获取具体错误码,用
openssl errstr <错误码>查询详细原因
内容的提问来源于stack exchange,提问作者SUMIT JANAWLEKAR
相关产品推荐
相关产品推荐

