[RUBY] La 3e bibliothèque SmartHR kiji est utilisée pour exécuter e-Gov (construction de l'environnement d'exécution)

kiji est une bibliothèque intégrée à SmartHR et publiée sur GitHub. Cette bibliothèque est un OSS réalisé en Ruby et peut être obtenue, modifiée et redistribuée par n'importe qui. SmartHR kiji

Ici, nous développons un pilote qui appelle kiji pour générer un xml signé.

1. 1. structure des dossiers kiji

Téléchargez kiji depuis GitHub. La structure des dossiers est la suivante.

kiji-structure du dossier principal


kiji-master/
        ├ bin/
        ├ lib/         #Source de développement complète
        │  └ kiji/
        └ spec/        #Environnement de test complet

Il existe un ensemble de sources de développement dans lib directement sous kiji-master, et un ensemble d'environnement de test dans spec. Vous pouvez vérifier les versions des autres packages de gemmes dont dépend kiji en vérifiant le kiji.gemspec directement sous kiji-master.

Comme je l'expliquerai plus tard, j'ai construit kiji dans mon environnement local car j'avais besoin de modifier certaines des sources de développement. Puisque la liste de fichiers devait être obtenue à partir de GitHub à partir de spec.files de kiji.gemspec, elle a été modifiée pour être obtenue à partir du dossier local.

La source de développement dans lib est indiquée ci-dessous.

structure du dossier lib


lib/
  ├ kiji.rb
  └ kiji/
       ├ access.rb
       ├ api.rb
       ├ authentication.rb
       ├ client.rb
       ├ digester.rb
       ├ signer.rb
       ├ version.rb
       └ zipper.rb

Si vous vérifiez kiji.rb, vous pouvez voir que l'application remplit directement version.rb, client.rb et zipper.rb.

kiji.rb


require 'kiji/version.rb'
require 'kiji/client.rb'
require 'kiji/zipper.rb'

2. À propos de la structure de kiji

kiji se compose de 4 classes et 2 modules.

structure de kiji


module kiji
  ├ class Zipper             #Durcir en fichier zip
  ├ class Client             # e-Envoyer à l'API de lien externe Gov
  ├ class Signer             #Créer un XML signé
  ├ class Digester           #Création de signature numérique
  ├ module Authentication    #Utilitaires liés à l'authentification
  └ module Access            # e-Utilitaires liés au gouvernement

En ce qui concerne la hiérarchie de quatre classes, la classe Zipper et la classe Client sont en tête, suivies par la classe Signer et la classe Digester. Si vous l'écrivez dans un diagramme de classes, ce sera comme suit. kijiクラス関連図.png

Pour postuler à e-Gov par voie électronique, suivez la procédure ci-dessous.

① Créez un xml signé (2) Consolider le xml signé, les fichiers joints, etc. dans un fichier zip ③ Encodez le fichier zip au format Base64 et stockez-le dans les données de transmission ④ Envoyer après configuration ③ dans le corps de la requête http de l'API de liaison externe e-Gov

La classe Zipper a les fonctions de ①②, et la classe Client a les fonctions de ③④.

Cette fois, j'ai décidé d'utiliser la classe Zipper pour effectuer ①② et d'utiliser la commande curl pour envoyer à e-Gov. Il s'agit de vérifier le contenu du xml signé et la réponse d'e-Gov.

3. 3. Correction de Kiji en raison du code de saut de ligne dans l'environnement Windows

Dans zipper.rb, lors du calcul de la valeur de hachage du formulaire de candidature, un problème est survenu lors de la lecture du xml à signer et le code a été corrigé.

Dans le code d'origine "app_doc = File.read (app_file_path)", xml est lu en mode texte, de sorte que le code de saut de ligne de fenêtre "\ r \ n" est automatiquement remplacé par "\ n" en interne. Je calculais la valeur de hachage du résultat. Par conséquent, il a été modifié pour lire en mode binaire sans remplacer le code de saut de ligne.

zipper.rb


      #Trouvez la valeur de hachage du formulaire de demande
      app_file_paths.each do |app_file_path|
-       app_doc = File.read(app_file_path)
+       f = File.open(app_file_path, "rb")
+       app_doc = f.read
        app_file_name = File.basename(app_file_path)
        signer.digest_file!(app_doc, id: app_file_name)
      end

Cela a conduit à la création d'un joyau local. Après avoir changé les fichiers spec de kiji.gemspec en destination locale, j'ai construit kiji et l'ai installé dans l'environnement local.

construction de Kiji


\kiji-master>rake build
kiji 0.2.2 built to pkg/kiji-0.2.2.gem.


\kiji-master>dir pkg
2020/08/21  11:42    <DIR>          .
2020/08/21  11:42    <DIR>          ..
2020/08/16  20:54            13,312 kiji-0.2.2.gem


\kiji-master>gem install pkg\kiji-0.2.2.gem
Successfully installed kiji-0.2.2
Parsing documentation for kiji-0.2.2
Installing ri documentation for kiji-0.2.2
Done installing documentation for kiji after 0 seconds
1 gem installed

4. Préparer les données de test

Préparez les données de test requises lors de la création d'une application par lots. Les données de test incluent le format standard et le format de signature de fichier individuel. À l'heure actuelle, les matériaux publics auxquels il faut se référer sont les matériaux liés à la procédure d'essai de l'environnement de vérification. Les informations suivantes sont incluses dans le document public «Liste des procédures de test API».

Liste des procédures de test API


Informations sur la procédure
├ Identificateur de procédure
├Nom de la procédure (nom décrit dans la "balise de nom de procédure" du XML de gestion de la configuration)
├ ID de style
├ Nom du formulaire de candidature
├ Modèle de spécification du formulaire de demande
├ ID d'administration de la réception
├ Classification
├ Informations sur la procédure comme modèle
│ ├ Identificateur de procédure
│ └ Nom de la procédure
├ Conditions de procédure
│ ├ Type d'application
│ ├ Formulaire de candidature (identifiant de la procédure, version du formulaire de candidature)
│ ├ Signature (présence / absence, nombre maximum de signatures)
│ ├ Documents joints (présence / absence, obligatoire/Tout/Ne peut être joint, nom du document, corrigé/Tout、書類名、送付方法)
│ ├ Destination de soumission (identificateur de destination de soumission, nom de destination de soumission, classification principale, classification moyenne, classification mineure)
│ ├ Style unique/Styles multiples
│ ├ Comment se retirer
│ ├ Avec ou sans enquête ministérielle
│ ├ Type de frais
│ ├ Période de réception
│ ├ Style
│ ├ Drapeau de suppression de procédure
│ └ État cible de transition automatique
└ Traitement possible après l'arrivée
├ Retrait (aucun, demande, demande)
├ Modification (aucune, modification partielle, nouvelle soumission, demande de modification)
├ Délivrance de documents officiels (aucun, oui)
├ Inscription des frais(Paiement différé)(Aucun, Oui)
├ Procédure terminée (notification, retrait, nouvelle soumission, acquisition définitive des documents officiels)
└ Notification de commentaire (aucun, avec message, avec fichier)

En outre, les informations suivantes sont publiées pour chaque nouvelle demande, demande de retrait, demande de retrait et demande de modification dans le document public "Liste des transitions de statut de procédure pour le test API".

Liste de transition de l'état de la procédure de test API


Liste de transition de statut
├ Identificateur de procédure
├ Nom de la procédure
├ Fonctionnement / traitement pour l'application
│ ├ Retrait
│ ├ Demande de modification
│ ├ Notification de commentaire
│ ├ Délivrance des documents officiels
│ └ Modifier l'état du paiement
├ Statut et actions de l'application
│ ├ Statut antérieur de la demande
│ │ ├ Application cible
│ │ └ Statut de l'application (sous-statut de l'application)
│ ├ Action
│ │ ├ Fonctionnement côté utilisateur
│    │   └ e-Présence ou absence de traitement côté gouvernement
│ └ Statut post-candidature
│ ├ Application cible
│ └ Statut de l'application (sous-statut de l'application)
└ Remarques

Utilisez ces matériaux comme référence pour créer des données de test afin de pouvoir effectuer le test souhaité.

4.1 Format standard

L'identifiant de procédure "900A010200001000" est repris comme données de test. Cette procédure est «Notification d'acquisition du statut d'assuré à l'assurance-emploi / demande électronique». Les documents joints sont requis et aucun document officiel ne sera délivré.

Les fichiers requis sont les suivants. En ce qui concerne le nom du fichier, la spécification est décidée dans le document public "Spécification de données communes de spécification de données d'application API de coopération externe", suivez donc la règle.

No catégorie de fichier Nom de fichier Remarques
1 Gestion de la configuration XML kousei.xml
2 Formulaire de candidature XML 900A01020000100001_01.xml ID du formulaire (18 caractères alphanumériques demi-largeur) + "_01 "fixe
3 Document attaché Pièce jointe.docx

Ces fichiers sont dans la hiérarchie suivante.

Hiérarchie des fichiers


kousei.xml
      ├ 900A01020000100001_01.xml
└ Fichier joint.docx

Les informations requises pour le XML de gestion de la configuration (kousei.xml) sont les suivantes.

No article Contenu Remarques
1 Identificateur de procédure 900A010200001000
2 Nom de la procédure Procédure de test API (procédure relative à l'assurance du travail) (communication) 0001 / Procédure de test API (procédure relative à l'assurance du travail) (communication) 0001 Nom à décrire dans "Nom de la procédure" du XML de gestion de la configuration
3 ID de formulaire 900A01020000100001
4 Nom du formulaire de demande Procédure de test API (procédure relative à l'assurance du travail) (communication) 0001_01
5 Modèle de spécification du formulaire de demande 0001 Modèle dans la définition de la structure XML du formulaire de candidature [procédure de test API]
6 Identifiant de l'agence administrative d'accueil 100900

Les conditions liées à la procédure décrite dans le XML de gestion de la configuration (kousei.xml) sont les suivantes.

No article Contenu Remarques
1 Type d'application Application normale
2 Formulaire de candidature-Identificateur de procédure (formulaire de demande) 900A010200001000
3 Formulaire de candidature-Version du formulaire de demande 0003
4 Signature-Présence ou absence Signatureあり(単署)
5 Signature-Nombre maximum de signatures 1
6 Document attaché-Présence ou absence Oui
7 Document attaché-Obligatoire/Tout Obligatoire
8 Document attaché-Nom du document fixe/Tout Nom du document fixe Nommez le document "Test Attachment 1"
9 Document attaché-Nom du document Pièce jointe d'essai 1
10 Document attaché-Méthode d'envoi Attachement
11 Destination de soumission-Identifiant de soumission 900API00000000001001001
12 Destination de soumission-Nom de la soumission Ministère des affaires intérieures et des communications,Bureau d'administration administrative,API

Incorporez ces informations dans la balise XML de gestion de la configuration (kousei.xml).

kousei.xml


<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet href="999000000000000001.xsl" type="text/xsl"?>
<DataRoot>
  <ID de formulaire>999000000000000001</ID de formulaire>
  <Version de style>0001</Version de style>
  <STYLESHEET>999000000000000001.xsl</STYLESHEET>
  <ID des informations de configuration="Informations de configuration">
    <Information de gestion>
      <Numéro de procédure>
        <Identifiant de l'agence administrative d'accueil>100900</Identifiant de l'agence administrative d'accueil>
        <ID de procédure>900A010200001000</ID de procédure>
      </Numéro de procédure>
      <Nom de la procédure>Procédure de test API (procédure relative à l'assurance du travail) (communication) 0001 / Procédure de test API (procédure relative à l'assurance du travail) (communication) 0001</Nom de la procédure>
      <Premier numéro de réception/>
      <Type d'application>Nouvelle application</Type d'application>
      <Coordonnées du candidat>
        <Information relative aux demandeurs>
          <Nom complet>Hoge Hoge</Nom complet>
          <Nom Frigana>Faire semblant de Gana</Nom Frigana>
          <Position/>
          <Nom de l'organisation corporative/>
          <Dénomination sociale Frigana/>
          <Nom du département/>
          <Nom du département Frigana/>
          <Code postal>1200001</Code postal>
          <adresse de rue>Oyada, Adachi-ku, Tokyo</adresse de rue>
          <Adresse Frigana>Tokyo Adachiku Oyata</Adresse Frigana>
          <numéro de téléphone>12-232-1232</numéro de téléphone>
          <Numéro de fax/>
          <adresse électronique>[email protected]</adresse électronique>
        </Information relative aux demandeurs>
        <Informations de contact>
          <Nom complet>Caractères chinois</Nom complet>
          <Nom Frigana>Faire semblant de Gana</Nom Frigana>
          <Position/>
          <Nom de l'organisation corporative/>
          <Dénomination sociale Frigana/>
          <Nom du département/>
          <Nom du département Frigana/>
          <Code postal>1200001</Code postal>
          <adresse de rue>Oyada, Adachi-ku, Tokyo</adresse de rue>
          <Adresse Frigana>Tokyo Adachiku Oyata</Adresse Frigana>
          <numéro de téléphone>12-232-1232</numéro de téléphone>
          <Numéro de fax/>
          <adresse électronique>[email protected]</adresse électronique>
        </Informations de contact>
        <Information jointe à la fiche d'inscription de la délégation>
          <numéro de série/>
          <Nom du formulaire d'inscription à la délégation/>
          <Nom du fichier du bordereau d'enregistrement de la délégation/>
        </Fiche d'inscription de la délégation en pièce jointe>
      </Coordonnées du candidat>
    </Information de gestion>
    <Informations d'attribut de document joint>
      <Type de pièce jointe>Attachement</Type de pièce jointe>
      <Nom du document joint>Pièce jointe d'essai 1</Nom du document joint>
      <Nom du fichier du document joint>Pièce jointe.docx</Nom du fichier du document joint>
      <Informations de soumission>1</Informations de soumission>
    </Informations d'attribut de document joint>
    <Informations sur les frais>
      <Frais 1>
        <Identifiant des frais/>
        <Code sujet abrégé/>
        <Nom du sujet abrégé/>
        <Transférer une somme d'argent/>
      </Frais 1>
      <Frais 2>
        <Identifiant des frais/>
        <Code sujet abrégé/>
        <Nom du sujet abrégé/>
        <Transférer une somme d'argent/>
      </Frais 2>
      <Frais 3>
        <Identifiant des frais/>
        <Code sujet abrégé/>
        <Nom du sujet abrégé/>
        <Transférer une somme d'argent/>
      </Frais 3>
      <Frais 4>
        <Identifiant des frais/>
        <Code sujet abrégé/>
        <Nom du sujet abrégé/>
        <Transférer une somme d'argent/>
      </Frais 4>
      <Frais 5>
        <Identifiant des frais/>
        <Code sujet abrégé/>
        <Nom du sujet abrégé/>
        <Transférer une somme d'argent/>
      </Frais 5>
      <Frais 6>
        <Identifiant des frais/>
        <Code sujet abrégé/>
        <Nom du sujet abrégé/>
        <Transférer une somme d'argent/>
      </Frais 6>
    </Informations sur les frais>
    <Colonne de communication/>
    <Information d'enquête du ministère>
      <Enquête ministérielle 1>
        <Étiquette d'information du ministère/>
        <Information d'enquête du ministère/>
      </Enquête ministérielle 1>
      <Enquête ministérielle 2>
        <Étiquette d'information du ministère/>
        <Information d'enquête du ministère/>
      </Enquête ministérielle 2>
      <Enquête ministérielle 3>
        <Étiquette d'information du ministère/>
        <Information d'enquête du ministère/>
      </Enquête ministérielle 3>
      <Enquête ministérielle 4>
        <Étiquette d'information du ministère/>
        <Information d'enquête du ministère/>
      </Enquête ministérielle 4>
      <Enquête ministérielle 5>
        <Étiquette d'information du ministère/>
        <Information d'enquête du ministère/>
      </Enquête ministérielle 5>
      <Enquête ministérielle 6>
        <Étiquette d'information du ministère/>
        <Information d'enquête du ministère/>
      </Enquête ministérielle 6>
      <Enquête ministérielle 7>
        <Étiquette d'information du ministère/>
        <Information d'enquête du ministère/>
      </Enquête ministérielle 7>
      <Enquête ministérielle 8>
        <Étiquette d'information du ministère/>
        <Information d'enquête du ministère/>
      </Enquête ministérielle 8>
      <Enquête ministérielle 9>
        <Étiquette d'information du ministère/>
        <Information d'enquête du ministère/>
      </Enquête ministérielle 9>
      <Enquête ministérielle 10>
        <Étiquette d'information du ministère/>
        <Information d'enquête du ministère/>
      </Enquête ministérielle 10>
    </Information d'enquête du ministère>
    <Informations de soumission>
      <Identifiant de soumission>900API00000000001001001</Identifiant de soumission>
      <Nom de la soumission>Ministère des affaires intérieures et des communications,Bureau d'administration administrative,API</Nom de la soumission>
    </Informations de soumission>
  <Informations sur les attributs du formulaire de demande><ID du formulaire de demande>900A01020000100001</ID du formulaire de demande><Version du formulaire de demande>0003</Version du formulaire de demande>
  <Nom du formulaire de demande>Procédure de test API (procédure relative à l'assurance du travail) (communication) 0001_01</Nom du formulaire de demande><Nom du fichier d'application>900A01020000100001_01.xml</Nom du fichier d'application></Informations sur les attributs du formulaire de demande></Informations de configuration>
</DataRoot>

Créez le formulaire de candidature XML (900A01020000100001_01.xml) comme suit.

900A01020000100001_01.xml


<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="900A01020000100001.xsl" ?>
<DataRoot>
  <ID de formulaire>900A01020000100001</ID de formulaire>
  <Version de style>0003</Version de style>
  <STYLESHEET>900A01020000100001.xsl</STYLESHEET>
  <Informations sur la copie du formulaire>0</Informations sur la copie du formulaire>
  <Doctype>1</Doctype>
  <G00005-A-250045-001_1>
  <Type de formulaire>13101</Type de formulaire>
  <Numéro assuré>
    <Numéro assuré 4 chiffres></Numéro assuré 4 chiffres>
    <Numéro assuré 6 chiffres></Numéro assuré 6 chiffres>
    <Numéro assuré CD></Numéro assuré CD>
  </Numéro assuré>
  <Avoir>1</Avoir>
  <Nom de l'assuré>Épée Ai Taro</Nom de l'assuré>
  <Nom de l'assuré Frigana>Taro API</Nom de l'assuré Frigana>
  <Nom après changement></Nom après changement>
  <Nom après changement Frigana></Nom après changement Frigana>
  <sexe>Homme</sexe>
  <Anniversaire>
    <Année>Showa</Année>
    <Année>59</Année>
    <Mois>5</Mois>
    <journée>23</journée>
  </Anniversaire>
  <Numéro de bureau>
    <Numéro de bureau 4 chiffres>1111</Numéro de bureau 4 chiffres>
    <Numéro de bureau d'affaires 6 chiffres>222222</Numéro de bureau d'affaires 6 chiffres>
    <CD du numéro de bureau>3</CD du numéro de bureau>
  </Numéro de bureau>
  <Date de qualification>
    <Année>Heisei</Année>
    <Année>27</Année>
    <Mois>4</Mois>
    <journée>9</journée>
  </Date de qualification>
  <Cause d'être assuré>1</Cause d'être assuré>
  <salaire>
    <Mode de paiement>1</Mode de paiement>
    <Salaire mensuel>500</Salaire mensuel>
  </salaire>
  <Statut d'emploi>7</Statut d'emploi>
  <Occupation>1</Occupation>
  <Classification du type de personne assurée au moment de l'acquisition/>
  <Pas besoin de vérifier plusieurs numéros/>
  <Fourniture de la durée du contrat>Oui</Fourniture de la durée du contrat>
  <Si la durée du contrat est définie ou non>
    <Il y a une durée de contrat fixe>
      <Début de la période du contrat>
        <Année>Heisei</Année>
        <Année>27</Année>
        <Mois>4</Mois>
        <journée>9</journée>
      </Début de la période du contrat>
      <Fin de période contractuelle>
        <Année>Heisei</Année>
        <Année>28</Année>
        <Mois>3</Mois>
        <journée>31</journée>
      </Fin de période contractuelle>
      <Existence d'une clause de renouvellement de contrat>Oui</Existence d'une clause de renouvellement de contrat>
    </Il y a une durée de contrat fixe>
  </Si la durée du contrat est définie ou non>
  <Heures de travail planifiées par semaine>
    <temps>40</temps>
    <Minutes>0</Minutes>
  </Heures de travail prévues par semaine>
  <Nom du bureau>Examination Co., Ltd.</Nom du bureau>
  <Colonne Remarques_Demandeur>
    <Pays de citoyenneté/>
    <Statut de résidence/>
    <Période de séjour>
      <Année/>
      <Mois/>
      <journée/>
    </Période de séjour>
    <S'il existe ou non une autorisation pour des activités en dehors du statut de qualification/>
    <Dispatch travailleur contractuel/>
    <Remarques/>
  </Colonne Remarques_Demandeur>
  <Propriétaire d'entreprise>
    <adresse de rue>Tokyo</adresse de rue>
    <Nom complet>Propriétaire du test</Nom complet>
    <numéro de téléphone>
      <Indicatif régional>03</Indicatif régional>
      <Code de la ville>3030</Code de la ville>
      <Numéro d'adhérant>3333</Numéro d'adhérant>
    </numéro de téléphone>
  </Propriétaire d'entreprise>
  <Date de notification>
    <Année>Heisei</Année>
    <Année>27</Année>
    <Mois>4</Mois>
    <journée>1</journée>
  </Date de notification>
  <adresse>Shinagawa</adresse>
  <Colonne de saisie des travailleurs de l'assurance sociale>
    <Date de création>
      <Année>Heisei</Année>
      <Année></Année>
      <Mois></Mois>
      <journée></journée>
    </Date de création>
    <Agent de soumission Affichage de l'agent administratif></Agent de soumission Affichage de l'agent administratif>
    <Nom complet></Nom complet>
    <numéro de téléphone>
      <Indicatif régional></Indicatif régional>
      <Code de la ville></Code de la ville>
      <Numéro d'adhérant></Numéro d'adhérant>
    </numéro de téléphone>
    <Colonne supplémentaire></Colonne supplémentaire>
  </Colonne de saisie des travailleurs de l'assurance sociale>
  <Colonne Remarques_Personnel>
    <Remarques></Remarques>
    <Date de notification de confirmation>
      <Année>Heisei</Année>
      <Année></Année>
      <Mois></Mois>
      <journée></journée>
    </Date de notification de confirmation>
  </Colonne Remarques_Personnel>
  <Xmit>0</Xmit>
</G00005-A-250045-001_1>
</DataRoot>

Si vous respectez les restrictions quant à savoir si des données peuvent être omises dans chaque balise, le nombre de caractères, le type de caractère, etc., le contrôle de format etc. passera sans problème. Puisqu'il s'agit de données de test, le contenu fictif convient.

4.2 Format de signature de fichier individuel

L'identifiant de procédure "950A102200039000" est repris comme donnée de test. Cette procédure est la suivante: «Notification d'acquisition de la qualification d'assuré national de pension / changement de type / confirmation de type (personne assurée n ° 3 applicable) / demande électronique». Aucun document joint n'est requis et des documents officiels seront délivrés.

Les fichiers requis sont les suivants.

No catégorie de fichier Nom de fichier Remarques
1 Gestion de la configuration XML kousei.xml
2 Formulaire de candidature XML ① 950A10220003900001_01.xml ID de formulaire (18 caractères alphanumériques demi-largeur) + "_01 "fixe
3 Informations de configuration XML pour le formulaire de candidature ① kousei20200716142110000.xml ‘kousei’+ yyyyMMddHHmmssSSS
4 Formulaire de candidature XML② 950A10220003900002_01.xml
5 Informations de configuration XML pour le formulaire de candidature ② kousei20200716142115000.xml

"AAaaMMjjHHmmssSSS" dans les informations de configuration XML du formulaire de candidature correspond à la date et à l'heure de création (en centièmes de seconde) du fichier ajouté pour rendre le nom de fichier unique dans le dossier du dossier de candidature. Ceci est également décrit dans le document public "External Linkage API Application Data Specification Common Data Specification".

Ces fichiers ont la hiérarchie suivante.

Hiérarchie des fichiers


kousei.xml
      ├ 950A10220003900001_01.xml
      ├ kousei20200716142110000.xml
      ├ 950A10220003900002_01.xml
      └ kousei20200716142115000.xml

Le contenu spécifique de xml sera omis.

5. À propos des outils de conversion de données

À l'avenir, lors de la création des données de test et de la vérification de l'opération, Outil de conversion de données sera utilisé. Avec cet outil, vous pouvez calculer les valeurs de hachage, encoder ou décoder au format Base64 et générer les résultats encodés ou décodés dans un fichier. Utilisez l'outil dans les cas suivants.

--Vérifiez la valeur de hachage calculée par le pilote de génération xml signé --Encode l'ensemble de données d'application au format Zip au format Base64 pour créer des données d'application

6. Créer un pilote de génération xml signé

Cette fois, nous allons créer un pilote de génération xml signé pour l'enregistrement / l'authentification des utilisateurs et l'application par lots. Dans l'application batch, les fichiers à signer diffèrent entre le format standard et le format de signature de fichier individuel, créez donc un pilote correspondant à chacun.

6.1 Enregistrement / authentification de l'utilisateur

Dans le cas de l'inscription / authentification de l'utilisateur, la valeur de hachage est calculée pour la plage entourée par la balise \ de kousei.xml et la valeur de hachage est signée sans utiliser le modèle xml. C'est le point.

Avant d'exécuter l'outil, il est nécessaire de définir l'ID utilisateur spécifié dans l'application d'utilisation de l'environnement de vérification e-Gov dans la variable d'environnement "EGOV_USER_ID".

Le pilote de génération xml signé est:

make_register_xml.rb


require 'kiji'

egov_env = {
  "KEY" => File.expand_path("./Certificat/e-GovEE01_sha2.pfx"),
  "KEY_PASSWORD" => "gpkitest",
}

user_id = ENV["EGOV_USER_ID"]

pkcs12 = OpenSSL::PKCS12.new(File.open(egov_env["KEY"], "rb"),egov_env["KEY_PASSWORD"])

#Définir l'ID utilisateur
appl_data = Nokogiri::XML::Builder.new do |xml|
  xml.DataRoot {
    xml.ApplData(Id: 'ApplData') {
      xml.UserID user_id
    }
  }
end

doc = appl_data.to_xml(save_with:  0)

signer = Kiji::Signer.new(doc) do |s|
  s.cert = pkcs12.certificate
  s.private_key = pkcs12.key
  s.digest_algorithm           = :sha256
  s.signature_digest_algorithm = :sha256
end

signer.security_node = signer.document.root

#Calculer la valeur de résumé
signer.document.xpath('/DataRoot/ApplData').each do |node|
  signer.digest!(node, id: '#ApplData')
end

#Signe
signer.sign!(issuer_serial: true)

#Ecrire en xml
File.write("register.xml", signer.to_xml)

6.2 Application en masse

(1) Format standard

Dans le format standard, le fait est que le XML de gestion de la configuration devient un XML signé. Suivez les étapes ci-dessous pour signer.

  1. Créez une instance de fermeture éclair
  2. Créez un XML de gestion de configuration signé en passant le XML de gestion de configuration au premier argument (destination de sortie de signature) de la fermeture à glissière et le chemin du fichier du formulaire de demande XML (+ fichier joint) au deuxième argument (cible de signature).
  3. Consolider le XML de gestion de la configuration signée et le XML d'application (+ fichier joint) dans un fichier au format zip
  4. S'il y a plusieurs procédures, répétez 2 pour chaque procédure, puis effectuez 3 à la fin.

Le pilote à créer est make_zip_file_standard_format.rb. En ce qui concerne l'entrée / sortie du pilote, il y a ./zip_data/standard/ dans le dossier où se trouve le pilote, et il y a des dossiers d'entrée et de sortie en dessous.

Dans le dossier in, il y a un dossier 900A010200001000 (1) et les 3 fichiers suivants. · C'est la raison. xml ・ 900A01020000100001_01.xml ・ Fichier joint .docx

Pour le fichier de certificat, créez un dossier de certificat directement sous le dossier où se trouve le pilote et placez-y e-GovEE01_sha2.pfx.

Avant d'exécuter le pilote, le dossier de sortie est vide. Lorsque vous exécutez le pilote, un dossier 900A010200001000 (1), apply_data.zip sera créé. Le dossier 900A010200001000 (1) contient les mêmes fichiers que le dossier in, et kousei.xml est ici un xml signé. À propos de apply_data.zip, il s'agit d'un format zip du dossier 900A010200001000 (1).

Encodez apply_data.zip au format Base64 à l'aide de l'outil de conversion de données (https://hogehoge.tk/tool/). Insérez le résultat du codage dans la balise \ de apply_data.xml pour compléter les données d'application qui peuvent être envoyées à e-Gov.

apply_data_xml.png

Après avoir exécuté le pilote, l'environnement d'exécution sera dans l'état suivant.

Mise en page de format standard


Environnement d'exécution/ 
     ├ make_zip_file_standard_format.rb
├ Certificat/
     │    └ e-GovEE01_sha2.pfx
     └ zip_data/
             └ standard/
                     ├ in/
                     │  └ 900A010200001000(1)/
                     │              ├ kousei.xml
                     │              ├ 900A01020000100001_01.xml
│ └ Fichier joint.docx
                     └ out/
                         ├ 900A010200001000(1)/
                         │          ├ kousei.xml
                         │          ├ 900A01020000100001_01.xml
│ └ Fichier joint.docx
                         └ apply_data.zip

Le pilote de génération xml signé est:

make_zip_file_standard_format.rb


require 'fileutils'
require 'zip'
require "cgi"
require 'date' 
require 'kiji'

#Fichier de signature, mot de passe
Key = "./Certificat/e-GovEE01_sha2.pfx"
password = "gpkitest"

#Définir le chemin de destination d'entrée / sortie
input_base_path = "./zip_data/standard/in/"
output_base_path = "./zip_data/standard/out/"

#Définir le chemin du fichier pour les données d'entrée / sortie
Procedure = Struct.new(:folder, :kousei_xml, :application_xml, :attachment_file)
proc = Procedure.new("900A010200001000(1)","kousei.xml","900A01020000100001_01.xml","Pièce jointe.docx")

input_path = "#{input_base_path}/#{proc.folder}"
output_path = "#{output_base_path}/#{proc.folder}"

signed_xml_path = "#{input_path}/#{proc.kousei_xml}"
style_file_path = "#{input_path}/#{proc.application_xml}"
attachment_file_path = "#{input_path}/#{proc.attachment_file}"
app_files_path = ["#{style_file_path}", "#{attachment_file_path}"]

#Supprimez le dossier, le fichier, etc. de destination de sortie.
Dir.glob("#{output_base_path}/*") do |f|
  FileUtils.rm_r(f)
end

#Génération Zipper
pkcs12 = OpenSSL::PKCS12.new(File.open(Key, "rb"),password)
zipper = Kiji::Zipper.new() do |s|
  s.cert = pkcs12.certificate
  s.private_key = pkcs12.key
end

#Signe
signer = zipper.sign(signed_xml_path, app_files_path)

#Créer un dossier d'application
FileUtils.mkdir_p(output_path)

#Exporter le XML signé
File.write("#{output_path}/#{proc.kousei_xml}", signer.to_xml)

#Copier le XML d'application et les fichiers joints
app_files_path.each do |f|
  FileUtils.cp(f, output_path)
end

#Combinez le dossier de sortie dans un zip
zipper.write_zip(output_base_path, "#{output_base_path}/apply_data.zip")

(2) Format de signature de fichier individuel

Dans le format de signature de fichier individuel, le fait est que «informations de configuration XML pour l'application ①» et «informations de configuration XML pour l'application ②» sont chacune signées xml (kousei.xml n'est pas signé xml). .. Suivez les étapes ci-dessous pour signer.

  1. Créez une instance de fermeture éclair
  2. Passez le chemin du fichier "Application form (1) configuration information XML" au premier argument (destination de sortie de signature) de la fermeture à glissière et "application form (2) XML" au second argument (signature target) et "configuration information for application form (1)". Donner une signature à "XML"
  3. Passez le chemin du fichier "formulaire de demande (2) XML" au premier argument (destination de sortie de signature) de la fermeture à glissière et "application (2) XML" au deuxième argument (cible de signature) et "informations de configuration pour l'application (2)". Donner une signature à "XML"
  4. Configurer le XML de gestion de la configuration, les informations de configuration XML pour l'application ①, l'application ①XML, les informations de configuration XML pour l'application ②, l'application ②XML dans un fichier au format zip
  5. S'il y a plusieurs procédures, répétez les étapes 2 et 3 pour chaque procédure et enfin faites 4.

Le pilote à créer est make_zip_file_individual_signature_format.rb. En ce qui concerne l'entrée / la sortie du pilote, il y a ./zip_data/indivisual/ dans le dossier où se trouve le pilote, et il y a des dossiers d'entrée et de sortie en dessous. Dans le dossier in, il y a un dossier 950A102200039000 (1) et les 5 fichiers suivants. ・ Kousei.xml // Gestion de la configuration XML ・ 950A10220003900001_01.xml // Formulaire de candidature XML ① ・ Kousei20200716142110000.xml // Informations de configuration XML pour l'application XML ① ・ 950A10220003900002_01.xml // Formulaire de candidature XML② ・ Kousei20200716142115000.xml // Informations de configuration XML pour l'application XML②

Pour le fichier de certificat, créez un dossier de certificat directement sous le dossier où se trouve le pilote et placez-y e-GovEE01_sha2.pfx.

Avant d'exécuter le pilote, le dossier de sortie est vide. L'exécution du pilote créera un dossier 950A102200039000 (1), apply_data.zip. Le dossier 950A102200039000 (1) contient les mêmes fichiers que le dossier in. Cependant, kousei20200716142110000.xml et kousei20200716142115000.xml sont ici signés xml. À propos de apply_data.zip, il s'agit d'un format zip du dossier 950A102200039000 (1).

Encodez apply_data.zip au format Base64 à l'aide de l'outil de conversion de données (https://hogehoge.tk/tool/). Insérez le résultat du codage dans la balise \ de apply_data.xml pour compléter les données d'application qui peuvent être envoyées à e-Gov. Le format de apply_data.xml est le même que le format standard.

Après avoir exécuté le pilote, l'environnement d'exécution sera dans l'état suivant.

Configuration de la mise en page du format de signature de fichier individuel


Environnement d'exécution/
     ├ make_zip_file_individual_signature_format.rb
├ Certificat/
     │    └ e-GovEE01_sha2.pfx
     └ zip_data/
             └ indivisual/
                    ├ in/
                    │  └ 950A102200039000(1)/
                    │            ├ kousei.xml
                    │            ├ 950A10220003900001_01.xml
                    │            ├ kousei20200716142110000.xml
                    │            ├ 950A10220003900002_01.xml
                    │            └ kousei20200716142115000.xml
                    └ out/
                       ├ 950A102200039000(1)/
                       │         ├ kousei.xml
                       │         ├ 950A10220003900001_01.xml
                       │         ├ kousei20200716142110000.xml
                       │         ├ 950A10220003900002_01.xml
                       │         └ kousei20200716142115000.xml
                       └ apply_data.zip

Le pilote de génération xml signé est:

make_zip_file_individual_signature_format.rb


require 'fileutils'
require 'zip'
require "cgi"
require 'date' 
require 'kiji'

#Définir le fichier de signature et le mot de passe
Key = "./Certificat/e-GovEE01_sha2.pfx"
password = "gpkitest"

#Définir le chemin de destination d'entrée / sortie
input_base_path = "./zip_data/indivisual/in/"
output_base_path = "./zip_data/indivisual/out/"

#Supprimez le dossier, le fichier, etc. de destination de sortie.
Dir.glob("#{output_base_path}/*") do |f|
  FileUtils.rm_r(f)
end

#Définir le chemin du fichier pour les données d'entrée / sortie
Procedure = Struct.new(:folder, :kousei_xml, 
                       :config_info_appl_xml, :application_xml, 
                       :config_info_appl_xml_2, :application_xml_2)
proc = Procedure.new("950A102200039000(1)","kousei.xml",
                     "kousei20200716142110000.xml","950A10220003900001_01.xml",
                     "kousei20200716142115000.xml","950A10220003900002_01.xml")

input_path = "#{input_base_path}/#{proc.folder}"
output_path = "#{output_base_path}/#{proc.folder}"

#Créer un dossier d'application
FileUtils.mkdir_p(output_path)

#Génération Zipper
pkcs12 = OpenSSL::PKCS12.new(File.open(Key, "rb"),password)
zipper = Kiji::Zipper.new() do |s|
  s.cert = pkcs12.certificate
  s.private_key = pkcs12.key
end

#Signez le XML des informations de configuration pour l'application 1
signed_xml_path = "#{input_path}/#{proc.config_info_appl_xml}"
style_file_path = ["#{input_path}/#{proc.application_xml}"]
signer = zipper.sign(signed_xml_path, style_file_path)

#Exporter le XML signé
File.write("#{output_path}/#{proc.config_info_appl_xml}", signer.to_xml)

#Signez le XML des informations de configuration pour le formulaire de candidature 2
signed_xml_path_2 = "#{input_path}/#{proc.config_info_appl_xml_2}"
style_file_path_2 = ["#{input_path}/#{proc.application_xml_2}"]
signer = zipper.sign(signed_xml_path_2, style_file_path_2)

#Exporter le XML signé
File.write("#{output_path}/#{proc.config_info_appl_xml_2}", signer.to_xml)

#Répertorier le XML d'application et les fichiers joints à copier
copy_files_path = ["#{input_path}/#{proc.kousei_xml}", style_file_path, style_file_path_2]

#Copier le XML d'application et les fichiers joints
copy_files_path.each do |f|
  FileUtils.cp(f, output_path)
end

#Compressez la liste de sortie
zipper.write_zip(output_base_path, output_base_path + "apply_data.zip")

Recommended Posts

La 3e bibliothèque SmartHR kiji est utilisée pour exécuter e-Gov (construction de l'environnement d'exécution)
Partie 1 Exécutez e-Gov à l'aide de la bibliothèque SmartHR kiji (spécifications e-Gov)
La 2ème bibliothèque SmartHR kiji est utilisée pour exécuter e-Gov (matériel public e-Gov)
La 2ème bibliothèque SmartHR kiji est utilisée pour exécuter e-Gov (matériel public e-Gov)
Partie 1 Exécutez e-Gov à l'aide de la bibliothèque SmartHR kiji (spécifications e-Gov)
La 3e bibliothèque SmartHR kiji est utilisée pour exécuter e-Gov (construction de l'environnement d'exécution)
pynq-z1 De l'achat au contrôle de fonctionnement
Tokenize à l'aide de la bibliothèque Hugging Face
Utilisation de Chainer avec CentOS7 [Construction de l'environnement]
Construction de l'environnement Python3.6 (à l'aide de l'environnement Win Anaconda)
Notifier à l'aide du Centre de notifications lorsque l'environnement d'exécution est macOS en Python