技術資料

シンプルな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 Perl

Movable Type プラグインで実現するエラー画面・ログイン画面の出力方法

2025.04.10

Movable Typeプラグイン開発において、エラー画面やログイン画面をどのように出力すべきか、その基本手法を具体的なコード例を交えて解説します。MT::App の show_error および show_login メソッドの利用方法や各オプションの効果を理解することで、プラグインにおけるユーザーインターフェースのカスタマイズが容易になります。

Movable Type Perl

Movable Type プラグインによるユーザーアクションメニュー制御 ― condition設定の実践的解法

2025.04.07

Movable Type プラグインを使用したユーザーアクションメニューの制御方法を解説します。特に、config.yamlでの condition 設定の制限とその回避策について、core_user_actions のオーバーライドによる実践的な解決方法を、具体的なコード例とともに紹介します。

Movable Type Perl

Movable Typeプラグイン入門:MT::Author で実現するロール付与の手法

2025.03.26

本記事では、Movable Type のプラグイン開発において、MT::Author オブジェクトを利用したユーザーへのロール付与手法を詳しく解説します。具体的なコード例とともに、ユーザー、ブログ、ロールの各オブジェクトの取得方法や、add_role メソッドを活用したロール付与処理の流れを紹介。実務に直結する実装ポイントを分かりやすく解説しています。

Movable Type Perl

阿部辰也へのお仕事の依頼・お問い合わせ

軽いご相談もお気軽にどうぞ!

個人情報の取り扱いについて *必須 プライバシーポリシーをご確認いただき、同意いただける場合は「同意する」にチェックをしてください。

keyboard_double_arrow_up
TOP