シンプルなSAML認証用SPの構築:第一回 PerlとNet::SAML2で作るメタデータ生成スクリプト
作成日:2025.06.06
更新日:2025.06.12
PerlとNet::SAML2を利用して、シンプルな構成のSAML認証用SPの構築方法をご紹介します。CPANによるモジュール導入、テスト用の自己署名証明書と秘密鍵の準備方法に触れ、SPのエンティティIDやACS URL、エラーURLといった必要情報を含むメタデータをXML形式で生成するスクリプトの実装例を解説します。
目次
ローカル環境で動く、SAML認証によるSSO用の SP(Service Provider) を、シンプルな構成で Perl で実装してみます。
第一回である今回は、必要となる Perl モジュールのインストールと、 SP のメタデータを生成するためのスクリプトを作成してみます。
必要な Perl モジュールのインストール
まずは、必要な Perl モジュールを CPAN からインストールします。
今回は Net::SAML2
モジュールを使用します。このモジュールは、SAML 2.0 の SP と IdP の実装をサポートしています。
cpan Net::SAML2
cpan の基本操作については CPANの基本操作と古いモジュールのインストール方法 などを参照。
証明書と秘密鍵の準備
次に、SP のメタデータを生成するために必要な証明書と秘密鍵を準備します。
今回はローカル環境でのテスト用に、自己署名証明書を生成します。OpenSSLで作る自己署名証明書 ― コマンドラインで実践するオレオレ証明書作成手順 などを参照。
SP メタデータの生成スクリプト
次に、SP のメタデータを生成するための Perl スクリプトを metadata.cgi
という名前で作成します。このスクリプトは、SAML 2.0 の仕様に基づいて SP のメタデータを生成します。
#!/usr/bin/perl
use strict;
use warnings;
use Net::SAML2::SP;
# 基本設定
my $sp_cert_file = '/path/to/your/sp/cert.pem'; # SPの証明書ファイルのパス
my $sp_key_file = '/path/to/your/sp/key.pem'; # SPの秘密鍵ファイルのパス
my $sp_entity_id = 'https://localhost/perlsp/metadata.cgi'; # SPのエンティティID(かつメタデータのURL)
my $sp_acs_url = 'https://localhost/perlsp/acs.cgi'; # SPのACS(アサーションコンシューマサービス)URL
my $sp_error_url = 'https://localhost/perlsp/error.cgi'; # SPのエラーURL
my $sp_org_contact = 'perlsp@abe-tatsuya.com'; # SPの組織連絡先
my $sp_org_name = 'Tatsuya Abe'; # SPの組織名
my $sp_org_display_name = 'Tatsuya Abe'; # SPの組織表示名
# SP のインスタンスを作成
my $sp = Net::SAML2::SP->new(
issuer => $sp_entity_id,
assertion_consumer_service => [
{ url => $sp_acs_url },
],
url => $sp_entity_id
error_url => $sp_error_url,
cert => $sp_cert_file,
key => $sp_key_file,
org_contact => $sp_org_contact,
org_name => $sp_org_name,
org_display_name => $sp_org_display_name,
);
# SP メタデータを生成
my $metadata = $sp->metadata;
# メタデータを表示
print "Content-Type: application/xml\n\n";
print $metadata;
exit;
このスクリプトは、SP のメタデータを XML 形式で生成し、標準出力に出力します。メタデータには、SP のエンティティID、ACS URL、証明書、組織情報などが含まれます。
スクリプトの実行
ブラウザで metadata.cgi
を実行すると、SP のメタデータが表示されます。
例えば、以下のようなメタデータが表示されます。
<?xml version="1.0" encoding="UTF-8"?>
<md:EntityDescriptor xmlns:md="urn:oasis:names:tc:SAML:2.0:metadata" xmlns:ds="http://www.w3.org/2000/09/xmldsig#" ID="NETSAML2_1234567890qwertyuiop" entityID="https://localhost/perlsp/metadata.cgi">
<dsig:Signature xmlns:dsig="http://www.w3.org/2000/09/xmldsig#">
<dsig:SignedInfo xmlns:xenc="http://www.w3.org/2001/04/xmlenc#">
<dsig:CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/>
<dsig:SignatureMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#rsa-sha256"/>
<dsig:Reference URI="#NETSAML2_1234567890qwertyuiop">
<dsig:Transforms>
<dsig:Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"/>
<dsig:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/>
</dsig:Transforms>
<dsig:DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256"/>
<dsig:DigestValue><-- 略 --></dsig:DigestValue>
</dsig:Reference>
</dsig:SignedInfo>
<dsig:SignatureValue><-- 略 --></dsig:SignatureValue>
<dsig:KeyInfo><-- 略 --></dsig:KeyInfo>
</dsig:Signature>
<md:SPSSODescriptor WantAssertionsSigned="true" protocolSupportEnumeration="urn:oasis:names:tc:SAML:2.0:protocol" AuthnRequestsSigned="true" errorURL="https://localhost/perlsp/error.cgi">
<md:KeyDescriptor><ds:KeyInfo><ds:X509Data><ds:X509Certificate><-- 略 --></ds:X509Certificate></ds:X509Data><ds:KeyName><-- 略 --></ds:KeyName></ds:KeyInfo></md:KeyDescriptor>
<md:AssertionConsumerService index="1" url="https://localhost/perlsp/acs.cgi"/>
</md:SPSSODescriptor>
<md:Organization>
<md:OrganizationName xml:lang="en">Tatsuya Abe</md:OrganizationName>
<md:OrganizationDisplayName xml:lang="en">Tatsuya Abe</md:OrganizationDisplayName>
<md:OrganizationURL xml:lang="en">https://localhost/perlsp/metadata.cgi</md:OrganizationURL>
</md:Organization>
<md:ContactPerson contactType="other">
<md:Company>Tatsuya Abe</md:Company>
<md:EmailAddress>perlsp@abe-tatsuya.com</md:EmailAddress>
</md:ContactPerson>
</md:EntityDescriptor>
このメタデータを IdP に登録することで、SAML 認証が可能になります。
まとめ
今回は、Perl で SAML 2.0 の SP メタデータを生成するためのスクリプトを作成しました。必要な Perl モジュールのインストールから、証明書の準備、メタデータの生成までを行いました。
次回は、実際に SAML 認証を行うために IdP へのログインリクエストの送信処理の実装を行います。
このスクリプトをベースに、実際の SAML 認証フローを実装していくことができます。SAML 認証はセキュリティ上の要件が高いため、実装には十分な注意が必要です。
第二回 認証要求送信スクリプトの実装方法
2025.06.12追記
次の記事は、シンプルなSAML認証用SPの構築:第二回 PerlとNet::SAML2で作る認証要求送信スクリプトです。
SAML認証対応のWebアプリ開発にご興味のある方へ
本記事でご紹介したSPのメタデータ生成スクリプトは、SAML 2.0によるSSO(シングルサインオン)対応の第一歩です。
例えば、ローカル環境でのSP検証、証明書の自動生成、複数IdP対応、メタデータの発行・更新まで、一連のSSO構築を支援いたします。お気軽にご相談ください。

奈良市を拠点に、26年以上の経験を持つフリーランスWebエンジニア、阿部辰也です。
これまで、ECサイトのバックエンド開発や業務効率化システム、公共施設の予約システムなど、多彩なプロジェクトを手がけ、企業様や制作会社様のパートナーとして信頼を築いてまいりました。
【制作会社・企業様向けサポート】
Webシステムの開発やサイト改善でお困りの際は、どうぞお気軽にご相談ください。小さな疑問から大規模プロジェクトまで、最適なご提案を心を込めてさせていただきます。
ぜひ、プロフィールやWeb制作会社様向け業務案内、一般企業様向け業務案内もご覧くださいね。
シンプルなSAML認証用SPの構築:第三回 PerlとNet::SAML2で作るACSスクリプト
2025.06.10
連載第3回となる本稿では、PerlとNet::SAML2を用いて、ACS (Assertion Consumer Service) スクリプトの作成方法に焦点を当てます。IdPからのSAMLレスポンスを受信し、アサーションの検証やユーザー属性の取得といった重要な処理を実装する手順を、実際のコード例を交えてわかりやすく紹介。SAML認証の全体像とその実現に必要な知識を身につけるための内容です。
シンプルなSAML認証用SPの構築:第二回 PerlとNet::SAML2で作る認証要求送信スクリプト
2025.06.09
本記事は連載第2回として、前回構築したSPメタデータ生成スクリプトに引き続き、IdP(Identity Provider)への認証要求送信処理の実装方法を解説します。PerlとNet::SAML2モジュールを活用し、SAML 2.0仕様に基づいた認証要求の生成、リダイレクト処理、そしてセッションに認証要求IDを保存する基本的な手法をご紹介します。
Movable Type システムログ出力ガイド ― MT::App の log メソッドでエラーメッセージを記録する方法
2025.06.03
Movable Type のシステムログにエラーメッセージや各種情報を出力する方法について、MT::App の log メソッドを利用した具体的な実装例を解説します。ログレベル、クラス、カテゴリを指定することにより、出力内容を柔軟に分類・管理できる仕組みを詳述し、管理画面でのログ確認方法やデータベーステーブルでの確認方法も合わせて説明します。
Movable Type プラグインで実現するエラー画面・ログイン画面の出力方法
2025.04.10
Movable Typeプラグイン開発において、エラー画面やログイン画面をどのように出力すべきか、その基本手法を具体的なコード例を交えて解説します。MT::App の show_error および show_login メソッドの利用方法や各オプションの効果を理解することで、プラグインにおけるユーザーインターフェースのカスタマイズが容易になります。