Index
前提
-
すでにLAMP環境もしくはXAMPP環境を構築済みであること。ここではXAMPPを使ってますが、当然LAMP環境でも動きます。
-
XAMPPのApacheのDocumentRootは"C:/xampp/htdocs"としています。大抵のLinux環境(CentOS系)だと "/var/www/html/" に相当するパスです。(Debian系だとまた違うパスだったりしますが。)
-
実用に耐えるSSO環境を構築するのを目的とはしておらず、その前段階で、ローカルで気楽に色々触れる環境の構築を目的としています。 なのでセキュリティ的にはザルです。
-
ここではウェブサーバのドメインを「localhost」として動かしてます。
SimpleSAMLphpのダウンロードと解凍
-
まずは、ここからSimpleSamlPHPをダウンロードしてきます。下の画像では最新バージョンをダウンロードしてきます。別バーションを使用する場合はこの手順書のバージョンに関する記載を各自置き換えて読んでください。
-
ダウンロードしたファイルの拡張子は".tar.gz"ですから、windowsだと対応している解凍アプリ(7-zipとかPeaZipとか)を使ってファイルを解凍します。Linuxなら「$ tar -zxvf simplesamlphp-1.19.0-rc1.tar.gz」コマンドで解凍すればいいです。
-
Apacheの制御下にあるディレレクトリに解凍したフォルダを配置します。
C:\xampp\htdocs (←Apacheの制御下のフォルダ、環境の設定によって変わる)
└ simplesamlphp-1.19.0-rc1
- simplesamlphp-1.19.0-rc1フォルダを複製して、1つはIdP用(ファイル名を「ssoIdp」)に、もう1つはSP用に(ファイル名を「ssoSp」)に名前を変更します。
C:\xampp\htdocs
├ ssoIdp
└ ssoSp
Apacheの設定
- Apacheの設定ファイルに、「ssoIdp\www\」と「ssoSp\www\」配下以外にはアクセスできないようにする設定と、エイリアスの設定を追加します。
<Directory "C:/xampp/htdocs">の下あたりにでも以下のように設定を追加します。
(Windows環境だとリクエストURLの大文字と小文字の区別がされるため、リクエストURLによってはC:\xampp\htdocs\ssoIdp\またはC:\xampp\htdocs\ssoSp\ 直下のディレクトリを閲覧できちゃいます。なのでそれを防ぐためにごちゃごちゃとした設定をしています。Linux環境だともうちょっとシンプルに出来るはず。)
DocumentRoot "C:/xampp/htdocs"
<Directory "C:/xampp/htdocs">
~省略~
</Directory>
<Directory "C:\xampp\htdocs\ssoIdp\www">
Allow from localhost
</Directory>
<Directory "C:\xampp\htdocs\ssoIdp">
Deny from all
</Directory>
<Directory "C:\xampp\htdocs\ssoSp\www">
Allow from localhost
</Directory>
<Directory "C:\xampp\htdocs\ssoSp">
Deny from all
</Directory>
Alias /ssoIdp/ "C:/xampp/htdocs/ssoIdp/www/"
Alias /ssoSp/ "C:/xampp/htdocs/ssoSp/www/"
- 設定を反映させるため、Apacheを(再)起動します。
XAMPPのコンソールからApacheを「Start」します。既に起動済の場合は一度「Stop」してから再度「Start」をクリックします。
IdP構築手順
- 設定ファイル「C:\xampp\htdocs\ssoIdp\config\config.php」を編集します。
URLのパスを変更します。
'baseurlpath' => 'simplesaml/',
↓↓↓
'baseurlpath' => 'ssoIdp/',
アドミニストレータのパスワードも変更します。(初期設定の値から変更しておかないとログインできないので。)
'auth.adminpassword' => '123',
↓↓↓
'auth.adminpassword' => '123456',
本記事の設定だと、同一サーバ内にIdPとSPが存在するわけですが、以下の設定によりIdPとSPで別々のクッキーを使用するようにします。
'session.cookie.path' => '/',
↓↓↓
'session.cookie.path' => '/ssoIdp/',
IdPのsaml2.0の機能を有効化します。
'enable.saml20-idp' => false,
↓↓↓
'enable.saml20-idp' => true,
- 必須ではないですが、IdPの背景色を変更しておきます。
IdPとSPで区別がつきにくいので、IdPの背景色を変更しちゃいます。
cssファイル「 ssoIdp\www\resources\default.css 」を編集します。変更後の色は何でもいいですが、ここでは赤紫色にしています。
body {
/**省略**/
background: #1c1c1c;
/**省略**/
}
↓↓↓
body {
/**省略**/
background: #660033;
/**省略**/
}
- ssoIdpへの接続確認をします。
ウェブブラウザで「 https://localhost/ssoIdp/ 」に接続します。
アドミニストレータでログインしてみましょう。[管理者でログイン]をクリックし、そこで先ほど設定した「ユーザ名:admin, パスワード:123456」を入力して[ログイン]ボタンをクリックしてください。ログインできれば成功です。
- IdPのPHPの設定を確認しておきます。
[設定]タブで画面を切り替えて、画面右上の「SAML2.0IdP」のチェックが緑色でONになっていること、画面下部の「PHPの設定を確認」で"必須"の項目についてはチェックが緑色でONになっていることを確認します(なっていなかったらPHPのバージョンを上げたりモジュールを追加したりして対応します)。
- 鍵ペアを ssoIdp\cert 配下に配置します。
秘密鍵とオレオレ証明書を生成する必要があるのですが、今回は鍵の中身を用意しておくので適当に使ってください。無論、秘密鍵を公開しちゃってるので、実用には耐えませんが、個人の環境で遊ぶだけなら問題ないです。メモ帳などのテキストエディタで書き込んで、ファイル名を変更すれば鍵・証明書として使えます。
-----BEGIN PRIVATE KEY-----
MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDEeMeS3Tt6A90f
paGnqGKR6i3+scsAuxsQI3K9nVJRcFT30KEMgRkgNvYVQ0wVBDuNZrC2GRvwfIwS
jrxLigFbznih4Dide8oMvjmBgOQaug12BuUltyBCNSiz6QcBBw4Y+oQQJTR5TQgk
LmiNweL/mzVHSzfTWmlTM8Po94VH+os+bXFop/Tl2efX+QafpVwfd8o3NCdQYLfK
64nUyqYMweXVE9rYCkv5mQidiK5z+A9gO4krC4ZilapgIqtX2Gk9ePZW49VsGXJq
VtNbrL7l9vcFSQnhhM3yHQiDhtiNW3xyf/YpW7nUERBJ+YvfAxOu54Wug05uFhVZ
hg/QQ5aJAgMBAAECggEBAMONK6ckB+TkH502MHY9hQ6StYEB2Xo6wS8I+VV9Vse0
NP4La6CUhjuoOLrlJr7sXZHaGhzFVSfB73ExHH1bOQr1sN/92pv08CBK3dXmQiPP
90H4ju9BHByJ6J9ZWx1Mtl1qSzP+tAHgCDBq+KnPx25+P0NcvI3jOV4U8fPZGZGP
LuixuzWArfbWU+xEpDBX4aFW/PZHh05rWQxT3PQ0xYzCyo67DBa7UhqY3vFDlH/i
sSAU9mMm6M6lk7h6IAozYU51Y4IHI4pyWEFAgRBYLqFjEG/n8Yo/Zg+9kwAueDke
1I2ZbByUeY7zbhtNeWjYPAqXVX8HsXdKRy9eNm1jTwECgYEA+xifVS5ZYzctGBHI
ivoYR/DXrJPo4SVrCx8zcP9rIC1j0DV5doNBvNvObFe9UCMDmwybMZGlgv1kn7kE
RHJLoDISVJ6NGBNfEi/u2/coFSnc15AuAqyHzss4GoPZ9cmilGSGQbMIMEDKkzog
5h5fXIMPm1fWtEVl684pSbHuoLECgYEAyE8Ox5/yK8VXnS0c8dXWuj3lwJLJDOyW
d2ZeSjRRSRkw3D9/6dydgtMudBOc3Pbfll+MgWtFlKtIcECB51C5ePPTwjG9NEFG
dPeZWhuqVcoxRU1fJzEHUzA0bEbcgUebfzo+pSgHXGHUZaEasfzyKAvwZ4Xx6oPB
RYUn9TD/iVkCgYEAxRXeeg2XO7jjPDE5J1yGEnGH132BHLcx/djPl7Hjc64s2hAe
9lawEny02XVEstHI0rpiVdXsA5TAll2ya8cKdQLYQHLybCNITA4zfZPRcksZfFk+
w/qH3ljEAIvdWH6bjb4ZYxgTJUy1tDm7+ON+Fi8I4PVhIL4X8a4v2hg/JQECgYAU
XKT9+e5eMLNVUO6uTrSDPiOKzeEOJUauYIOZO3Q/4AWtfe780OZaFCmWtx+s/pN/
77qStVrfYAH/Fy+dWgFgoDiYdwHqu+/zl+/IzyMjkWgsyU6w5zT9adsKXrGvmp3d
8wfHNih5ZaB3rEbQbQwYsg4AGAeddUNCU+TZ8d8oEQKBgAxu4erzBwCdLC7ysAEt
G94NCT2umw3CeisZ9HJBeI0UvZN+vWjXDHNDm7A3DmBpqnaMx1WRSy6nsKB1Qojo
ouvwjS0YtRWU0ymKvsr6mo6sM/gtXvF4BSr00nytGvJB81q4TPTv2vawNY426o8H
SZX8awOsYIMwfygAeNAIXIjg
-----END PRIVATE KEY-----
-----BEGIN CERTIFICATE-----
MIIDazCCAlOgAwIBAgIUJLtpBYNjIcJk1/Y/LkAvDycDTpQwDQYJKoZIhvcNAQEL
BQAwRTELMAkGA1UEBhMCQVUxEzARBgNVBAgMClNvbWUtU3RhdGUxITAfBgNVBAoM
GEludGVybmV0IFdpZGdpdHMgUHR5IEx0ZDAeFw0yMDA5MjAwNjQzMzFaFw00ODAy
MDUwNjQzMzFaMEUxCzAJBgNVBAYTAkFVMRMwEQYDVQQIDApTb21lLVN0YXRlMSEw
HwYDVQQKDBhJbnRlcm5ldCBXaWRnaXRzIFB0eSBMdGQwggEiMA0GCSqGSIb3DQEB
AQUAA4IBDwAwggEKAoIBAQDEeMeS3Tt6A90fpaGnqGKR6i3+scsAuxsQI3K9nVJR
cFT30KEMgRkgNvYVQ0wVBDuNZrC2GRvwfIwSjrxLigFbznih4Dide8oMvjmBgOQa
ug12BuUltyBCNSiz6QcBBw4Y+oQQJTR5TQgkLmiNweL/mzVHSzfTWmlTM8Po94VH
+os+bXFop/Tl2efX+QafpVwfd8o3NCdQYLfK64nUyqYMweXVE9rYCkv5mQidiK5z
+A9gO4krC4ZilapgIqtX2Gk9ePZW49VsGXJqVtNbrL7l9vcFSQnhhM3yHQiDhtiN
W3xyf/YpW7nUERBJ+YvfAxOu54Wug05uFhVZhg/QQ5aJAgMBAAGjUzBRMB0GA1Ud
DgQWBBTOrmHFE+bNGgceqmZbNQIMTnjX2DAfBgNVHSMEGDAWgBTOrmHFE+bNGgce
qmZbNQIMTnjX2DAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEBCwUAA4IBAQA9
QxFdmpm1lOm89ZzD4JIxFOIKMW88rmXs4JtcH0l/ZnYFEb9KsHdqp3LqMhr6Cz3N
4VcYGVcy8ifkU/y5jWTd4AP8ueRajAoMBolcSJ6rq2L3KE8TGO4QjRUMYVYrNghs
SAJROd3LW2BjWX8Gy059lqiJphg0ubBLpdmGoQPt6b1RVdpKpuXXsFhqSeSeCvEP
XnhtCNRA5j45X22+D/a/eP0HwcYhXq9L/HoCuASt6qqaAE4bqaF48OT2JXvppfe3
hMAhFTIqu5T126/EYbOI20a3BqvSZrAkhYzD9ujZgqGrGHuZuRlunnLAWMZdD7YB
5naNNb/AUw6sIBNL5cOi
-----END CERTIFICATE-----
このようなファイル構成になります。
C:\xampp\htdocs (←Apacheの制御下のフォルダ、環境の設定によって変わる)
└ ssoIdp
└ cert
├ server.pem
└ server.crt
【補足】
ssoIdp\metadata\saml20-idp-hosted.php にて以下のように秘密鍵と証明書の設定をしているのですが、秘密鍵と証明書のファイル名を同じにしているので、こちらの設定を変更する必要はないです。
// X.509 key and certificate. Relative to the cert directory.
'privatekey' => 'server.pem',
'certificate' => 'server.crt',
- exampleauthを有効化します。
「 ssoIdp\config\config.php 」のmocule.enableの'exampleauth'の値をtrueにします。これでexampleauthの認証モジュールが使用できるようになります。(他にも使用可能な認証モジュールがあるのですが、ここではexampleauthを使用します。)
'module.enable' => [
'exampleauth' => true,
'core' => true,
'saml' => true
],
- example-userを有効化します
「 ssoIdp\config\authsources.php 」の以下の部分のコメントアウトを外します。これにより「ユーザ名:student、パスワード:studentpass」と「ユーザ名:employee、パスワード:employeepass」をユーザアカウントとして使用できるようになります。
'example-userpass' => [
'exampleauth:UserPass',
// Give the user an option to save their username for future login attempts
// And when enabled, what should the default be, to save the username or not
//'remember.username.enabled' => false,
//'remember.username.checked' => false,
'student:studentpass' => [
'uid' => ['test'],
'eduPersonAffiliation' => ['member', 'student'],
],
'employee:employeepass' => [
'uid' => ['employee'],
'eduPersonAffiliation' => ['member', 'employee'],
],
],
SP構築手順
- SPの方の設定ファイルを以下のように変更します。
設定ファイル「C:\xampp\htdocs\ssoSp\config\config.php」を編集します。
URLのパスを変更します。
'baseurlpath' => 'simplesaml/',
↓↓↓
'baseurlpath' => 'ssoSp/',
アドミニストレータのパスワードも変更します。(初期設定の値から変更しておかないとログインできないので。)
'auth.adminpassword' => '123',
↓↓↓
'auth.adminpassword' => '123456',
本記事の設定だと、同一サーバ内にIdPとSPが存在するわけですが、以下の設定によりIdPとSPで別々のクッキーを使用するようにします。
'session.cookie.path' => '/',
↓↓↓
'session.cookie.path' => '/ssoSp/',
- 必須ではないですが、SPの背景色を変更しておきます。
IdPとSPで区別がつきにくいのでSPの背景色を変更しちゃいます。
cssファイル「ssoSp\www\resources\default.css」を編集します。変更後の色は何でもいいですが、ここでは深い青にしています。
body {
/**省略**/
background: #1c1c1c;
/**省略**/
}
↓↓↓
body {
/**省略**/
background: #007c99;
/**省略**/
}
- SPへの接続確認をします。
ウェブブラウザで「 https://localhost/ssoSp/ 」に接続します。
背景色を変更した場合、IdPだと背景が赤紫色でしたけど、SPだと深い青になってますね。
- 鍵ペアの設定をします。
IdPの時と同様に、秘密鍵とオレオレ証明書を生成して配置します。今回はローカル環境での個人的な利用なのでIdPと同じ鍵ペアを使用します(無論、個別に生成した鍵ペアを使用してもらっても構いません)。秘密鍵(server.pem)と証明書(server.crt)を「 ssoSp\cert\ 」配下に配置します。
このようなファイル構成になります。
C:\xampp\htdocs (←Apacheの制御下のフォルダ、環境の設定によって変わる)
└ ssoSp
└ cert
├ server.pem
└ server.crt
その上で「 ssoSp\config\authsources.php 」の設定を以下のように変更します。
// An authentication source which can authenticate against both SAML 2.0
// and Shibboleth 1.3 IdPs.
'default-sp' => [
'saml:SP',
// The entity ID of this SP.
// Can be NULL/unset, in which case an entity ID is generated based on the metadata URL.
'entityID' => null,
~省略~
],
↓↓↓
// An authentication source which can authenticate against both SAML 2.0
// and Shibboleth 1.3 IdPs.
'default-sp' => [
'saml:SP',
'privatekey' => 'server.pem',
'certificate' => 'server.crt',
// The entity ID of this SP.
// Can be NULL/unset, in which case an entity ID is generated based on the metadata URL.
'entityID' => 'https://localhost/ssoSp/',
~省略~
],
SSO連携手順
IdPとSPの双方が互いについての情報を把握しておく必要があるため、互いにメタデータを交換します。例えるならIdPとSPで名刺交換をするようなものです。これによりIdPとSPとの間に信頼関係が形成されるのでSSO連携をすることができるのです。
image by: irasutoya.com
【補足】
SAMLのサーバによってはメタデータの交換をするのではなく、IdPの証明書をSPに登録するだけのものも多々あります。他にはメタデータをダウンロードできるURLを設定する仕組みのものもあります。
- IdP→SPへのメタデータ登録
IdPサーバの設定ページ( https://localhost/ssoIdp/ )の[連携]タブを開き、"SAML 2.0 IdPメタデータ"項の[メタデータを表示]をクリックします。
"メタデータ"項の下の方の「SimpleSAMLphpのファイルフォーマット」をコピーします、XML表記ではなくPHP表記の方です。右上のアイコンをクリックするとクリップボードにコピーできます。
以下のように、SPサーバのmetadeta設定ファイル( ssoSp\metadata\saml20-idp-remote.php )の末尾にコピーした設定を追記します。
<?php
/**
* SAML 2.0 remote IdP metadata for SimpleSAMLphp.
* Remember to remove the IdPs you don't use from this file.
* See: https://simplesamlphp.org/docs/stable/simplesamlphp-reference-idp-remote
*/
$metadata['https://localhost/ssoIdp/saml2/idp/metadata.php'] = [
'metadata-set' => 'saml20-idp-remote',
'entityid' => 'https://localhost/ssoIdp/saml2/idp/metadata.php',
'SingleSignOnService' => [
[
'Binding' => 'urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect',
'Location' => 'https://localhost/ssoIdp/saml2/idp/SSOService.php',
],
],
'SingleLogoutService' => [
[
'Binding' => 'urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect',
'Location' => 'https://localhost/ssoIdp/saml2/idp/SingleLogoutService.php',
],
],
'certData' => 'MIIDazCCAlOgAwIBAgIUJLtpBYNjIcJk1/Y/LkAvDycDTpQwDQYJKoZIhvcNAQELBQAwRTELMAkGA1UEBhMCQVUxEzARBgNVBAgMClNvbWUtU3RhdGUxITAfBgNVBAoMGEludGVybmV0IFdpZGdpdHMgUHR5IEx0ZDAeFw0yMDA5MjAwNjQzMzFaFw00ODAyMDUwNjQzMzFaMEUxCzAJBgNVBAYTAkFVMRMwEQYDVQQIDApTb21lLVN0YXRlMSEwHwYDVQQKDBhJbnRlcm5ldCBXaWRnaXRzIFB0eSBMdGQwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDEeMeS3Tt6A90fpaGnqGKR6i3+scsAuxsQI3K9nVJRcFT30KEMgRkgNvYVQ0wVBDuNZrC2GRvwfIwSjrxLigFbznih4Dide8oMvjmBgOQaug12BuUltyBCNSiz6QcBBw4Y+oQQJTR5TQgkLmiNweL/mzVHSzfTWmlTM8Po94VH+os+bXFop/Tl2efX+QafpVwfd8o3NCdQYLfK64nUyqYMweXVE9rYCkv5mQidiK5z+A9gO4krC4ZilapgIqtX2Gk9ePZW49VsGXJqVtNbrL7l9vcFSQnhhM3yHQiDhtiNW3xyf/YpW7nUERBJ+YvfAxOu54Wug05uFhVZhg/QQ5aJAgMBAAGjUzBRMB0GA1UdDgQWBBTOrmHFE+bNGgceqmZbNQIMTnjX2DAfBgNVHSMEGDAWgBTOrmHFE+bNGgceqmZbNQIMTnjX2DAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEBCwUAA4IBAQA9QxFdmpm1lOm89ZzD4JIxFOIKMW88rmXs4JtcH0l/ZnYFEb9KsHdqp3LqMhr6Cz3N4VcYGVcy8ifkU/y5jWTd4AP8ueRajAoMBolcSJ6rq2L3KE8TGO4QjRUMYVYrNghsSAJROd3LW2BjWX8Gy059lqiJphg0ubBLpdmGoQPt6b1RVdpKpuXXsFhqSeSeCvEPXnhtCNRA5j45X22+D/a/eP0HwcYhXq9L/HoCuASt6qqaAE4bqaF48OT2JXvppfe3hMAhFTIqu5T126/EYbOI20a3BqvSZrAkhYzD9ujZgqGrGHuZuRlunnLAWMZdD7YB5naNNb/AUw6sIBNL5cOi',
'NameIDFormat' => 'urn:oasis:names:tc:SAML:2.0:nameid-format:transient',
];
- SP→IdPへのメタデータ登録
SPサーバの設定ページ( https://localhost/ssoSp/ )の[連携]タブを開き、"SAML 2.0 SPメタデータ"項の[メタデータを表示]をクリックします。
"メタデータ"項の下の方の「SimpleSAMLphpのファイルフォーマット」をコピーします、XML表記ではなくPHP表記の方です。右上のアイコンをクリックするとクリップボードにコピーできます。
以下のように、IdPサーバのmetadeta設定ファイル( ssoIdp\metadata\saml20-sp-remote.php )の末尾にコピーした設定を追記します。
<?php
/** 省略 **/
$metadata['https://localhost/ssoSp/'] = [
'SingleLogoutService' => [
[
'Binding' => 'urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect',
'Location' => 'https://localhost/ssoSp/module.php/saml/sp/saml2-logout.php/default-sp',
],
],
'AssertionConsumerService' => [
[
'index' => 0,
'Binding' => 'urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST',
'Location' => 'https://localhost/ssoSp/module.php/saml/sp/saml2-acs.php/default-sp',
],
[
'index' => 1,
'Binding' => 'urn:oasis:names:tc:SAML:1.0:profiles:browser-post',
'Location' => 'https://localhost/ssoSp/module.php/saml/sp/saml1-acs.php/default-sp',
],
[
'index' => 2,
'Binding' => 'urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Artifact',
'Location' => 'https://localhost/ssoSp/module.php/saml/sp/saml2-acs.php/default-sp',
],
[
'index' => 3,
'Binding' => 'urn:oasis:names:tc:SAML:1.0:profiles:artifact-01',
'Location' => 'https://localhost/ssoSp/module.php/saml/sp/saml1-acs.php/default-sp/artifact',
],
],
'certData' => 'MIIDazCCAlOgAwIBAgIUJLtpBYNjIcJk1/Y/LkAvDycDTpQwDQYJKoZIhvcNAQELBQAwRTELMAkGA1UEBhMCQVUxEzARBgNVBAgMClNvbWUtU3RhdGUxITAfBgNVBAoMGEludGVybmV0IFdpZGdpdHMgUHR5IEx0ZDAeFw0yMDA5MjAwNjQzMzFaFw00ODAyMDUwNjQzMzFaMEUxCzAJBgNVBAYTAkFVMRMwEQYDVQQIDApTb21lLVN0YXRlMSEwHwYDVQQKDBhJbnRlcm5ldCBXaWRnaXRzIFB0eSBMdGQwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDEeMeS3Tt6A90fpaGnqGKR6i3+scsAuxsQI3K9nVJRcFT30KEMgRkgNvYVQ0wVBDuNZrC2GRvwfIwSjrxLigFbznih4Dide8oMvjmBgOQaug12BuUltyBCNSiz6QcBBw4Y+oQQJTR5TQgkLmiNweL/mzVHSzfTWmlTM8Po94VH+os+bXFop/Tl2efX+QafpVwfd8o3NCdQYLfK64nUyqYMweXVE9rYCkv5mQidiK5z+A9gO4krC4ZilapgIqtX2Gk9ePZW49VsGXJqVtNbrL7l9vcFSQnhhM3yHQiDhtiNW3xyf/YpW7nUERBJ+YvfAxOu54Wug05uFhVZhg/QQ5aJAgMBAAGjUzBRMB0GA1UdDgQWBBTOrmHFE+bNGgceqmZbNQIMTnjX2DAfBgNVHSMEGDAWgBTOrmHFE+bNGgceqmZbNQIMTnjX2DAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEBCwUAA4IBAQA9QxFdmpm1lOm89ZzD4JIxFOIKMW88rmXs4JtcH0l/ZnYFEb9KsHdqp3LqMhr6Cz3N4VcYGVcy8ifkU/y5jWTd4AP8ueRajAoMBolcSJ6rq2L3KE8TGO4QjRUMYVYrNghsSAJROd3LW2BjWX8Gy059lqiJphg0ubBLpdmGoQPt6b1RVdpKpuXXsFhqSeSeCvEPXnhtCNRA5j45X22+D/a/eP0HwcYhXq9L/HoCuASt6qqaAE4bqaF48OT2JXvppfe3hMAhFTIqu5T126/EYbOI20a3BqvSZrAkhYzD9ujZgqGrGHuZuRlunnLAWMZdD7YB5naNNb/AUw6sIBNL5cOi',
];
- テストSSOログイン
SP( https://localhost/ssoSp/ )の[認証]タブの「設定されている認証元をテスト」をクリックします。
default-sp を選択します。
登録しているIdP(ここでは1つだけですが)を選んで、[選択]をクリックします。
SPからIdPにSAMLRequestが送信されるとともに、IdPのログイン画面へ遷移しますので、以前の手順で設定したユーザアカウントのIDとパスワード(ユーザ名:student, パスワード : studentpass、及び、ユーザ名 : employee, パスワード : employeepass)を入力し、[ログイン]をクリックしてくだい。ちなみにすでにIdPでの認証が済んでいる場合は、この画面はスキップされます。
IdPでの認証に成功すると、IdPからSAMLResponseがSPに送信され、それの検証によりSPでの認証が完了します。下の画像はSPでの認証に成功したときのものです。これで一通りの手順はおしまいです。
おまけ:SAML連携時の通信の中身を見てみる
SAMLの仕様とか各要素とかについてはOASISの仕様書を見ていただくと良いとは思うのですが、いかんせん量が多く慣れないと結構しんどいです。マニアックな内容なのでそうそう慣れる機会は無いとは思いますが。
- SAMLRequest(※デコード&整形しています。)
<samlp:AuthnRequest xmlns:samlp="urn:oasis:names:tc:SAML:2.0:protocol" xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion" ID="_6bbcd43e1ec075d4ebf68dfe874f452bcace577438" Version="2.0" IssueInstant="2020-09-21T23:33:59Z" Destination="https://localhost/ssoIdp/saml2/idp/SSOService.php" AssertionConsumerServiceURL="https://localhost/ssoSp/module.php/saml/sp/saml2-acs.php/default-sp" ProtocolBinding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST">
<saml:Issuer>https://localhost/ssoSp/</saml:Issuer>
<samlp:NameIDPolicy Format="urn:oasis:names:tc:SAML:2.0:nameid-format:transient" AllowCreate="true" />
</samlp:AuthnRequest>
- SAMLResponse(※デコード&整形しています。)
<samlp:Response xmlns:samlp="urn:oasis:names:tc:SAML:2.0:protocol" xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion" ID="_c80d4705c4a781d20a6fde29643079ceada2e5d323" Version="2.0" IssueInstant="2020-09-21T23:34:07Z" Destination="https://localhost/ssoSp/module.php/saml/sp/saml2-acs.php/default-sp" InResponseTo="_6bbcd43e1ec075d4ebf68dfe874f452bcace577438">
<saml:Issuer>https://localhost/ssoIdp/saml2/idp/metadata.php</saml:Issuer>
<ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
<ds:SignedInfo>
<ds:CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" />
<ds:SignatureMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#rsa-sha256" />
<ds:Reference URI="#_c80d4705c4a781d20a6fde29643079ceada2e5d323">
<ds:Transforms>
<ds:Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature" />
<ds:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" />
</ds:Transforms>
<ds:DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256" />
<ds:DigestValue>VRzn0Gt54eGrC/5QNppWD8uFoyA1/n+8NoywV80mV+4=</ds:DigestValue>
</ds:Reference>
</ds:SignedInfo>
<ds:SignatureValue>DYPl40JAe/KO8bYL/XR0DjrUr5gAPkz48Hdk82sDsA+dJeEuNDjvMptuXo6TVdQKddj0URHApuLLklgRmENhqkGQub1fYCKkAaj2XX3VrMvktkiyLMXW8fTtk0meiQv9ccgfLcevlLpFs7cUPcrHU9jXYx4HyqxqlI/8dzOg7DazzinJTpyVxfuWmQ7h9IBPesn7gXE+zWyJZhnRn+9vH5GjLZaS9+i1DXlk48RS40JZo4eJUu4gXMRvgfp4iOQI2mg31p0ojiGJPMjNCAzlKAHtNYJmsZWeDo5CLhUq8EYZsDp9xWLo5qHkq8RYtkXp8eWlyVCHq1vvMqBNX+v41w==</ds:SignatureValue>
<ds:KeyInfo>
<ds:X509Data>
<ds:X509Certificate>MIIDazCCAlOgAwIBAgIUJLtpBYNjIcJk1/Y/LkAvDycDTpQwDQYJKoZIhvcNAQELBQAwRTELMAkGA1UEBhMCQVUxEzARBgNVBAgMClNvbWUtU3RhdGUxITAfBgNVBAoMGEludGVybmV0IFdpZGdpdHMgUHR5IEx0ZDAeFw0yMDA5MjAwNjQzMzFaFw00ODAyMDUwNjQzMzFaMEUxCzAJBgNVBAYTAkFVMRMwEQYDVQQIDApTb21lLVN0YXRlMSEwHwYDVQQKDBhJbnRlcm5ldCBXaWRnaXRzIFB0eSBMdGQwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDEeMeS3Tt6A90fpaGnqGKR6i3+scsAuxsQI3K9nVJRcFT30KEMgRkgNvYVQ0wVBDuNZrC2GRvwfIwSjrxLigFbznih4Dide8oMvjmBgOQaug12BuUltyBCNSiz6QcBBw4Y+oQQJTR5TQgkLmiNweL/mzVHSzfTWmlTM8Po94VH+os+bXFop/Tl2efX+QafpVwfd8o3NCdQYLfK64nUyqYMweXVE9rYCkv5mQidiK5z+A9gO4krC4ZilapgIqtX2Gk9ePZW49VsGXJqVtNbrL7l9vcFSQnhhM3yHQiDhtiNW3xyf/YpW7nUERBJ+YvfAxOu54Wug05uFhVZhg/QQ5aJAgMBAAGjUzBRMB0GA1UdDgQWBBTOrmHFE+bNGgceqmZbNQIMTnjX2DAfBgNVHSMEGDAWgBTOrmHFE+bNGgceqmZbNQIMTnjX2DAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEBCwUAA4IBAQA9QxFdmpm1lOm89ZzD4JIxFOIKMW88rmXs4JtcH0l/ZnYFEb9KsHdqp3LqMhr6Cz3N4VcYGVcy8ifkU/y5jWTd4AP8ueRajAoMBolcSJ6rq2L3KE8TGO4QjRUMYVYrNghsSAJROd3LW2BjWX8Gy059lqiJphg0ubBLpdmGoQPt6b1RVdpKpuXXsFhqSeSeCvEPXnhtCNRA5j45X22+D/a/eP0HwcYhXq9L/HoCuASt6qqaAE4bqaF48OT2JXvppfe3hMAhFTIqu5T126/EYbOI20a3BqvSZrAkhYzD9ujZgqGrGHuZuRlunnLAWMZdD7YB5naNNb/AUw6sIBNL5cOi</ds:X509Certificate>
</ds:X509Data>
</ds:KeyInfo>
</ds:Signature>
<samlp:Status>
<samlp:StatusCode Value="urn:oasis:names:tc:SAML:2.0:status:Success" />
</samlp:Status>
<saml:Assertion xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xs="http://www.w3.org/2001/XMLSchema" ID="_3c8f7884ed17561a8fdbbf9d11a70064ffbd3d76a6" Version="2.0" IssueInstant="2020-09-21T23:34:07Z">
<saml:Issuer>https://localhost/ssoIdp/saml2/idp/metadata.php</saml:Issuer>
<ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
<ds:SignedInfo>
<ds:CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" />
<ds:SignatureMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#rsa-sha256" />
<ds:Reference URI="#_3c8f7884ed17561a8fdbbf9d11a70064ffbd3d76a6">
<ds:Transforms>
<ds:Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature" />
<ds:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" />
</ds:Transforms>
<ds:DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256" />
<ds:DigestValue>f880DlkRbn8Jjhks7A9xBSLrkBOH0k7f1XVxiPOt6Qk=</ds:DigestValue>
</ds:Reference>
</ds:SignedInfo>
<ds:SignatureValue>PlpGL7o08rqHjN/jzN1nf3TrtphGyPY2+DKo3KYlCF/W6WMtMqvo4RdQKluUMzJixAQL10y9FuHgdLoziA1IMtwARKfbn8W3dqu5OVbmqghD6joYztSblUpJWlsttl26dwvr8ZVgHnf4ZZCydmGS/f9Jgep5oFGtBT60/k8kacb15uThCKHiiyr3ZpmE1y1HLfxEhgqD4SNhd1IpDUipe3fEXBEVHwjotZsOHvMuvXzA1GtRmW2myKT5RJq81oxzTO2t1gwg05N+XnrbGH95G228gReFs63dzu+gUo7fa7jNXqvNMe+MWEKOj7qMv0HdS5MC5xWOB/PcMQUCJkVQbQ==</ds:SignatureValue>
<ds:KeyInfo>
<ds:X509Data>
<ds:X509Certificate>MIIDazCCAlOgAwIBAgIUJLtpBYNjIcJk1/Y/LkAvDycDTpQwDQYJKoZIhvcNAQELBQAwRTELMAkGA1UEBhMCQVUxEzARBgNVBAgMClNvbWUtU3RhdGUxITAfBgNVBAoMGEludGVybmV0IFdpZGdpdHMgUHR5IEx0ZDAeFw0yMDA5MjAwNjQzMzFaFw00ODAyMDUwNjQzMzFaMEUxCzAJBgNVBAYTAkFVMRMwEQYDVQQIDApTb21lLVN0YXRlMSEwHwYDVQQKDBhJbnRlcm5ldCBXaWRnaXRzIFB0eSBMdGQwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDEeMeS3Tt6A90fpaGnqGKR6i3+scsAuxsQI3K9nVJRcFT30KEMgRkgNvYVQ0wVBDuNZrC2GRvwfIwSjrxLigFbznih4Dide8oMvjmBgOQaug12BuUltyBCNSiz6QcBBw4Y+oQQJTR5TQgkLmiNweL/mzVHSzfTWmlTM8Po94VH+os+bXFop/Tl2efX+QafpVwfd8o3NCdQYLfK64nUyqYMweXVE9rYCkv5mQidiK5z+A9gO4krC4ZilapgIqtX2Gk9ePZW49VsGXJqVtNbrL7l9vcFSQnhhM3yHQiDhtiNW3xyf/YpW7nUERBJ+YvfAxOu54Wug05uFhVZhg/QQ5aJAgMBAAGjUzBRMB0GA1UdDgQWBBTOrmHFE+bNGgceqmZbNQIMTnjX2DAfBgNVHSMEGDAWgBTOrmHFE+bNGgceqmZbNQIMTnjX2DAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEBCwUAA4IBAQA9QxFdmpm1lOm89ZzD4JIxFOIKMW88rmXs4JtcH0l/ZnYFEb9KsHdqp3LqMhr6Cz3N4VcYGVcy8ifkU/y5jWTd4AP8ueRajAoMBolcSJ6rq2L3KE8TGO4QjRUMYVYrNghsSAJROd3LW2BjWX8Gy059lqiJphg0ubBLpdmGoQPt6b1RVdpKpuXXsFhqSeSeCvEPXnhtCNRA5j45X22+D/a/eP0HwcYhXq9L/HoCuASt6qqaAE4bqaF48OT2JXvppfe3hMAhFTIqu5T126/EYbOI20a3BqvSZrAkhYzD9ujZgqGrGHuZuRlunnLAWMZdD7YB5naNNb/AUw6sIBNL5cOi</ds:X509Certificate>
</ds:X509Data>
</ds:KeyInfo>
</ds:Signature>
<saml:Subject>
<saml:NameID SPNameQualifier="https://localhost/ssoSp/" Format="urn:oasis:names:tc:SAML:2.0:nameid-format:transient">_775c636d1fd3fb01bcc4cf55049b2449cbdaed9ad8</saml:NameID>
<saml:SubjectConfirmation Method="urn:oasis:names:tc:SAML:2.0:cm:bearer">
<saml:SubjectConfirmationData NotOnOrAfter="2020-09-21T23:39:07Z" Recipient="https://localhost/ssoSp/module.php/saml/sp/saml2-acs.php/default-sp" InResponseTo="_6bbcd43e1ec075d4ebf68dfe874f452bcace577438" />
</saml:SubjectConfirmation>
</saml:Subject>
<saml:Conditions NotBefore="2020-09-21T23:33:37Z" NotOnOrAfter="2020-09-21T23:39:07Z">
<saml:AudienceRestriction>
<saml:Audience>https://localhost/ssoSp/</saml:Audience>
</saml:AudienceRestriction>
</saml:Conditions>
<saml:AuthnStatement AuthnInstant="2020-09-21T23:34:07Z" SessionNotOnOrAfter="2020-09-22T07:34:07Z" SessionIndex="_6152d2e9dad940750f2e9921202ebfb8d43e11c089">
<saml:AuthnContext>
<saml:AuthnContextClassRef>urn:oasis:names:tc:SAML:2.0:ac:classes:PasswordProtectedTransport</saml:AuthnContextClassRef>
</saml:AuthnContext>
</saml:AuthnStatement>
<saml:AttributeStatement>
<saml:Attribute Name="uid" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:basic">
<saml:AttributeValue xsi:type="xs:string">test</saml:AttributeValue>
</saml:Attribute>
<saml:Attribute Name="eduPersonAffiliation" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:basic">
<saml:AttributeValue xsi:type="xs:string">member</saml:AttributeValue>
<saml:AttributeValue xsi:type="xs:string">student</saml:AttributeValue>
</saml:Attribute>
</saml:AttributeStatement>
</saml:Assertion>
</samlp:Response>