apache - 如何在 Docker 上运行的 Apache 服务器中安装 mod_auth_openidc 模块

标签 apache openid-connect keycloak apache-modules

我正在尝试添加 mod_auth_openidc module到在 Docker 上运行的 Apache 服务器。添加后LoadModule auth_openidc_module modules/mod_auth_openidc.so ,我创建图像并运行它,得到这个错误:

httpd: Syntax error on line 69 of /usr/local/apache2/conf/httpd.conf: Cannot load modules/mod_auth_openidc.so into server: libcjose.so.0: cannot open shared object file: No such file or directory

所以我downloaded that dependency并添加了必要的 LoadModule 语句:
LoadModule libcjose_module modules/libcjose.so.0

现在错误是关于 libjansson.so.4:
httpd: Syntax error on line 68 of /usr/local/apache2/conf/httpd.conf: Cannot load modules/libcjose.so.0 into server: libjansson.so.4: cannot open shared object file: No such file or directory

我重复前面的步骤,从 https://packages.debian.org/wheezy/libjansson4 下载 libjansson.so.4 ,将其添加到 Dockerfile 中,Apache 配置 LoadModule libjansson_module modules/libjansson.so.4和:
httpd: Syntax error on line 67 of /usr/local/apache2/conf/httpd.conf: Can't locate API module structure `libjansson_module' in file /usr/local/apache2/modules/libjansson.so.4: /usr/local/apache2/modules/libjansson.so.4: undefined symbol: libjansson_module

那么如何加载 jansson 模块???

这是我的 Dockerfile :
FROM httpd:2.4
RUN apt-get update && apt-get install -y \
curl
COPY ./libjansson.so.4 /usr/local/apache2/modules/libjansson.so.4
COPY ./libcjose.so.0 /usr/local/apache2/modules/libcjose.so.0
COPY ./mod_auth_openidc.so /usr/local/apache2/modules/mod_auth_openidc.so
COPY ./my-httpd.conf /usr/local/apache2/conf/httpd.conf

httpd.conf :
LoadModule libjansson_module modules/libjansson.so.4
LoadModule libcjose_module modules/libcjose.so.0
LoadModule auth_openidc_module modules/mod_auth_openidc.so

最佳答案

2021 年,zmartzone 模块以 Debian 软件包的形式提供。所以我能够使用简单的 Dockerfile 构建图像,但我只需要 https(而不是 php 等)。我选择使用 httpd buster 基础镜像,在 buster 中的 zmartzone 包版本是 2.3.10.2-1,今天最新最好的是 2.4.9.4。这是我的 Dockerfile,只需要两个命令:

# Build image with Apache HTTPD and OpenID connect module
FROM httpd:2.4-buster

RUN apt-get update && \
    apt-get install --no-install-recommends -y \
    ca-certificates libapache2-mod-auth-openidc

# leave entrypoint etc. unchanged from base image
我完全不明白的一件事,即 apache httpd 基础镜像
/usr/local/apache2/modules 中有模块但该软件包在 /usr/lib/apache2/modules 中安装了 auth_openidc_module .也许有人可以向我解释一下?
无论如何,试图使这个答案完整,使用这个图像需要更改基础图像文件 /usr/local/apache2/httpd.conf/usr/local/apache2/extra/httpd-ssl.conf .这是第一组差异:
% diff httpd.conf.orig httpd.conf 
94c98
< #LoadModule socache_shmcb_module modules/mod_socache_shmcb.so
---
> LoadModule socache_shmcb_module modules/mod_socache_shmcb.so
142c146
< #LoadModule proxy_module modules/mod_proxy.so
---
> LoadModule proxy_module modules/mod_proxy.so
161c165
< #LoadModule ssl_module modules/mod_ssl.so
---
> LoadModule ssl_module modules/mod_ssl.so
199a204
> LoadModule auth_openidc_module /usr/lib/apache2/modules/mod_auth_openidc.so
241c246
< #ServerName www.example.com:80
---
> ServerName server.my.company.com:80
541c546
< #Include conf/extra/httpd-ssl.conf
---
> Include conf/extra/httpd-ssl.conf
还有额外的/httpd-ssl.conf:
% diff httpd-ssl.conf.orig httpd-ssl.conf
125c129
< ServerName www.example.com:443
---
> ServerName server.my.company.com:443
290c294,319
< </VirtualHost>                                  
---
> OIDCProviderMetadataURL https://oidserver.my.company.com/.well-known/openid-configuration
> OIDCClientID my-company-client-id
> OIDCClientSecret my-company-client-scret
> OIDCRedirectURI https://server.my.company.com/secure/redirect_uri
> OIDCCryptoPassphrase my-company-crypto-passphrase
> 
> <Location /secure>
>    AuthType openid-connect
>    Require valid-user
> </Location>
> 
> </VirtualHost>
如果您的容器不信任您的 OIDC 服务器使用的证书,尽管安装了包 ca-certificates,您可能必须将此条目添加到您的 httpd-ssl.conf文件,但这是一个丑陋的黑客:
# https://github.com/zmartzone/mod_auth_openidc/issues/56
OIDCSSLValidateServer Off
在我的部署中,我选择将这些 httpd 配置文件挂载到容器中,这样可以避免将 OID 客户端 secret 构建到 docker 镜像中。这是 image 上的示例 docker-compose.yml行使用您应用到从上面显示的 Dockerfile 构建的镜像的标记:
version: "3"
services:
  # httpd starts as root, binds ports then switches to daemon (UID 1)
  httpd:
    image: httpd-openidc:local
    ports:
      - 80:80
      - 443:443
    volumes:
      - /Users/me/apache-httpd/httpd.conf:/usr/local/apache2/conf/httpd.conf
      - /Users/me/apache-httpd/httpd-ssl.conf:/usr/local/apache2/conf/extra/httpd-ssl.conf
      - /Users/me/apache-httpd/my-dev.key:/usr/local/apache2/conf/server.key
      - /Users/me/apache-httpd/my-dev.crt:/usr/local/apache2/conf/server.crt
到目前为止,这工作正常,HTH
(2022 年 1 月更新以安装 ca 证书,感谢 @uupascal!)

关于apache - 如何在 Docker 上运行的 Apache 服务器中安装 mod_auth_openidc 模块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49149911/

相关文章:

java - apache httppost如何设置内容: which have name value pair pointing to another set of name value pair

PHP Curl 无法连接到自己服务器上的主机

authentication - 当服务器以端口偏移启动时,WSO2IS-5.11.0 中的 Myaccount 和控制台应用程序无法工作

identityserver4 - 使用IdentityServer和JavaScript的oidc客户端登录SigninSilentCallback中没有用户

registration - Keycloak 条款和条件作为单独的页面

php - 使用 var_dump 或 echo 在实时服务器上调试 php

php - 如何在php或apache中限制文件上传速度?

Azure 企业管理员同意动态应用程序范围

java - 使用Java Servlet Filter Adapter时如何使用KeyCloak获取用户数据

java - 在 keycloak 中跳过 kerberos sso 身份验证