シンプルなSAML認証用SPの構築:第一回 PerlとNet::SAML2で作るメタデータ生成スクリプト
作成日:2025.06.06
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 認証はセキュリティ上の要件が高いため、実装には十分な注意が必要です。

奈良市を拠点に、26年以上の経験を持つフリーランスWebエンジニア、阿部辰也です。
これまで、ECサイトのバックエンド開発や業務効率化システム、公共施設の予約システムなど、多彩なプロジェクトを手がけ、企業様や制作会社様のパートナーとして信頼を築いてまいりました。
【制作会社・企業様向けサポート】
Webシステムの開発やサイト改善でお困りの際は、どうぞお気軽にご相談ください。小さな疑問から大規模プロジェクトまで、最適なご提案を心を込めてさせていただきます。
ぜひ、プロフィールやWeb制作会社様向け業務案内、一般企業様向け業務案内もご覧くださいね。
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 メソッドの利用方法や各オプションの効果を理解することで、プラグインにおけるユーザーインターフェースのカスタマイズが容易になります。
Movable Type プラグインによるユーザーアクションメニュー制御 ― condition設定の実践的解法
2025.04.07
Movable Type プラグインを使用したユーザーアクションメニューの制御方法を解説します。特に、config.yamlでの condition 設定の制限とその回避策について、core_user_actions のオーバーライドによる実践的な解決方法を、具体的なコード例とともに紹介します。
Movable Typeプラグイン入門:MT::Author で実現するロール付与の手法
2025.03.26
本記事では、Movable Type のプラグイン開発において、MT::Author オブジェクトを利用したユーザーへのロール付与手法を詳しく解説します。具体的なコード例とともに、ユーザー、ブログ、ロールの各オブジェクトの取得方法や、add_role メソッドを活用したロール付与処理の流れを紹介。実務に直結する実装ポイントを分かりやすく解説しています。