
次の州の命令を実行する際、私たちのチームはサイトをESIAと統合する問題に直面しました。 ネットワーク上でこの問題を解決するための指示はありません。ただし、通信省の公式文書(3つの規則で約300ページ)の情報を除きます。 ESIAの統合のための有料サービスを提供する会社もあります。 統合プロセスを実装、説明し、habrahabrコミュニティと共有することにしました。
ESIAとは
識別の統一システムと識別のA-政府機関や一部の商業組織のWebサイトへのアクセス(登録、認証)を提供するロシアの情報システム。 ウィキペディアで詳細を読む
ESIAの統合中に、システムは要求をESIAに送信し、認証に成功すると、応答としてユーザーデータを受信できます。
承認スクリプトは次のようになります。
- ESIAが紹介されているサイトのユーザーは、個人アカウントで「State Services経由で入力」ボタンをクリックします
- システムはESIA Webサイトにリダイレクトします
- ユーザーはESIA Webサイトでユーザー名とパスワードを入力します
- 認証に成功すると、ESIAはユーザーをサイトに戻し、安全なプロトコルを介して個人データを転送します
内容
- 一般的な情報
- SimpleSAMLphpをインストールする
- ESIAテスト環境に接続するためのSimpleSAMLphpの構成
- メタデータファイルの構成
- ISをESIAテスト環境に接続するために、通信省の住所に申請書を送付する
- ESIAとの機能統合およびESIAを介した許可ユーザーのデータの受信
- IPを生産的なESIA環境に接続するためのアプリケーションを送信する
一般的な情報
「統一識別認証システムの使用に関するガイドライン」と題された文書が通信省のウェブサイトに掲載されており、最新版は常に通信省のウェブサイトにあります。 ドキュメント自体はかなり大きく、200ページ近くあります。もちろん、詳細に勉強したい人はほとんどいません。誰もが理解できるわけではないので、最後にプロセスを説明します。
ICをESIAに接続するには2つの方法があります。
- SAML 2.0標準を通じて
- RESTアプローチに基づいて
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
リクエストで、そのようなページが表示されます

ESIAテスト環境に接続するためのSimpleSAMLphpの構成
統合するには、証明書( cert.crt
)とキー( key.key
)がkey.key
。 重要なのは(!)GOST証明書では何もうまくいかないこと、それを行う方法をグーグルで調べて無料の証明書を取得するか、自分で証明書を発行できることです。 キーと証明書をsimplesamlphp/cert
フォルダーに入れます
SimpleSAMLphpを構成するには、次のファイルを編集する必要があります。
-
simplesamlphp/config/config.php
-
simplesamlphp/config/authsources.php
-
simplesamlphp/metadata/saml20-idp-remote.php
重要な注意-サーバー上の時間は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',
次に、証明書(指紋)の署名を取得する必要があります。 これは、いずれかのコマンドのターミナルで実行できます
-
openssl x509 -noout -fingerprint -in "cert.crt" SHA1
-
sha1sum cert.crt
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つのファイルをレターに添付する必要があります。
- PDF形式のスキャンアプリケーション、
- crt形式の証明書
- xmlメタデータファイル
サービスプロバイダー(ESIA)から「解決済み」のステータスとテスト用の添付ファイルを含む応答を受信した後、次の手順に進みます。
「リクエスト#には追加情報が必要です」という件名の回答が届く可能性があります。この場合、レターには修正が必要なものに関する情報が含まれます。
ESIAとの機能統合およびESIAを介した許可ユーザーのデータの受信
リンクをクリックして、テスト環境へのIP接続を確認します
ServerName/simplesaml/module.php/core/authenticate.php?as=esia
。
上記のすべての段落が正しく完了すると、ESIAテスト環境へのリンクを含むリンクが開きます。 テスト環境での認証には、ステータスが「解決済み」のレターでESIAから受信したデータが使用されます。 認証後、ESIAから受信したデータを含むテーブルを含むSimpleSAMLページにリダイレクトされます。

次に、データを処理するスクリプトを作成します。 最初に、サイトを認証するボタンを追加します。
// 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つのファイルを添付します。
- 新しいメタデータファイル
- 申請書M
これで、ステータスが「解決済み」の応答を受け取るはずです。その後、ESIAを介してエントリの機能を操作に入力できます。
執筆時点では、規則の現在のバージョンは2.7です。 規制を更新する場合、IPとESIAの相互作用にいくつかの変更が可能です。