1. 記事一覧 >
  2. ブログ記事
category logo

Nginx&SimpleSAMLphpをOIDC対応RP化してAzure AD(Entra ID)認証

(更新) (公開)

はじめに

前回記事「Nginx&SimpleSAMLphp で SAML の SP を構築 Azure AD で認証」にて、SimpleSAMLphp の SAML における SP(Service Provider) を構築して、Azure AD で認証まで行いました。
今回は、SimpleSAMLphp で OpenID Connect(OIDC) の Relying Party(RP) を構築して、OpenID Provider(OP) は、Azure AD(Microsoft Entra ID) とし、Azure AD のユーザーアカウントで認証まで行います。
Web アプリケーション作成から Azure AD の設定、SSO 認証実現までの全手順を紹介していきます。


なお、
・Web アプリケーション環境構築
・SimpleSAMLphp Web コンソール環境作成
・SimpleSAMLphp Web コンソール初期設定
までは前回記事と被りますので、実施内容だけ書いて、説明無しでいきます。
この記事の本題は、SimpleSAMLphp の Web コンソール管理者画面を表示したところからスタートです。
説明が必要な場合、前回記事を参照してください。


SimpleSAMLphp OIDC 関係図


Azure AD(Azure Active Directory)は、Microsoft Entra ID に名称が変わりましたが、この記事では、Azure AD 表記のままでいきます。

【検証環境】

Ubuntu 22.04.3 LTS

Nginx 1.18.0

PHP 8.3.0

SimpleSAMLphp 2.1.1


Web アプリケーション環境構築

今回、Web アプリケーションサーバーの URI は、

https://webapps-php.example.com/info.php とします。

# apt update
# add-apt-repository ppa:ondrej/php -y
# apt update
# apt -y install php8.3 php8.3-gd php8.3-mbstring php8.3-common php8.3-curl
# php -v
PHP 8.3.0 (cli) (built: Nov 24 2023 08:50:08) (NTS)
Copyright (c) The PHP Group
Zend Engine v4.3.0, Copyright (c) Zend Technologies
    with Zend OPcache v8.3.0, Copyright (c), by Zend Technologies
# apt list --installed | grep apache2

WARNING: apt does not have a stable CLI interface. Use with caution in scripts.

apache2-bin/jammy-updates,jammy-security,now 2.4.52-1ubuntu4.7 amd64 [インストール済み、自動]
apache2-data/jammy-updates,jammy-updates,jammy-security,jammy-security,now 2.4.52-1ubuntu4.7 all [インストール済み、自動]
apache2-utils/jammy-updates,jammy-security,now 2.4.52-1ubuntu4.7 amd64 [インストール済み、自動]
apache2/jammy-updates,jammy-security,now 2.4.52-1ubuntu4.7 amd64 [インストール済み、自動]
libapache2-mod-php8.3/jammy,now 8.3.0-1+ubuntu22.04.1+deb.sury.org+1 amd64 [インストール済み、自動]
# apt -y remove apache2-*
# apt install -y php-fpm
# apt install nginx -y
# nginx -v
nginx version: nginx/1.18.0 (Ubuntu)
# vi /etc/nginx/fastcgi_params
/etc/nginx/fastcgi_params
fastcgi_param  SCRIPT_NAME        $fastcgi_script_name;
fastcgi_param  SCRIPT_FILENAME    $document_root$fastcgi_script_name;
fastcgi_param  SCRIPT_NAME        $fastcgi_script_name;
# mkdir -p /opt/webapps/php
# chown -R www-data: /opt/webapps
# mkdir -p /var/log/webapps/php
# vi /opt/webapps/php/info.php
/opt/webapps/php/info.php
<?php
phpinfo();
# openssl genrsa -out ca.key 2048
# openssl req -new -key ca.key -out ca.csr
Country Name (2 letter code) [AU]:JP
State or Province Name (full name) [Some-State]:Aichi
Locality Name (eg, city) []:Toyota
Organization Name (eg, company) [Internet Widgits Pty Ltd]:
Organizational Unit Name (eg, section) []:
Common Name (e.g. server FQDN or YOUR name) []:webapps-php.example.com
Email Address []:

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
# echo "subjectAltName=DNS:*.example.com,IP:192.168.12.200" > san.txt
# openssl x509 -req -days 365 -in ca.csr -signkey ca.key -out ca.crt -extfile san.txt
Signature ok
subject=C = JP, ST = Aichi, L = Toyota, O = Default Company Ltd, CN = webapp.example.com
Getting Private key
# mkdir -p /etc/pki/tls/certs
# mkdir /etc/pki/tls/private
# mv ca.crt /etc/pki/tls/certs/webapps-php.crt
# mv ca.key /etc/pki/tls/private/webapps-php.key
# mv ca.csr /etc/pki/tls/private/webapps-php.csr
# vi /etc/nginx/conf.d/webapps-info.conf
/etc/nginx/conf.d/webapps-info.conf
server  # サーバーブロックの開始
{
  listen 443 ssl; # サーバーが待ち受けるポート番号
  ssl_certificate /etc/pki/tls/certs/webapps-php.crt; # TLS証明書
  ssl_certificate_key /etc/pki/tls/private/webapps-php.key; # TLS秘密鍵
  server_name webapps-php.example.com;  # サーバーの名前
  access_log /var/log/webapps/php/access.log;  # アクセスログのパス
  error_log /var/log/webapps/php/error.log;  # エラーログのパス

  root /opt/webapps/php;  # サーバーのルートディレクトリ

  location /  # ルートディレクトリに対する設定
  {
    index index.html index.htm index.php;  # デフォルトで使用するインデックスファイル
  }

  location ~ [^/]\.php(/|$)  # .phpで終わるリクエストに対する設定
  {
    fastcgi_split_path_info ^(.+?\.php)(/.*)$;  # パス情報を分割
    if (!-f $document_root$fastcgi_script_name)  # スクリプトファイルが存在しない場合
    {
      return 404;  # 404エラーを返す
    }

    client_max_body_size 100m;  # クライアントからの最大ボディサイズ

    # Mitigate https://httpoxy.org/ vulnerabilities
    fastcgi_param HTTP_PROXY "";  # HTTP_PROXYを空に設定してhttpoxy脆弱性を緩和

    # fastcgi_pass 127.0.0.1:9000;
    fastcgi_pass unix:/run/php/php8.3-fpm.sock;  # FastCGIサーバーへのパス
    fastcgi_index index.php;  # デフォルトのFastCGIスクリプト

    # include the fastcgi_param setting
    include fastcgi_params;  # FastCGIパラメータの設定を含む

    # SCRIPT_FILENAME parameter is used for PHP FPM determining
    #  the script name. If it is not set in fastcgi_params file,
    # i.e. /etc/nginx/fastcgi_params or in the parent contexts,
    # please comment off following line:
    # fastcgi_param  SCRIPT_FILENAME   $document_root$fastcgi_script_name;  # スクリプト名を決定するためのパラメータ
  }
}

# vi /etc/php/8.3/fpm/php.ini
date.timezone = Asia/Tokyo
# 新規設定

display_errors = On
display_startup_errors = On
# 確認(最初から設定されている。)
# vi /etc/hosts
192.168.12.200 webapps-php.example.com

今回、Web アプリケーションサーバーの IP アドレスは、192.168.12.200 とします。

# systemctl restart nginx
# systemctl restart php8.3-fpm

phpinfo()の画面


SimpleSAMLphp Web コンソール環境作成

# apt install -y php8.3-dom php8.3-xml
# tar xzf simplesamlphp-2.1.1-full.tar.gz
# mv simplesamlphp-2.1.1 /var/simplesamlphp

今回、SimpleSAMLphp Web コンソールの URL は、

https://ssp2.example.com/simplesaml/ とします。

# openssl genrsa -out ca.key 2048
# openssl req -new -key ca.key -out ca.csr
Country Name (2 letter code) [AU]:JP
State or Province Name (full name) [Some-State]:Aichi
Locality Name (eg, city) []:Toyota
Organization Name (eg, company) [Internet Widgits Pty Ltd]:
Organizational Unit Name (eg, section) []:
Common Name (e.g. server FQDN or YOUR name) []:ssp2.example.com
Email Address []:

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
# echo "subjectAltName=DNS:*.example.com,IP:192.168.12.200" > san.txt
# openssl x509 -req -days 365 -in ca.csr -signkey ca.key -out ca.crt -extfile san.txt
Signature ok
subject=C = JP, ST = Aichi, L = Toyota, O = Default Company Ltd, CN = webapp.example.com
Getting Private key
# mv ca.crt /etc/pki/tls/certs/ssp2.example.com.crt
# mv ca.key /etc/pki/tls/private/ssp2.example.com.key
# mv ca.csr /etc/pki/tls/private/ssp2.example.com.csr
# vi /etc/nginx/conf.d/simplesaml.conf
/etc/nginx/conf.d/simplesaml.conf
server {
    listen 443 ssl;
    server_name ssp2.example.com;

    ssl_certificate        /etc/pki/tls/certs/ssp2.example.com.crt;
    ssl_certificate_key    /etc/pki/tls/private/ssp2.example.com.key;
    ssl_protocols          TLSv1.3 TLSv1.2;
    ssl_ciphers            EECDH+AESGCM:EDH+AESGCM;

    location ^~ /simplesaml {
        index index.php;
        alias /var/simplesamlphp/public;

        location ~^(?<prefix>/simplesaml)(?<phpfile>.+?\.php)(?<pathinfo>/.*)?$ {
            include          fastcgi_params;
            # fastcgi_pass     $fastcgi_pass;
            fastcgi_pass     unix:/run/php/php8.3-fpm.sock;
            fastcgi_param SCRIPT_FILENAME $document_root$phpfile;

            # Must be prepended with the baseurlpath
            fastcgi_param SCRIPT_NAME /simplesaml$phpfile;

            fastcgi_param PATH_INFO $pathinfo if_not_empty;
        }
    }
}
# chown -R www-data: /var/simplesamlphp
# vi /etc/hosts
192.168.12.200	ssp2.example.com
# systemctl restart nginx
# systemctl restart php8.3-fpm
# cd /var/simplesamlphp
# cp config/config.php.dist config/config.php
# cp config/authsources.php.dist config/authsources.php
# cp metadata/saml20-idp-hosted.php.dist metadata/saml20-idp-hosted.php
# cp metadata/saml20-idp-remote.php.dist metadata/saml20-idp-remote.php
# cp metadata/saml20-sp-remote.php.dist metadata/saml20-sp-remote.php

SimpleSAMLphpのコンソール画面


SimpleSAMLphp Web コンソール初期設定

# openssl rand -base64 32
RCN2jfGolAsfOb1J4UXQrbrwevYIyz/O/o9sJWRzxTc=
# vi /var/simplesamlphp/config/config.php
/var/simplesamlphp/config/config.php
//'secretsalt' => 'defaultsecretsalt',
// ↓ 変更
'secretsalt' => 'RCN2jfGolAsfOb1J4UXQrbrwevYIyz/O/o9sJWRzxTc=',

//'auth.adminpassword' => '123',
// ↓ 変更
'auth.adminpassword' => 'admin',

//'timezone' => null,
// ↓ 変更
'timezone' => 'Asia/Tokyo',

// 'technicalcontact_name' => 'Administrator',
// 'technicalcontact_email' => 'na@example.org',
// ↓ 変更
'technicalcontact_name' => 'Administrator',
'technicalcontact_email' => 'admin@ssp2.example.com',

管理者ログイン


管理者ログイン成功後


simplesamlphp-module-authoauth2 インストール

PHP のパッケージ管理システム composer で SimpleSAMLphp 用 OpenID Connect Relying Party(RP) 対応拡張モジュール simplesamlphp-module-authoauth2 をインストールします。

ソースコードは、

https://github.com/simplesamlphp/simplesamlphp-module-oidc

にあります。

README に 「SSP」, 「SSP2」 とありますが、それぞれ、SimpleSAMLphp v1.x.x, SimpleSAMLphp v2.x.x のことです。(最初何のことだか分かりませんでした。)

OP(OpenID Provider)を構築するときに使用するのは、以下です。

https://github.com/simplesamlphp/simplesamlphp-module-oidc

今回は、Relying Party(RP) を構築するため、使いません。説明もしません。

# cd /var/simplesamlphp
# apt update -y
# apt install composer -y

次に行う composer で依存関係エラーになるため、先に足りないモジュールインストールします。

# apt install php8.3-sqlite3 -y
# apt install php8.3-ldap -y
# apt install php8.3-intl -y

依存関係エラーの内容は以下です。

Problem 1

- Root composer.json requires PHP extension ext-pdo_sqlite _ but it is missing from your system. Install or enable PHP's pdo_sqlite extension.

Problem 2

- simplesamlphp/simplesamlphp-module-ldap is locked to version v2.2.1 and an update of this package was not requested.

- simplesamlphp/simplesamlphp-module-ldap v2.2.1 requires ext-ldap _ -> it is missing from your system. Install or enable PHP's ldap extension.

PHP Fatal error: Uncaught Error: Class "Normalizer" not found in /usr/share/php/Symfony/Component/String/AbstractUnicodeString.php:31


composer でインストールします。

# composer require cirrusidentity/simplesamlphp-module-authoauth2
...
  - Installing symfony/translation (v6.0.19): Extracting archive
Generating autoload files
66 packages you are using are looking for funding.
Use the `composer fund` command to find out more!
> php bin/translations translations:update:binary

simplesamlphp-module-authoauth2 インストール成功です!


Azure AD - アプリの登録

OP(Azure AD)側の設定を行います。
Azure ポータルから、Microsoft Entra ID に移動して、アプリの登録 をクリックします。 Microsoft Entra ID


アプリの登録


+新規作成 をクリックします。

アプリの登録 +新規作成


アプリ情報を入力し、登録 をクリックします。
名前SimpleSAMLphpOIDC(任意です。)
サポートされているアカウントの種類この組織ディレクトリのみに含まれるアカウント (<テナント名> のみ - シングル テナント)
リダイレクト URI (省略可能)Web https://ssp2.example.com/simplesaml/module.php/authoauth2/linkback.php

リダイレクト URI については、simplesamlphp-module-authoauth2 の README

https://hostname/SSP_PATH/module.php/authoauth2/linkback.php

と指示があります。

アプリ情報を入力


概要 をクリックして、
アプリケーション (クライアント) ID から clientId(後で行う SimpleSAMLphp 側設定項目)を確認しておきます。

概要 アプリケーション (クライアント) ID


証明書とシークレット をクリックし、+新しいクライアント シークレット をクリックします。 証明書とシークレット +新しいクライアント シークレット


説明有効期限 を任意の値に設定し、追加 をクリックします。 説明 有効期限


ここで出てくる の文字列が clientSecret(後で行う SimpleSAMLphp 側設定項目)の文字列になります。(シークレット ID の方ではありません。)
二度と表示されないため、ここで、メモっておきます。

値=clientSecret(後で行う SimpleSAMLphp 側設定項目)


概要 に移動して、エンドポイント をクリックし、
OpenID Connect メタデータ ドキュメント から discoveryUrl(後で行う SimpleSAMLphp 側設定項目) を確認します。

概要 エンドポイント


discoveryUrl(後で行う SimpleSAMLphp 側設定項目) を確認


SimpleSAMLphp 設定

authsources.php に Relying Party(RP) の設定を追加します。

# cd /var/simplesamlphp
# vi config/authsources.php
/var/simplesamlphp/config/authsources.php
    'microsoftOIDCSource' => [
        'authoauth2:OpenIDConnect',
        'issuer' => 'https://login.microsoftonline.com/0******2-f**7-4**c-9**4-1**********b/v2.0',
        // When using the 'common' discovery endpoint it allows any Azure user to authenticate, however
        // the token issuer is tenant specific and will not match what is in the common discovery document.
        'validateIssuer' => false,  // issuer is just used to confirm correct discovery endpoint loaded
        'discoveryUrl' => 'https://login.microsoftonline.com/0******2-f**7-4**c-9**4-1**********b/v2.0/.well-known/openid-configuration',
        'clientId' => '3******6-0**9-4**b-85bd-f**********8',
        'clientSecret' => 'sv************************************Z_',
    ],

設定キーの 'microsoftOIDCSource' は任意です。

'discoveryUrl''clientId''clientSecret' は Azure の アプリの登録 で確認した値です。

ソースコードの中に入っていた docker/config/authsources.php の設定を真似しています。

ソースコードの中に入っていた docker/config/authsources.php の設定


なお、issuer の値は、以下の出力で確認できます。

# apt install curl -y
# apt install jq -y
# curl https://login.microsoftonline.com/0******2-f**7-4**c-9**4-1**********b/v2.0/.well-known/openid-configuration | jq
{
  "token_endpoint": "https://login.microsoftonline.com/0******2-f**7-4**c-9**4-1**********b/oauth2/v2.0/token",
  "token_endpoint_auth_methods_supported": [
    "client_secret_post",
    "private_key_jwt",
    "client_secret_basic"
  ],
  "jwks_uri": "https://login.microsoftonline.com/0******2-f**7-4**c-9**4-1**********b/discovery/v2.0/keys",
  "response_modes_supported": [
    "query",
    "fragment",
    "form_post"
  ],
  "subject_types_supported": [
    "pairwise"
  ],
  "id_token_signing_alg_values_supported": [
    "RS256"
  ],
  "response_types_supported": [
    "code",
    "id_token",
    "code id_token",
    "id_token token"
  ],
  "scopes_supported": [
    "openid",
    "profile",
    "email",
    "offline_access"
  ],
  "issuer": "https://login.microsoftonline.com/0******2-f**7-4**c-9**4-1**********b/v2.0",
  "request_uri_parameter_supported": false,
...

authoauth2 モジュールを有効化します。


authoauth2 モジュールとは、今回、composer でインストールした cirrusidentity/simplesamlphp-module-authoauth2 のモジュール名です。
これを認識させる設定を追加します。

有効にしないと Test のときに以下のエラーになります。

SimpleSAML\Error\Error: UNHANDLEDEXCEPTION

Backtrace:

2 src/SimpleSAML/Error/ExceptionHandler.php:32 (SimpleSAML\Error\ExceptionHandler::customExceptionHandler)

1 vendor/symfony/error-handler/ErrorHandler.php:541 (Symfony\Component\ErrorHandler\ErrorHandler::handleException)

0 [builtin] (N/A)

Caused by: Exception: The module 'authoauth2' is not enabled.

Backtrace:

8 src/SimpleSAML/Module.php:449 (SimpleSAML\Module::resolveClass)

7 src/SimpleSAML/Auth/Source.php:313 (SimpleSAML\Auth\Source::parseAuthSource)

6 src/SimpleSAML/Auth/Source.php:356 (SimpleSAML\Auth\Source::getById)

5 src/SimpleSAML/Auth/Simple.php:62 (SimpleSAML\Auth\Simple::getAuthSource)

4 src/SimpleSAML/Auth/Simple.php:151 (SimpleSAML\Auth\Simple::login)

3 [builtin] (call_user_func_array)

2 src/SimpleSAML/HTTP/RunnableResponse.php:68 (SimpleSAML\HTTP\RunnableResponse::sendContent)

1 vendor/symfony/http-foundation/Response.php:373 (Symfony\Component\HttpFoundation\Response::send)

0 public/module.php:24 (N/A)

# vi config/config.php
/var/simplesamlphp/config/config.php
    'module.enable' => [
        'exampleauth' => false,
        'core' => true,
        'admin' => true,
        'saml' => true,//末尾に , 追加必要なのに注意
        'authoauth2' => true//追加
    ],

ついでに、ログ出力がデフォルトで syslog になっているため、ファイルに出力するようにします。(実施は任意です。)
また、ログレベルを DEBUG に引き上げておきます。(実施は任意です。)

/var/simplesamlphp/config/config.php
    //'loggingdir' => '/var/log/',
    'loggingdir' => '/var/log/simplesaml',
...
    //'logging.level' => SimpleSAML\Logger::NOTICE,
    'logging.level' => SimpleSAML\Logger::DEBUG,
    //'logging.handler' => 'syslog',
    'logging.handler' => 'file',
# mkdir /var/log/simplesaml
# chown www-data: /var/log/simplesaml

Test

Test1

https://ssp2.example.com/simplesaml/admin にて、
Test タブをクリックして、
microsoftOIDCSource をクリックします。

simplesaml/admin画面 Testタブクリック


microsoftOIDCSource をクリック


Error: UNHANDLEDEXCEPTION


以下のエラーになりました。


SimpleSAML\Error\Error: UNHANDLEDEXCEPTION
Backtrace:
2 src/SimpleSAML/Error/ExceptionHandler.php:32 (SimpleSAML\Error\ExceptionHandler::customExceptionHandler)
1 vendor/symfony/error-handler/ErrorHandler.php:541 (Symfony\Component\ErrorHandler\ErrorHandler::handleException)
0 [builtin] (N/A)
Caused by: GuzzleHttp\Exception\ConnectException: cURL error 28: Resolving timed out after 3000 milliseconds (see https://curl.haxx.se/libcurl/c/libcurl-errors.html) for https://login.microsoftonline.com/0******2-f**7-4**c-9**4-1**********b/v2.0/.well-known/openid-configuration
Backtrace:
26 vendor/guzzlehttp/guzzle/src/Handler/CurlFactory.php:210 (GuzzleHttp\Handler\CurlFactory::createRejection)
(略)
4 src/SimpleSAML/Auth/Simple.php:165 (SimpleSAML\Auth\Simple::login)
3 [builtin] (call_user_func_array)
2 src/SimpleSAML/HTTP/RunnableResponse.php:68 (SimpleSAML\HTTP\RunnableResponse::sendContent)
1 vendor/symfony/http-foundation/Response.php:373 (Symfony\Component\HttpFoundation\Response::send)
0 public/module.php:24 (N/A)


今回の場合、
SimpleSAMLphp からプロキシサーバーを使って、インターネット(https://login.microsoftonline.com/...)に出る必要があるため、エラーになりました。
SimpleSAMLphp にプロキシサーバーの設定が必要です。


NG:
プロキシサーバーを使う場合のNGパターン 図


OK:
プロキシサーバーを使う場合のOKパターン 図


プロキシサーバー設定

SimpleSAMLphp からプロキシサーバーを使わずに直接インターネットアクセスできる場合は、この設定は必要ありません。

SimpleSAMLphp → プロキシサーバー → インターネット(https://login.microsoftonline.com/...)の通信が可能になるようにプロキシサーバーの設定をします。
今回プロキシサーバーは、http://192.168.0.158:3128 とします。

/etc/environment などサーバー全体の環境変数で指定しても効きません。

# cd /var/simplesamlphp
# vi config/authsources.php
/var/simplesamlphp/config/authsources.php
    'microsoftOIDCSource' => [
        'authoauth2:OpenIDConnect',
        'issuer' => 'https://login.microsoftonline.com/0******2-f**7-4**c-9**4-1**********b/v2.0',
        // When using the 'common' discovery endpoint it allows any Azure user to authenticate, however
        // the token issuer is tenant specific and will not match what is in the common discovery document.
        'validateIssuer' => false,  // issuer is just used to confirm correct discovery endpoint loaded
        'discoveryUrl' => 'https://login.microsoftonline.com/0******2-f**7-4**c-9**4-1**********b/v2.0/.well-known/openid-configuration',
        'clientId' => '3******6-0**9-4**b-85bd-f**********8',
        'clientSecret' => 'sv************************************Z_',
        'proxy' => 'http://192.168.0.158:3128',//←追加
    ],

なお、上記設定以外の方法では、php-fpm の環境変数としてセットすると、プロキシサーバーが有効になります。

この対応の場合、authsources.php の 'proxy' 設定は不要です。ソースコードを見ると、$_SERVER["HTTP_PROXY"] の存在をチェックしていました。

# vi /etc/nginx/fastcgi_params
fastcgi_param	HTTP_PROXY	http://192.168.0.158:3128;
fastcgi_param	HTTPS_PROXY	http://192.168.0.158:3128;
fastcgi_param	NO_PROXY	.example.com;
# systemctl restart nginx

Test2

再び
Test タブをクリックして、
microsoftOIDCSource をクリックします。


プロキシサーバー問題はなくなりましたが、まだエラーになりました。(今度のエラーは、成功したり、失敗したりです。)


SimpleSAML\Error\Error: UNHANDLEDEXCEPTION
Backtrace:
2 src/SimpleSAML/Error/ExceptionHandler.php:32 (SimpleSAML\Error\ExceptionHandler::customExceptionHandler)
1 vendor/symfony/error-handler/ErrorHandler.php:541 (Symfony\Component\ErrorHandler\ErrorHandler::handleException)
0 [builtin] (N/A)
Caused by: GuzzleHttp\Exception\ConnectException: cURL error 28: Operation timed out after 3001 milliseconds with 0 bytes received (see https://curl.haxx.se/libcurl/c/libcurl-errors.html) for https://login.microsoftonline.com/0******2-f**7-4**c-9**4-1**********b/v2.0/.well-known/openid-configuration
Backtrace:
26 vendor/guzzlehttp/guzzle/src/Handler/CurlFactory.php:210 (GuzzleHttp\Handler\CurlFactory::createRejection)
(略)
4 src/SimpleSAML/Auth/Simple.php:165 (SimpleSAML\Auth\Simple::login)
3 [builtin] (call_user_func_array)
2 src/SimpleSAML/HTTP/RunnableResponse.php:68 (SimpleSAML\HTTP\RunnableResponse::sendContent)
1 vendor/symfony/http-foundation/Response.php:373 (Symfony\Component\HttpFoundation\Response::send)
0 public/module.php:24 (N/A)


デフォルトの 3 秒を超えて応答が無い場合、エラーになるようでした。 タイムアウトの秒数を 10 秒に変更します。

# cd /var/simplesamlphp
# vi config/authsources.php
/var/simplesamlphp/config/authsources.php
    'microsoftOIDCSource' => [
        'authoauth2:OpenIDConnect',
        'issuer' => 'https://login.microsoftonline.com/0******2-f**7-4**c-9**4-1**********b/v2.0',
        // When using the 'common' discovery endpoint it allows any Azure user to authenticate, however
        // the token issuer is tenant specific and will not match what is in the common discovery document.
        'validateIssuer' => false,  // issuer is just used to confirm correct discovery endpoint loaded
        'discoveryUrl' => 'https://login.microsoftonline.com/0******2-f**7-4**c-9**4-1**********b/v2.0/.well-known/openid-configuration',
        'clientId' => '3******6-0**9-4**b-85bd-f**********8',
        'clientSecret' => 'sv************************************Z_',
        'proxy' => 'http://192.168.0.158:3128',
        'timeout' => 10,//←追加
    ],

Test3

Test タブをクリックして、
microsoftOIDCSource をクリックします。

Azure ADサインイン画面


Azure AD(Entra ID)のConsent画面(同意/承諾画面)


SimpleSAMLphpのTestログイン後画面


成功しました!ヨシ!


Web アプリ(info.php)SSO 対応

Azure AD - アプリの登録 - SimpleSAMLphpOIDC - 認証

リダイレクト URI
https://webapps-php.example.com/simplesaml/module.php/authoauth2/linkback.php
を追加します。

Azure AD - アプリの登録 - SimpleSAMLphpOIDC - 認証 - リダイレクト URI


Web アプリを SSO 対応に改修します。

# vi /opt/webapps/php/info.php
/opt/webapps/php/info.php
<?php
require_once('/var/simplesamlphp/lib/_autoload.php');
use SimpleSAML\Auth\Simple;
$as = new Simple('microsoftOIDCSource');
$as->requireAuth();
phpinfo();
# vi /etc/nginx/conf.d/webapps-info.conf
/etc/nginx/conf.d/webapps-info.conf
# location / の上に追記
  location ^~ /simplesaml {
    index index.php;
    alias /var/simplesamlphp/public;

    location ~^(?<prefix>/simplesaml)(?<phpfile>.+?\.php)(?<pathinfo>/.*)?$ {
      include      fastcgi_params;
      # fastcgi_pass   $fastcgi_pass;
      fastcgi_pass   unix:/run/php/php8.3-fpm.sock;
      fastcgi_param SCRIPT_FILENAME $document_root$phpfile;

      # Must be prepended with the baseurlpath
      fastcgi_param SCRIPT_NAME /simplesaml$phpfile;

      fastcgi_param PATH_INFO $pathinfo if_not_empty;
    }
  }
  location /
# systemctl restart nginx

https://webapps-php.example.com/info.php にアクセスします。

Azure ADサインイン画面

Test でログインしたままブラウザを再起動していない場合、再認証はかかりません。


phpinfo()の画面


ヨシっ!


loading...