You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

请求协助配置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的用户名,按照提示完成授权流程

验证步骤

  1. 重启所有容器:docker-compose down && docker-compose up -d
  2. 查看Dovecot日志:docker logs -f dovecot
  3. 尝试用Thunderbird连接,观察日志输出,定位具体错误

内容的提问来源于stack exchange,提问作者thibd

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 17:28:14