请求协助配置Dovecot+Roundcube对接Keycloak OPENID认证
Dovecot + Keycloak OIDC 认证配置故障排查
需求说明
搭建Dovecot+Roundcube邮件系统,通过Keycloak的OPENID协议实现用户认证。当前阶段仅测试Dovecot与Keycloak的集成,使用Thunderbird客户端连接,但尝试连接时Dovecot无任何日志输出,无法排查问题。
现有配置文件
Docker Compose 配置
version: "3" services: keycloak: image: quay.io/keycloak/keycloak:latest command: ['start-dev --import-realm --http-relative-path=/auth --log-level=DEBUG'] environment: - KEYCLOAK_USER=admin - KEYCLOAK_PASSWORD=admin - KEYCLOAK_ADMIN=myadmin - KEYCLOAK_ADMIN_PASSWORD=myadmin - DB_VENDOR=POSTGRES - DB_ADDR=keycloak-db - DB_DATABASE=keycloak - DB_USER=keycloak - DB_PASSWORD=keycloak ports: - 8080:8080 # Keycloak 用户界面端口 - 9990:9990 # WildFly/JBoss 管理界面端口 networks: - keycloak-network #restart: always depends_on: - keycloak-db keycloak-db: image: postgres:latest environment: - POSTGRES_DB=keycloak - POSTGRES_USER=keycloak - POSTGRES_PASSWORD=keycloak networks: - keycloak-network restart: always volumes: - './dbkeycloak:/var/lib/postgresql/data' dovecot: image: dovecot/dovecot container_name: dovecot ports: - "127.0.0.1:993:993" # IMAPS 端口映射 environment: - MAIL_DOMAIN=localhost volumes: - ./dovecot.conf:/etc/dovecot/dovecot.conf - ./dovecot-oauth2.conf.ext:/etc/dovecot/dovecot-oauth2.conf.ext command: ["sh", "-c", "dovecot -F"] roundcube: image: roundcube/roundcubemail container_name: roundcube1 ports: - "80:80" environment: - ROUNDCUBEMAIL_DEFAULT_HOST=dovecot - ROUNDCUBEMAIL_SMTP_SERVER=dovecot - ROUNDCUBEMAIL_IMAP_HOST=dovecot - ROUNDCUBEMAIL_IMAP_PORT=993 - ROUNDCUBEMAIL_IMAP_SECURE=ssl - ROUNDCUBEMAIL_IMAP_AUTH_TYPE=PLAIN depends_on: - dovecot networks: keycloak-network: driver: bridge
dovecot-oauth2.conf.ext 配置
grant_url = http://keycloak:8080/realms/sso/protocol/openid-connect/token client_id = dovecot client_secret = bKBUxAyVc8boi53RPfx6nDtwRSmnUbin tokeninfo_url = http://keycloak:8080/realms/sso/protocol/openid-connect/token introspection_url = http://keycloak:8080/realms/sso/protocol/openid-connect/token/introspect introspection_mode = post use_grant_password = no debug = yes username_attribute = username pass_attrs = pass=%{oauth2:access_token}
dovecot.conf 配置
mail_home=/srv/mail/%Lu mail_location=sdbox:~/Mail mail_uid=1000 mail_gid=1000 protocols = imap pop3 submission sieve lmtp first_valid_uid = 1000 last_valid_uid = 1000 disable_plaintext_auth=no # 认证配置: auth_verbose = yes auth_mechanisms = oauthbearer xoauth2 plain login passdb { driver = oauth2 mechanisms = xoauth2 oauthbearer args = /etc/dovecot/dovecot-oauth2.conf.ext } userdb { driver = static args = uid=vmail gid=vmail home=/var/mail/mailbox/%Lu } mail_privileged_group = mail ssl=yes ssl_cert=<cert.pem ssl_key=<key.pem namespace { inbox = yes separator = / } service lmtp { inet_listener { port = 24 } } listen = * log_path=/dev/stdout info_log_path=/dev/stdout debug_log_path=/dev/stdout auth_debug=yes !include_try /etc/dovecot/conf.d/*.conf
问题排查与配置修正建议
1. 网络连通性问题
- Dovecot容器未加入
keycloak-network网络,导致无法访问Keycloak服务。修改Docker Compose中Dovecot的配置,添加网络声明:
dovecot: # ... 其他配置 ... networks: - keycloak-network
- 重启Dovecot容器后,在容器内执行
curl http://keycloak:8080/realms/sso/protocol/openid-connect/token验证连通性。
2. 日志无输出的原因
- 当前Dovecot端口绑定为
127.0.0.1:993:993,仅允许本地访问。如果Thunderbird运行在宿主机外,无法连接到Dovecot。将端口绑定改为0.0.0.0:993:993,允许外部访问:
ports: - "0.0.0.0:993:993"
- 检查Dovecot容器是否正常启动,执行
docker logs dovecot查看启动日志,确认配置文件是否加载成功、是否有SSL证书错误(当前配置的cert.pem和key.pem未挂载到容器内,会导致SSL启动失败)。需添加证书文件挂载:
volumes: # ... 现有挂载 ... - ./cert.pem:/etc/dovecot/cert.pem - ./key.pem:/etc/dovecot/key.pem
或者临时关闭SSL测试(不推荐生产环境):将ssl=yes改为ssl=no,并开放143端口(IMAP):
ports: - "0.0.0.0:143:143"
同时修改dovecot.conf中的ssl=no,disable_plaintext_auth=no保持不变。
3. Oauth2配置修正
tokeninfo_url配置错误,Keycloak的用户信息端点应为http://keycloak:8080/realms/sso/protocol/openid-connect/userinfo,而非token端点。修改dovecot-oauth2.conf.ext:
tokeninfo_url = http://keycloak:8080/realms/sso/protocol/openid-connect/userinfo
- 确认Keycloak中
dovecot客户端的配置:- 确保客户端的
Access Type为confidential(因为使用了client_secret) - 开启
Direct Access Grants Enabled(若需支持密码模式,当前use_grant_password=no可跳过,但需确保客户端支持Oauth2 Bearer流程) - 若使用授权码流程,需在
Valid Redirect URIs中添加Dovecot相关回调地址
- 确保客户端的
4. Thunderbird Oauth2配置
Thunderbird默认可能未启用Oauth2认证,需手动配置:
- 新建账户时选择
手动配置 - IMAP服务器地址设为宿主机IP,端口993,连接安全
SSL/TLS,认证方法OAuth2 - 输入Keycloak的用户名,按照提示完成授权流程
验证步骤
- 重启所有容器:
docker-compose down && docker-compose up -d - 查看Dovecot日志:
docker logs -f dovecot - 尝试用Thunderbird连接,观察日志输出,定位具体错误
内容的提问来源于stack exchange,提问作者thibd
相关产品推荐
相关产品推荐

