SAMLを介したIPとESIAの統合

ESIAとの統合



次の州の命令を実行する際、私たちのチームはサイトをESIAと統合する問題に直面しました。 ネットワーク上でこの問題を解決するための指示はありません。ただし、通信省の公式文書(3つの規則で約300ページ)の情報を除きます。 ESIAの統合のための有料サービスを提供する会社もあります。 統合プロセスを実装、説明し、habrahabrコミュニティと共有することにしました。







ESIAとは



識別の統一システムと識別のA-政府機関や一部の商業組織のWebサイトへのアクセス(登録、認証)を提供するロシアの情報システム。 ウィキペディアで詳細を読む







ESIAの統合中に、システムは要求をESIAに送信し、認証に成功すると、応答としてユーザーデータを受信できます。







承認スクリプトは次のようになります。









内容



  1. 一般的な情報
  2. SimpleSAMLphpをインストールする
  3. ESIAテスト環境に接続するためのSimpleSAMLphpの構成
  4. メタデータファイルの構成
  5. ISをESIAテスト環境に接続するために、通信省の住所に申請書を送付する
  6. ESIAとの機能統合およびESIAを介した許可ユーザーのデータの受信
  7. IPを生産的なESIA環境に接続するためのアプリケーションを送信する


一般的な情報



「統一識別認証システムの使用に関するガイドライン」と題された文書が通信省のウェブサイトに掲載されており、最新版は常に通信省のウェブサイトにあります。 ドキュメント自体はかなり大きく、200ページ近くあります。もちろん、詳細に勉強したい人はほとんどいません。誰もが理解できるわけではないので、最後にプロセスを説明します。







ICをESIAに接続するには2つの方法があります。









2つのアプローチを比較すると、実際にはこれらのアプローチに大きな違いはありません。RESTアプローチに基づく方法にはいくつかの利点があります。 私の意見では多額のお金でESIAをつなぎ、RESTの利点についてここに書いた人がいます







しかし、ほとんどの場合、最初のアプローチはすべての必要な機能をカバーしています。 したがって、SAML 2.0によるESIAの実装について説明します







SimpleSAMLphpをインストールする



統合には、SimpleSAMLphpを使用します。 セットアップするシステムがPHPで記述されていない場合でも、このモジュールを使用できます。サイトにphpで認証機能が実装されているだけで、ESIAからXML形式でデータを受け取ります。







SimplSAMLphpの最新の公式バージョンは、 SimpleSamlPHPの公式Webサイトで入手できます。 アーカイブをダウンロードし、/ varフォルダーにモジュールを解凍します。セキュリティ上の理由から、解凍されたモジュールがあるフォルダーでは、rootユーザーのみにアクセス権を設定する必要があります。 サーバー構成で、エイリアスと次のルールを追加します。







<VirtualHost *> ServerName service.example.com DocumentRoot /var/www/service.example.com SetEnv SIMPLESAMLPHP_CONFIG_DIR /var/simplesamlphp/config Alias /simplesaml /var/simplesamlphp/www <Directory /var/simplesamlphp/www> <IfModule !mod_authz_core.c> # For Apache 2.2: Order allow,deny Allow from all </IfModule> <IfModule mod_authz_core.c> # For Apache 2.4: Require all granted </IfModule> </Directory> </VirtualHost>
      
      





一番下の行は、 ServerName/simplesaml



リクエストでServerName/simplesaml



ウェルカムページが開きます。 すべてを正しく行った場合、 ServerName/simplesaml



リクエストで、そのようなページが表示されます









SimpleSamlPHP






ESIAテスト環境に接続するためのSimpleSAMLphpの構成



統合するには、証明書( cert.crt



)とキー( key.key



)がkey.key



。 重要なのは(!)GOST証明書では何もうまくいかないこと、それを行う方法をグーグルで調べて無料の証明書を取得するか、自分で証明書を発行できることです。 キーと証明書をsimplesamlphp/cert



フォルダーに入れます







SimpleSAMLphpを構成するには、次のファイルを編集する必要があります。









重要な注意-サーバー上の時間は1分以上ECIA時間と変わらないようにする必要があります。







simplesamlphp/config/config.php









 //         simplesamlphp 'certdir' => 'cert/' //  'secretsalt' => 'defaultsecretsalt', //  'technicalcontact_name' => 'Familiya Imya', 'technicalcontact_email' => 'po4ta@domen.zone',
      
      





システムにentityIDがあるかどうかを知ることが重要です。ない場合は、システムのアドレスを'entityID'



フィールドで指定する必要があります







simplesamlphp/config/authsources.php









 esia' => array ( 'saml:SP', 'name' => 'Esia', //   'privatekey' => 'key.key', //  'privatekey_pass' => '12345678', //   'certificate' => 'cert.crt', // , 'entityID' => 'ServerName', 'discoURL' => NULL, 'redirect.sign' => TRUE, 'redirect.validate' => TRUE, 'validate.logout' => FALSE, //idp      'idp' => 'https://esia-portal1.test.gosuslugi.ru/idp/shibboleth', //idp      // 'idp' => 'https://esia.gosuslugi.ru/idp/shibboleth', //  'OrganizationName' => 'Organization Name', //url  'OrganizationURL' => 'ServerName',
      
      





次に、証明書(指紋)の署名を取得する必要があります。 これは、いずれかのコマンドのターミナルで実行できます









simplesamlphp/metadata/saml20-idp-remote.php









 // idp      $metadata['https://esia-portal1.test.gosuslugi.ru/idp/shibboleth'] = array( 'name' => array( 'en' => 'Esia', 'no' => 'ESIA', ), //idp SignOn   'SingleSignOnService' => 'https://esia-portal1.test.gosuslugi.ru/idp/profile/SAML2/Redirect/SSO', //idp LogOut   'SingleLogoutService' => 'https://esia-portal1.test.gosuslugi.ru/idp/profile/SAML2/Redirect/SLO', //Fingerprint  'certFingerprint' => 'f17393ae5927293ae5927261b6515c44501e4450', );
      
      





メタデータファイルの構成



次に、アプリケーションとともにESIAに送信するために、メタデータファイルを構成する必要があります







メタデータファイルは、 ServerName/simplesaml/module.php/saml/sp/metadata.php/esia?output=xhtml









メタデータファイルの例:







 <?xml version="1.0"?> <md:EntityDescriptor xmlns:md="urn:oasis:names:tc:SAML:2.0:metadata" xmlns:ds="http://www.w3.org/2000/09/xmldsig#" entityID="ServerName"> <md:SPSSODescriptor protocolSupportEnumeration="urn:oasis:names:tc:SAML:1.1:protocol urn:oasis:names:tc:SAML:2.0:protocol" AuthnRequestsSigned="true"> <md:KeyDescriptor use="signing"> <ds:KeyInfo xmlns:ds="http://www.w3.org/2000/09/xmldsig#"> <ds:X509Data> <ds:X509Certificate> // </ ds:X509Certificate> </ds:X509Data> </ds:KeyInfo> </md:KeyDescriptor> <md:KeyDescriptor use="encryption"> <ds:KeyInfo xmlns:ds="http://www.w3.org/2000/09/xmldsig#"> <ds:X509Data> <ds:X509Certificate> // </ ds:X509Certificate> </ds:X509Data> </ds:KeyInfo> </md:KeyDescriptor> <md:SingleLogoutService Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect" Location="ServerName/simplesaml/module.php/saml/sp/saml2-logout.php/esia"/> <md:AssertionConsumerService Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST" Location="ServerName/simplesaml/module.php/saml/sp/saml2-acs.php/esia" index="0"/> <md:AssertionConsumerService Binding="urn:oasis:names:tc:SAML:1.0:profiles:browser-post" Location="ServerName/simplesaml/module.php/saml/sp/saml1-acs.php/esia" index="1"/> <md:AssertionConsumerService Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Artifact" Location="ServerName/simplesaml/module.php/saml/sp/saml2-acs.php/esia" index="2"/> <md:AssertionConsumerService Binding="urn:oasis:names:tc:SAML:1.0:profiles:artifact-01" Location="ServerName/simplesaml/module.php/saml/sp/saml1-acs.php/esia/artifact" index="3"/> </md:SPSSODescriptor> <md:Organization> <md:OrganizationName xml:lang="en">Organization Name</md:OrganizationName> <md:OrganizationDisplayName xml:lang="en">Organization Name</md:OrganizationDisplayName> <md:OrganizationURL xml:lang="en">ServerName</md:OrganizationURL> </md:Organization> <md:ContactPerson contactType="technical"> <md:GivenName>Imya</md:GivenName> <md:SurName>Familiya</md:SurName> <md:EmailAddress>po4ta@domen.zone</md:EmailAddress> </md:ContactPerson> </md:E</ntityDescriptor>
      
      





しかし、残念ながら、SimpleSamlはメタデータファイルを生成しますが、これはESIA要件とはわずかに異なるため、段落A.6 メタデータファイルテンプレートの推奨事項に従って修正する必要があります







ESIA要件を満たすメタデータファイルの例は、 example.xml



ダウンロードできexample.xml









ISをESIAテスト環境に接続するために、通信省の住所に申請書を送付する



現在、参加者とESIAオペレーターとの情報のやり取りに関する規則の「E」の形式でアプリケーションを作成しています。 リンクから当社のウェブサイトからdocx形式の申請書をダウンロードできます。







次に、「テストESIAの統合」という件名でesia@minsvyaz.ru



リクエストを送信する必要があり、3つのファイルをレターに添付する必要があります。









サービスプロバイダー(ESIA)から「解決済み」のステータスとテスト用の添付ファイルを含む応答を受信した後、次の手順に進みます。







「リクエスト#には追加情報が必要です」という件名の回答が届く可能性があります。この場合、レターには修正が必要なものに関する情報が含まれます。







ESIAとの機能統合およびESIAを介した許可ユーザーのデータの受信



リンクをクリックして、テスト環境へのIP接続を確認します

ServerName/simplesaml/module.php/core/authenticate.php?as=esia









上記のすべての段落が正しく完了すると、ESIAテスト環境へのリンクを含むリンクが開きます。 テスト環境での認証には、ステータスが「解決済み」のレターでESIAから受信したデータが使用されます。 認証後、ESIAから受信したデータを含むテーブルを含むSimpleSAMLページにリダイレクトされます。







xml ESIA回答



次に、データを処理するスクリプトを作成します。 最初に、サイトを認証するボタンを追加します。







 //  action         <form action="inc/esia.php" method="POST"> <input name="esia" type="submit" value="  "/> </form>
      
      





ハンドラーinc/esia.php



ここでデータを取得し、データベースに書き込んだり、セッションに追加したりできます。 一般に、xmlを正しく解析する必要があります。 次に、画面にデータを表示します。









 if (isset($_POST['esia'])){ //   simplesamlphp/lib/_autoload.php require_once('../../simplesamlphp/lib/_autoload.php'); $as = new SimpleSAML_Auth_Simple('esia'); $as->requireAuth(); $attributes = $as->getAttributes(); foreach($attributes as $key => $value) { echo ($key . ' ' . $value . '<br/>'); } }
      
      





IPを生産的なESIA環境に接続するためのアプリケーションを送信する



現在、参加者とESIAオペレーターとの情報のやり取りに関する規則の「M」の形式のアプリケーションを作成しています。 フォームEと大きな違いはありませんが、フォームを慎重に検討し、要求されたデータをフォームに追加する必要があり、証明書ファイルを添付する必要はありません。







ファイルsimplesamlphp/config/authsources.php



simplesamlphp/metadata/saml20-idp-remote.php



、サービスプロバイダーidpをテスト環境から本稼働環境に置き換える必要があります。







 //idp      // 'idp' => 'https://esia-portal1.test.gosuslugi.ru/idp/shibboleth', //   idp      'idp' => 'https://esia.gosuslugi.ru/idp/shibboleth',
      
      





ここで、新しいメタデータファイルを作成します。実際には、サービスフィールドのリンクのみが変更されます







esia@minsvyaz.ruに電子メールを送信し、2つのファイルを添付します。









これで、ステータスが「解決済み」の応答を受け取るはずです。その後、ESIAを介してエントリの機能を操作に入力できます。







執筆時点では、規則の現在のバージョンは2.7です。 規制を更新する場合、IPとESIAの相互作用にいくつかの変更が可能です。










All Articles